public void MergeComponentsTest() { var sbom1 = new Bom { Components = new List <Component> { new Component { Name = "Component1", Version = "1" } } }; var sbom2 = new Bom { Components = new List <Component> { new Component { Name = "Component2", Version = "1" } } }; var result = CycloneDXUtils.Merge(sbom1, sbom2); Assert.Equal(2, result.Components.Count); }
public void MergeToolsTest() { var sbom1 = new Bom { Metadata = new Metadata { Tools = new List <Tool> { new Tool { Name = "Tool1", Version = "1" } } } }; var sbom2 = new Bom { Metadata = new Metadata { Tools = new List <Tool> { new Tool { Name = "Tool2", Version = "1" } } } }; var result = CycloneDXUtils.Merge(sbom1, sbom2); Assert.Equal(2, result.Metadata.Tools.Count); }
public static async Task <int> Merge(MergeCommandOptions options) { Contract.Requires(options != null); var outputToConsole = string.IsNullOrEmpty(options.OutputFile); var outputFormat = options.OutputFormat; if (outputFormat == StandardInputOutputSbomFormat.autodetect) { if (options.OutputFile != null && options.OutputFile.EndsWith(".json", StringComparison.InvariantCulture)) { outputFormat = StandardInputOutputSbomFormat.json; } else if (options.OutputFile != null && options.OutputFile.EndsWith(".xml", StringComparison.InvariantCulture)) { outputFormat = StandardInputOutputSbomFormat.xml; } else { Console.WriteLine($"Unable to auto-detect output format"); return((int)ExitCode.ParameterValidationError); } } var outputBom = new Bom(); foreach (var inputFilename in options.InputFiles) { if (!outputToConsole) { Console.WriteLine($"Processing input file {inputFilename}"); } var inputFormat = options.InputFormat; if (inputFormat == StandardInputOutputSbomFormat.autodetect) { if (inputFilename.EndsWith(".json", StringComparison.InvariantCulture)) { inputFormat = StandardInputOutputSbomFormat.json; } else if (inputFilename.EndsWith(".xml", StringComparison.InvariantCulture)) { inputFormat = StandardInputOutputSbomFormat.xml; } else { Console.WriteLine($"Unable to auto-detect format of {inputFilename}"); return((int)ExitCode.ParameterValidationError); } } var bomContents = await File.ReadAllTextAsync(inputFilename); Bom inputBom; if (inputFormat == StandardInputOutputSbomFormat.json) { inputBom = Json.Deserializer.Deserialize(bomContents); } else { inputBom = Xml.Deserializer.Deserialize(bomContents); } outputBom = CycloneDXUtils.Merge(outputBom, inputBom); if (inputBom.Components != null && !outputToConsole) { Console.WriteLine($" Contains {inputBom.Components.Count} components"); } } string outputBomString; if (outputFormat == StandardInputOutputSbomFormat.json) { outputBomString = Json.Serializer.Serialize(outputBom); } else { outputBomString = Xml.Serializer.Serialize(outputBom); } if (outputToConsole) { Console.WriteLine(outputBomString); } else { Console.WriteLine("Writing output file..."); Console.WriteLine($" Total {outputBom.Components.Count} components"); await File.WriteAllTextAsync(options.OutputFile, outputBomString); } return((int)ExitCode.Ok); }