Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }