From 35f177b8c02c788b33c63d431760f98384fc82a4 Mon Sep 17 00:00:00 2001 From: Caelan Sayler Date: Sat, 20 Aug 2022 14:00:27 +0100 Subject: [PATCH] csq uses proper logging interfaces --- src/Squirrel.CommandLine/ConsoleLogger.cs | 85 +++++++++++++++- src/Squirrel.Tool/Program.cs | 112 +++++----------------- src/Squirrel.Tool/Squirrel.Tool.csproj | 1 + 3 files changed, 109 insertions(+), 89 deletions(-) diff --git a/src/Squirrel.CommandLine/ConsoleLogger.cs b/src/Squirrel.CommandLine/ConsoleLogger.cs index 3e355efd5..f05259e30 100644 --- a/src/Squirrel.CommandLine/ConsoleLogger.cs +++ b/src/Squirrel.CommandLine/ConsoleLogger.cs @@ -1,10 +1,14 @@ using System; using System.IO; +using System.Threading.Tasks; using Squirrel.SimpleSplat; +using NugetLogger = NuGet.Common.ILogger; +using NugetMessage = NuGet.Common.ILogMessage; +using NugetLevel = NuGet.Common.LogLevel; namespace Squirrel.CommandLine { - class ConsoleLogger : ILogger + class ConsoleLogger : ILogger, NugetLogger { public LogLevel Level { get; set; } = LogLevel.Info; @@ -36,11 +40,86 @@ public void Write(string message, LogLevel logLevel) } } - public static ILogger RegisterLogger() + public static ConsoleLogger RegisterLogger() { var logger = new ConsoleLogger(); SquirrelLocator.CurrentMutable.Register(() => logger, typeof(ILogger)); + SquirrelLocator.CurrentMutable.Register(() => logger, typeof(NugetLogger)); return logger; } + + #region NuGet.Common.ILogger + + void NugetLogger.LogDebug(string data) + { + Write(data, LogLevel.Debug); + } + + void NugetLogger.LogVerbose(string data) + { + Write(data, LogLevel.Debug); + } + + void NugetLogger.LogInformation(string data) + { + Write(data, LogLevel.Info); + } + + void NugetLogger.LogMinimal(string data) + { + Write(data, LogLevel.Info); + } + + void NugetLogger.LogWarning(string data) + { + Write(data, LogLevel.Warn); + } + + void NugetLogger.LogError(string data) + { + Write(data, LogLevel.Error); + } + + void NugetLogger.LogInformationSummary(string data) + { + Write(data, LogLevel.Info); + } + + LogLevel NugetToLogLevel(NugetLevel level) + { + return level switch { + NugetLevel.Debug => LogLevel.Debug, + NugetLevel.Verbose => LogLevel.Debug, + NugetLevel.Information => LogLevel.Info, + NugetLevel.Minimal => LogLevel.Info, + NugetLevel.Warning => LogLevel.Warn, + NugetLevel.Error => LogLevel.Error, + _ => throw new ArgumentOutOfRangeException(nameof(level), level, null) + }; + } + + void NugetLogger.Log(NugetLevel level, string data) + { + Write(data, NugetToLogLevel(level)); + } + + Task NugetLogger.LogAsync(NugetLevel level, string data) + { + Write(data, NugetToLogLevel(level)); + return Task.CompletedTask; + } + + void NugetLogger.Log(NugetMessage message) + { + Write(message.Message, NugetToLogLevel(message.Level)); + } + + Task NugetLogger.LogAsync(NugetMessage message) + { + Write(message.Message, NugetToLogLevel(message.Level)); + return Task.CompletedTask; + } + + #endregion } -} +} \ No newline at end of file diff --git a/src/Squirrel.Tool/Program.cs b/src/Squirrel.Tool/Program.cs index 58cf9ed86..97ab435c4 100644 --- a/src/Squirrel.Tool/Program.cs +++ b/src/Squirrel.Tool/Program.cs @@ -11,13 +11,13 @@ using Mono.Options; using NuGet.Common; using NuGet.Versioning; +using Squirrel.CommandLine; +using LogLevel = Squirrel.SimpleSplat.LogLevel; namespace Squirrel.Tool { - class Program : ILogger + class Program { - private static bool Verbose { get; set; } - #pragma warning disable CS0436 public static string SquirrelDisplayVersion => ThisAssembly.AssemblyInformationalVersion + (ThisAssembly.IsPublicRelease ? "" : " (prerelease)"); public static NuGetVersion SquirrelNugetVersion => NuGetVersion.Parse(ThisAssembly.AssemblyInformationalVersion); @@ -25,8 +25,11 @@ class Program : ILogger const string CLOWD_PACKAGE_NAME = "Clowd.Squirrel"; + private static ConsoleLogger _logger; + static int Main(string[] inargs) { + _logger = ConsoleLogger.RegisterLogger(); try { return MainInner(inargs); } catch (Exception ex) { @@ -37,20 +40,25 @@ static int Main(string[] inargs) static int MainInner(string[] inargs) { + bool verbose = false; string explicitSolutionPath = null; string explicitSquirrelVersion = null; var toolOptions = new OptionSet() { { "csq-version=", v => explicitSquirrelVersion = v }, { "csq-sln=", v => explicitSolutionPath = v }, - { "verbose", _ => Verbose = true }, + { "verbose", _ => verbose = true }, }; // we want to forward the --verbose argument to Squirrel, too. - var verboseArgs = Verbose ? new string[] { "--verbose" } : new string[0]; + var verboseArgs = verbose ? new string[] { "--verbose" } : new string[0]; string[] restArgs = toolOptions.Parse(inargs).Concat(verboseArgs).ToArray(); + if (verbose) { + _logger.Level = LogLevel.Debug; + } + Console.WriteLine($"Squirrel Locator 'csq' {SquirrelDisplayVersion}"); - Write($"Entry EXE: {SquirrelRuntimeInfo.EntryExePath}", true); + _logger.Write($"Entry EXE: {SquirrelRuntimeInfo.EntryExePath}", LogLevel.Debug); CheckForUpdates(); @@ -69,20 +77,20 @@ int runSquirrel(string version) foreach (var kvp in packageSearchPaths) { var path = String.Format(kvp.Value, version); if (Directory.Exists(path)) { - Write($"Running {CLOWD_PACKAGE_NAME} {version} from {kvp.Key}", false); + _logger.Write($"Running {CLOWD_PACKAGE_NAME} {version} from {kvp.Key}", LogLevel.Info); return RunCsqFromPath(path, restArgs); } } // we did not find it locally on first pass, search for the package online - var dl = new NugetDownloader(new Program()); + var dl = new NugetDownloader(_logger); var package = dl.GetPackageMetadata(CLOWD_PACKAGE_NAME, version); // search one more time now that we've potentially resolved the nuget version foreach (var kvp in packageSearchPaths) { var path = String.Format(kvp.Value, package.Identity.Version); if (Directory.Exists(path)) { - Write($"Running {CLOWD_PACKAGE_NAME} {package.Identity.Version} from {kvp.Key}", false); + _logger.Write($"Running {CLOWD_PACKAGE_NAME} {package.Identity.Version} from {kvp.Key}", LogLevel.Info); return RunCsqFromPath(path, restArgs); } } @@ -92,7 +100,7 @@ int runSquirrel(string version) if (!Directory.Exists(cacheDir)) Directory.CreateDirectory(cacheDir); if (!Directory.Exists(versionDir)) Directory.CreateDirectory(versionDir); - Write($"Downloading {package.Identity} from NuGet.", false); + _logger.Write($"Downloading {package.Identity} from NuGet.", LogLevel.Info); var filePath = Path.Combine(versionDir, package.Identity + ".nupkg"); using (var fs = File.Create(filePath)) @@ -112,7 +120,7 @@ int runSquirrel(string version) throw new Exception("Could not find '.sln'. Specify solution with '--csq-sln=', or specify version of squirrel to use with '--csq-version='."); } - Write("Solution dir found at: " + solutionDir, true); + _logger.Write("Solution dir found at: " + solutionDir, LogLevel.Debug); // TODO actually read the SLN file rather than just searching for all .csproj files var dependencies = GetPackageVersionsFromDir(solutionDir, CLOWD_PACKAGE_NAME).Distinct().ToArray(); @@ -135,10 +143,10 @@ static void CheckForUpdates() { try { var myVer = SquirrelNugetVersion; - var dl = new NugetDownloader(new Program()); + var dl = new NugetDownloader(_logger); var package = dl.GetPackageMetadata("csq", (myVer.IsPrerelease || myVer.HasMetadata) ? "pre" : "latest"); if (package.Identity.Version > myVer) - Write($"There is a new version of csq available ({package.Identity.Version})", false); + _logger.Write($"There is a new version of csq available ({package.Identity.Version})", LogLevel.Warn); } catch { ; } } @@ -172,7 +180,7 @@ static int RunCsqFromPath(string toolRootPath, string[] args) if (File.Exists(Path.Combine(toolRootPath, "Squirrel.CommandLine.runtimeconfig.json"))) { var cliPath = Path.Combine(toolRootPath, "Squirrel.CommandLine.dll"); var dnargs = new[] { cliPath }.Concat(args).ToArray(); - Write("running dotnet " + String.Join(" ", dnargs), true); + _logger.Write("running dotnet " + String.Join(" ", dnargs), LogLevel.Debug); return RunProcess("dotnet", dnargs); } @@ -180,7 +188,7 @@ static int RunCsqFromPath(string toolRootPath, string[] args) var toolDllPath = Path.Combine(toolRootPath, "csq.dll"); if (File.Exists(toolDllPath)) { var dnargs = new[] { toolDllPath, "--csq-embedded" }.Concat(args).ToArray(); - Write("running dotnet " + String.Join(" ", dnargs), true); + _logger.Write("running dotnet " + String.Join(" ", dnargs), LogLevel.Debug); return RunProcess("dotnet", dnargs); } @@ -190,7 +198,7 @@ static int RunCsqFromPath(string toolRootPath, string[] args) if (!SquirrelRuntimeInfo.IsWindows) throw new NotSupportedException( $"Squirrel at '{toolRootPath}' does not support this operating system. Please update the package version to >= 3.0"); - Write("running " + toolExePath + " " + String.Join(" ", args), true); + _logger.Write("running " + toolExePath + " " + String.Join(" ", args), LogLevel.Debug); return RunProcess(toolExePath, args); } @@ -216,7 +224,7 @@ static IEnumerable GetPackageVersionsFromDir(string rootDir, string pack var ver = sqel?.Attribute("version"); if (ver == null) continue; - Write($"{packageName} {ver.Value} referenced in {packagesFile}", true); + _logger.Write($"{packageName} {ver.Value} referenced in {packagesFile}", LogLevel.Debug); if (ver.Value.Contains("*")) throw new Exception( @@ -236,7 +244,7 @@ static IEnumerable GetPackageVersionsFromDir(string rootDir, string pack var version = item.Children.FirstOrDefault(x => x.ElementName == "Version") as ProjectMetadataElement; if (version?.Value == null) continue; - Write($"{packageName} {version.Value} referenced in {projFile}", true); + _logger.Write($"{packageName} {version.Value} referenced in {projFile}", LogLevel.Debug); yield return version.Value; } @@ -257,73 +265,5 @@ static IEnumerable EnumerateFilesUntilSpecificDepth(string rootPath, str } } } - - static void Write(string message, bool isDebugMessage) - { - // TODO use Squirrel logging proper... - if (Verbose || !isDebugMessage) - Console.WriteLine("csq: " + message); - } - - #region NuGet.Common.ILogger - - public void LogDebug(string data) - { - Write(data, true); - } - - public void LogVerbose(string data) - { - Write(data, true); - } - - public void LogInformation(string data) - { - Write(data, true); - } - - public void LogMinimal(string data) - { - Write(data, false); - } - - public void LogWarning(string data) - { - Write(data, false); - } - - public void LogError(string data) - { - Write(data, false); - } - - public void LogInformationSummary(string data) - { - Write(data, true); - } - - public void Log(LogLevel level, string data) - { - Write(data, level <= LogLevel.Information); - } - - public Task LogAsync(LogLevel level, string data) - { - Write(data, level <= LogLevel.Information); - return Task.CompletedTask; - } - - public void Log(ILogMessage message) - { - Write(message.Message, message.Level <= LogLevel.Information); - } - - public Task LogAsync(ILogMessage message) - { - Write(message.Message, message.Level <= LogLevel.Information); - return Task.CompletedTask; - } - - #endregion } } \ No newline at end of file diff --git a/src/Squirrel.Tool/Squirrel.Tool.csproj b/src/Squirrel.Tool/Squirrel.Tool.csproj index 970924c09..dfc335255 100644 --- a/src/Squirrel.Tool/Squirrel.Tool.csproj +++ b/src/Squirrel.Tool/Squirrel.Tool.csproj @@ -17,6 +17,7 @@ +