diff --git a/src/Cli/dotnet/CommonOptions.cs b/src/Cli/dotnet/CommonOptions.cs index 4816872b8e59..133964a095f7 100644 --- a/src/Cli/dotnet/CommonOptions.cs +++ b/src/Cli/dotnet/CommonOptions.cs @@ -4,6 +4,7 @@ using System.Collections.ObjectModel; using System.CommandLine; using System.CommandLine.Completions; +using System.CommandLine.Invocation; using System.CommandLine.Parsing; using System.CommandLine.StaticCompletions; using Microsoft.DotNet.Cli.CommandLine; @@ -140,34 +141,46 @@ public static string[] SplitMSBuildValues(string? defaultValue, ArgumentResult a return allValues.Distinct(StringComparer.OrdinalIgnoreCase).ToArray(); } - public static Option VerbosityOption(VerbosityOptions defaultVerbosity) => - new Option("--verbosity", "-v") + public static Option VerbosityOption(VerbosityOptions defaultVerbosity) + { + var option = new Option("--verbosity", "-v") { Description = CliStrings.VerbosityOptionDescription, HelpName = CliStrings.LevelArgumentName, DefaultValueFactory = _ => defaultVerbosity - } - .ForwardAsSingle(o => $"--verbosity:{o}") - .AggregateRepeatedTokens(); + }; + option.Action = new ApplyVerbosityAction(option); + return option.ForwardAsSingle(o => $"--verbosity:{o}") + .AggregateRepeatedTokens(); + } - public static Option VerbosityOption() => - new Option("--verbosity", "-v", "--v", "-verbosity", "/v", "/verbosity") + public static Option VerbosityOption() + { + var option = new Option("--verbosity", "-v", "--v", "-verbosity", "/v", "/verbosity") { Description = CliStrings.VerbosityOptionDescription, HelpName = CliStrings.LevelArgumentName - } - .ForwardAsSingle(o => $"--verbosity:{o}") - .AggregateRepeatedTokens(); + }; + option.Action = new ApplyVerbosityAction(option); + return option.ForwardAsSingle(o => $"--verbosity:{o}") + .AggregateRepeatedTokens(); + } - public static Option HiddenVerbosityOption = - new Option("--verbosity", "-v", "--v", "-verbosity", "/v", "/verbosity") + public static Option HiddenVerbosityOption + { + get { - Description = CliStrings.VerbosityOptionDescription, - HelpName = CliStrings.LevelArgumentName, - Hidden = true + var option = new Option("--verbosity", "-v", "--v", "-verbosity", "/v", "/verbosity") + { + Description = CliStrings.VerbosityOptionDescription, + HelpName = CliStrings.LevelArgumentName, + Hidden = true + }; + option.Action = new ApplyVerbosityAction(option); + return option.ForwardAsSingle(o => $"--verbosity:{o}") + .AggregateRepeatedTokens(); } - .ForwardAsSingle(o => $"--verbosity:{o}") - .AggregateRepeatedTokens(); + } public static Option FrameworkOption(string description) => new Option("--framework", "-f") @@ -493,6 +506,39 @@ public static string GetCurrentRuntimeId() private static string GetOsFromRid(string rid) => rid.Substring(0, rid.LastIndexOf("-", StringComparison.InvariantCulture)); private static string GetArchFromRid(string rid) => rid.Substring(rid.LastIndexOf("-", StringComparison.InvariantCulture) + 1, rid.Length - rid.LastIndexOf("-", StringComparison.InvariantCulture) - 1); + + /// + /// Action that sets DOTNET_CLI_CONTEXT_VERBOSE environment variable when verbosity is diagnostic. + /// + private class ApplyVerbosityAction : SynchronousCommandLineAction + { + private readonly Option _verbosityOption; + + public ApplyVerbosityAction(Option verbosityOption) + { + _verbosityOption = verbosityOption; + } + + public override bool Terminating => false; + + public override int Invoke(ParseResult parseResult) + { + var value = parseResult.GetValue(_verbosityOption); + + // Handle both VerbosityOptions and VerbosityOptions? + if (value is VerbosityOptions verbosity) + { + if (verbosity.IsDiagnostic()) + { + Environment.SetEnvironmentVariable(CommandLoggingContext.Variables.Verbose, bool.TrueString); + CommandLoggingContext.SetVerbose(true); + Reporter.Reset(); + } + } + + return 0; + } + } } diff --git a/src/Cli/dotnet/Extensions/CommonOptionsExtensions.cs b/src/Cli/dotnet/Extensions/CommonOptionsExtensions.cs index 9254bbd73b77..fa35d6db2e63 100644 --- a/src/Cli/dotnet/Extensions/CommonOptionsExtensions.cs +++ b/src/Cli/dotnet/Extensions/CommonOptionsExtensions.cs @@ -64,6 +64,12 @@ public static bool IsNormal(this VerbosityOptions verbosity) verbosity.Equals(VerbosityOptions.n); } + public static bool IsDiagnostic(this VerbosityOptions verbosity) + { + return verbosity.Equals(VerbosityOptions.diag) || + verbosity.Equals(VerbosityOptions.diagnostic); + } + /// /// Converts to Microsoft.Extensions.Logging.. ///