Skip to content
This repository has been archived by the owner on Jul 5, 2024. It is now read-only.

Commit

Permalink
csq uses proper logging interfaces
Browse files Browse the repository at this point in the history
  • Loading branch information
caesay committed Aug 20, 2022
1 parent 42b89ca commit 35f177b
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 89 deletions.
85 changes: 82 additions & 3 deletions src/Squirrel.CommandLine/ConsoleLogger.cs
Original file line number Diff line number Diff line change
@@ -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;

Expand Down Expand Up @@ -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
}
}
}
112 changes: 26 additions & 86 deletions src/Squirrel.Tool/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,25 @@
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);
#pragma warning restore CS0436

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) {
Expand All @@ -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();

Expand All @@ -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);
}
}
Expand All @@ -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))
Expand All @@ -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();
Expand All @@ -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 { ; }
}

Expand Down Expand Up @@ -172,15 +180,15 @@ 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);
}

// v3.0 - v3.0.170
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);
}

Expand All @@ -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);
}

Expand All @@ -216,7 +224,7 @@ static IEnumerable<string> 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(
Expand All @@ -236,7 +244,7 @@ static IEnumerable<string> 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;
}
Expand All @@ -257,73 +265,5 @@ static IEnumerable<string> 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
}
}
1 change: 1 addition & 0 deletions src/Squirrel.Tool/Squirrel.Tool.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

<ItemGroup>
<None Include="..\..\docs\artwork\Clowd_200.png" Pack="true" PackagePath="\" />
<Compile Include="..\Squirrel.CommandLine\ConsoleLogger.cs" />
</ItemGroup>

<ItemGroup>
Expand Down

0 comments on commit 35f177b

Please sign in to comment.