예제 #1
0
        private static void MergeOptionsToConfig(MergeCommandOptions options, ref MergeJsonConfig config)
        {
            // base directory for content from command line is current directory
            // e.g. C:\folder1>docfx build folder2\docfx.json --content "*.cs"
            // for `--content "*.cs*`, base directory should be `C:\folder1`
            string optionsBaseDirectory = Environment.CurrentDirectory;

            config.OutputFolder = options.OutputFolder;

            if (!string.IsNullOrEmpty(options.OutputFolder))
            {
                config.Destination = Path.GetFullPath(Path.Combine(options.OutputFolder, config.Destination ?? string.Empty));
            }
            if (options.Content != null)
            {
                if (config.Content == null)
                {
                    config.Content = new FileMapping(new FileMappingItem());
                }
                config.Content.Add(
                    new FileMappingItem
                {
                    Files        = new FileItems(options.Content),
                    SourceFolder = optionsBaseDirectory
                });
            }
            config.FileMetadata   = BuildCommand.GetFileMetadataFromOption(config.FileMetadata, options.FileMetadataFilePath, null);
            config.GlobalMetadata = BuildCommand.GetGlobalMetadataFromOption(config.GlobalMetadata, options.GlobalMetadataFilePath, null, options.GlobalMetadata);
        }
예제 #2
0
        private static MergeJsonConfig ParseOptions(MergeCommandOptions options)
        {
            var             configFile = options.ConfigFile;
            MergeJsonConfig config;

            if (string.IsNullOrEmpty(configFile))
            {
                if (!File.Exists(DocAsCode.Constants.ConfigFileName))
                {
                    if (options.Content == null)
                    {
                        throw new ArgumentException("Either provide config file or specify content files to start building documentation.");
                    }
                    else
                    {
                        config = new MergeJsonConfig();
                        var item = new MergeJsonItemConfig();
                        MergeOptionsToConfig(options, ref item);
                        config.Add(item);
                        return(config);
                    }
                }
                else
                {
                    Logger.Log(LogLevel.Verbose, $"Config file {DocAsCode.Constants.ConfigFileName} is found.");
                    configFile = DocAsCode.Constants.ConfigFileName;
                }
            }

            config = CommandUtility.GetConfig <MergeConfig>(configFile).Item;
            if (config == null)
            {
                var message = $"Unable to find build subcommand config in file '{configFile}'.";
                Logger.LogError(message, code: ErrorCodes.Config.BuildConfigNotFound);
                throw new DocumentException(message);
            }

            for (int i = 0; i < config.Count; i++)
            {
                var round = config[i];
                round.BaseDirectory = Path.GetDirectoryName(configFile);

                MergeOptionsToConfig(options, ref round);
            }

            return(config);
        }
예제 #3
0
        private static MergeJsonConfig ParseOptions(MergeCommandOptions options)
        {
            var             configFile = options.ConfigFile;
            MergeJsonConfig config;

            if (string.IsNullOrEmpty(configFile))
            {
                if (!File.Exists(DocAsCode.Constants.ConfigFileName))
                {
                    if (options.Content == null)
                    {
                        throw new ArgumentException("Either provide config file or specify content files to start building documentation.");
                    }
                    else
                    {
                        config = new MergeJsonConfig();
                        MergeOptionsToConfig(options, ref config);
                        return(config);
                    }
                }
                else
                {
                    Logger.Log(LogLevel.Verbose, $"Config file {DocAsCode.Constants.ConfigFileName} is found.");
                    configFile = DocAsCode.Constants.ConfigFileName;
                }
            }

            config = CommandUtility.GetConfig <MergeConfig>(configFile).Item;
            if (config == null)
            {
                throw new DocumentException($"Unable to find build subcommand config in file '{configFile}'.");
            }
            config.BaseDirectory = Path.GetDirectoryName(configFile);

            MergeOptionsToConfig(options, ref config);

            return(config);
        }
예제 #4
0
 public MergeCommand(MergeCommandOptions options)
 {
     Config = ParseOptions(options);
 }
예제 #5
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);
        }
예제 #6
0
        private static Dictionary <string, object> GetGlobalMetadataFromOption(MergeCommandOptions options)
        {
            Dictionary <string, object> globalMetadata = null;

            if (options.GlobalMetadata != null)
            {
                using (var sr = new StringReader(options.GlobalMetadata))
                {
                    try
                    {
                        globalMetadata = JsonUtility.Deserialize <Dictionary <string, object> >(sr, GetSerializer());
                        if (globalMetadata != null && globalMetadata.Count > 0)
                        {
                            Logger.LogInfo($"Global metadata from \"--globalMetadata\" overrides the one defined in config file");
                        }
                    }
                    catch (JsonException e)
                    {
                        Logger.LogWarning($"Metadata from \"--globalMetadata {options.GlobalMetadata}\" is not a valid JSON format global metadata, ignored: {e.Message}");
                    }
                }
            }

            if (options.GlobalMetadataFilePath != null)
            {
                try
                {
                    var globalMetadataFromFile = JsonUtility.Deserialize <MergeJsonConfig>(options.GlobalMetadataFilePath).GlobalMetadata;
                    if (globalMetadataFromFile == null)
                    {
                        Logger.LogWarning($" File from \"--globalMetadataFile {options.GlobalMetadataFilePath}\" does not contain \"globalMetadata\" definition.");
                    }
                    else
                    {
                        if (globalMetadata == null)
                        {
                            globalMetadata = globalMetadataFromFile;
                        }
                        else
                        {
                            foreach (var pair in globalMetadataFromFile)
                            {
                                if (globalMetadata.ContainsKey(pair.Key))
                                {
                                    Logger.LogWarning($"Both --globalMetadata and --globalMetadataFile contain definition for \"{pair.Key}\", the one from \"--globalMetadata\" overrides the one from \"--globalMetadataFile {options.GlobalMetadataFilePath}\".");
                                }
                                else
                                {
                                    globalMetadata[pair.Key] = pair.Value;
                                }
                            }
                        }
                    }
                }
                catch (FileNotFoundException)
                {
                    Logger.LogWarning($"Invalid option \"--globalMetadataFile {options.GlobalMetadataFilePath}\": file does not exist, ignored.");
                }
                catch (JsonException e)
                {
                    Logger.LogWarning($"File from \"--globalMetadataFile {options.GlobalMetadataFilePath}\" is not a valid JSON format global metadata, ignored: {e.Message}");
                }
            }

            if (globalMetadata?.Count > 0)
            {
                return(globalMetadata);
            }
            return(null);
        }