diff --git a/src/docfx/Models/BuildCommand.cs b/src/docfx/Models/BuildCommand.cs index b3792858941..dce4fa8d58a 100644 --- a/src/docfx/Models/BuildCommand.cs +++ b/src/docfx/Models/BuildCommand.cs @@ -13,22 +13,15 @@ public override int Execute(CommandContext context, BuildCommandOptions settings { return CommandHelper.Run(settings, () => { - var config = ParseOptions(settings, out var baseDirectory, out var outputFolder); - var serveDirectory = RunBuild.Exec(config, new(), baseDirectory, outputFolder); + var (config, baseDirectory) = CommandHelper.GetConfig(settings.ConfigFile); + MergeOptionsToConfig(settings, config.Item, baseDirectory); + var serveDirectory = RunBuild.Exec(config.Item, new(), baseDirectory, settings.OutputFolder); if (settings.Serve) RunServe.Exec(serveDirectory, settings.Host, settings.Port); }); } - private static BuildJsonConfig ParseOptions(BuildCommandOptions options, out string baseDirectory, out string outputFolder) - { - (var config, baseDirectory) = CommandHelper.GetConfig(options.ConfigFile); - outputFolder = options.OutputFolder; - MergeOptionsToConfig(options, config.Item, baseDirectory); - return config.Item; - } - internal static void MergeOptionsToConfig(BuildCommandOptions options, BuildJsonConfig config, string configDirectory) { // base directory for content from command line is current directory diff --git a/src/docfx/Models/DefaultCommand.cs b/src/docfx/Models/DefaultCommand.cs index e8fcb703a94..4e4609785a9 100644 --- a/src/docfx/Models/DefaultCommand.cs +++ b/src/docfx/Models/DefaultCommand.cs @@ -12,31 +12,11 @@ namespace Microsoft.DocAsCode; class DefaultCommand : Command { [Description("Runs metadata, build and pdf commands")] - internal class Options : LogOptions + internal class Options : BuildCommandOptions { [Description("Prints version information")] [CommandOption("-v|--version")] public bool Version { get;set; } - - [Description("Specify the output base directory")] - [CommandOption("-o|--output")] - public string OutputFolder { get; set; } - - [Description("Host the generated documentation to a website")] - [CommandOption("-s|--serve")] - public bool Serve { get; set; } - - [Description("Specify the hostname of the hosted website [localhost]")] - [CommandOption("-n|--hostname")] - public string Host { get; set; } - - [Description("Specify the port of the hosted website [8080]")] - [CommandOption("-p|--port")] - public int? Port { get; set; } - - [Description("Path to docfx.json")] - [CommandArgument(0, "[config]")] - public string Config { get; set; } } public override int Execute(CommandContext context, Options options) @@ -49,18 +29,29 @@ public override int Execute(CommandContext context, Options options) return CommandHelper.Run(options, () => { - var (config, baseDirectory) = CommandHelper.GetConfig(options.Config); + var (config, baseDirectory) = CommandHelper.GetConfig(options.ConfigFile); var outputFolder = options.OutputFolder; string serveDirectory = null; if (config.Metadata is not null) DotnetApiCatalog.Exec(config.Metadata, new(), baseDirectory, outputFolder).GetAwaiter().GetResult(); + if (config.Build is not null) + { + BuildCommand.MergeOptionsToConfig(options, config.Build, baseDirectory); serveDirectory = RunBuild.Exec(config.Build, new(), baseDirectory, outputFolder); + } + if (config.Pdf is not null) + { + BuildCommand.MergeOptionsToConfig(options, config.Pdf, baseDirectory); RunPdf.Exec(config.Pdf, new(), baseDirectory, outputFolder); + } + if (options.Serve && serveDirectory is not null) + { RunServe.Exec(serveDirectory, options.Host, options.Port); + } }); } diff --git a/src/docfx/Models/PdfCommand.cs b/src/docfx/Models/PdfCommand.cs index a3d10aeb9e8..37af32e829e 100644 --- a/src/docfx/Models/PdfCommand.cs +++ b/src/docfx/Models/PdfCommand.cs @@ -13,19 +13,12 @@ public override int Execute([NotNull] CommandContext context, [NotNull] PdfComma { return CommandHelper.Run(options, () => { - var Config = ParseOptions(options, out var BaseDirectory, out var OutputFolder); - RunPdf.Exec(Config, new(), BaseDirectory, OutputFolder); + var (config, baseDirectory) = CommandHelper.GetConfig(options.ConfigFile); + MergeOptionsToConfig(options, config.Item, baseDirectory); + RunPdf.Exec(config.Item, new(), baseDirectory, options.OutputFolder); }); } - private static PdfJsonConfig ParseOptions(PdfCommandOptions options, out string baseDirectory, out string outputFolder) - { - (var config, baseDirectory) = CommandHelper.GetConfig(options.ConfigFile); - outputFolder = options.OutputFolder; - MergeOptionsToConfig(options, config.Item, baseDirectory); - return config.Item; - } - private static void MergeOptionsToConfig(PdfCommandOptions options, PdfJsonConfig config, string configDirectory) { BuildCommand.MergeOptionsToConfig(options, config, configDirectory); diff --git a/src/docfx/Models/ServeCommand.cs b/src/docfx/Models/ServeCommand.cs index dda2c14a7d3..0031763d57a 100644 --- a/src/docfx/Models/ServeCommand.cs +++ b/src/docfx/Models/ServeCommand.cs @@ -16,11 +16,11 @@ internal class Settings : CommandSettings [CommandArgument(0, "[directory]")] public string Folder { get; set; } - [Description("Specify the hostname of the hosted website [localhost]")] + [Description("Specify the hostname of the hosted website")] [CommandOption("-n|--hostname")] public string Host { get; set; } - [Description("Specify the port of the hosted website [8080]")] + [Description("Specify the port of the hosted website")] [CommandOption("-p|--port")] public int? Port { get; set; } } diff --git a/test/docfx.Tests/CommandLineTest.cs b/test/docfx.Tests/CommandLineTest.cs new file mode 100644 index 00000000000..9ba74f0f3e8 --- /dev/null +++ b/test/docfx.Tests/CommandLineTest.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Xunit; + +namespace Microsoft.DocAsCode.Tests; + +public static class CommandLineTest +{ + [Fact] + public static void PrintsVersion() + { + Assert.Equal(0, Program.Main(new[] { "-v" })); + Assert.Equal(0, Program.Main(new[] { "--version" })); + } + + [Fact] + public static void PrintsHelp() + { + Assert.Equal(0, Program.Main(new[] { "-h" })); + Assert.Equal(0, Program.Main(new[] { "--help" })); + Assert.Equal(0, Program.Main(new[] { "build", "--help" })); + Assert.Equal(0, Program.Main(new[] { "serve", "--help" })); + Assert.Equal(0, Program.Main(new[] { "metadata", "--help" })); + Assert.Equal(0, Program.Main(new[] { "pdf", "--help" })); + Assert.Equal(0, Program.Main(new[] { "init", "--help" })); + Assert.Equal(0, Program.Main(new[] { "download", "--help" })); + Assert.Equal(0, Program.Main(new[] { "merge", "--help" })); + Assert.Equal(0, Program.Main(new[] { "template", "--help" })); + } + + [Fact] + public static void FailForUnknownArgs() + { + Assert.Equal(-1, Program.Main(new[] { "--unknown" })); + } +}