Skip to content

Commit

Permalink
Merge pull request #3035 from icsharpcode/ilspycmdupdate
Browse files Browse the repository at this point in the history
Update Check for ilspycmd dotnet tool
  • Loading branch information
christophwille committed Jul 13, 2023
2 parents 1100d64 + ca60ee8 commit 7e322d4
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 11 deletions.
52 changes: 52 additions & 0 deletions ICSharpCode.ILSpyCmd/DotNetToolUpdateChecker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
using System;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;

using NuGet.Common;
using NuGet.Protocol;
using NuGet.Protocol.Core.Types;
using NuGet.Versioning;

namespace ICSharpCode.ILSpyCmd
{
// Idea from https://github.com/ErikEJ/EFCorePowerTools/blob/master/src/GUI/efcpt/Services/PackageService.cs
internal static class DotNetToolUpdateChecker
{
static NuGetVersion CurrentPackageVersion()
{
return new NuGetVersion(Assembly.GetEntryAssembly()!.GetCustomAttribute<AssemblyInformationalVersionAttribute>()!
.InformationalVersion);
}

public static async Task<NuGetVersion> CheckForPackageUpdateAsync(string packageId)
{
try
{
using var cache = new SourceCacheContext();
var repository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
var resource = await repository.GetResourceAsync<FindPackageByIdResource>().ConfigureAwait(false);

var versions = await resource.GetAllVersionsAsync(
packageId,
cache,
new NullLogger(),
CancellationToken.None).ConfigureAwait(false);

var latestVersion = versions.Where(v => v.Release == "").MaxBy(v => v);
if (latestVersion > CurrentPackageVersion())
{
return latestVersion;
}
}
#pragma warning disable RCS1075 // Avoid empty catch clause that catches System.Exception.
catch (Exception)
{
}
#pragma warning restore RCS1075 // Avoid empty catch clause that catches System.Exception.

return null;
}
}
}
8 changes: 3 additions & 5 deletions ICSharpCode.ILSpyCmd/ICSharpCode.ILSpyCmd.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,9 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="McMaster.Extensions.CommandLineUtils" Version="3.1.0" />
<PackageReference Include="System.IO.FileSystem.Primitives" Version="4.3.0" />
<PackageReference Include="System.Runtime.Handles" Version="4.3.0" />
<PackageReference Include="System.Runtime.InteropServices" Version="4.3.0" />
<PackageReference Include="System.Text.Encoding.Extensions" Version="4.3.0" />
<PackageReference Include=" McMaster.Extensions.Hosting.CommandLine" Version="4.0.2" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
<PackageReference Include="NuGet.Protocol" Version="6.6.1" />
</ItemGroup>

<Target Name="ILSpyUpdateAssemblyInfo" AfterTargets="ResolveProjectReferences">
Expand Down
44 changes: 38 additions & 6 deletions ICSharpCode.ILSpyCmd/IlspyCmdProgram.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using System.Threading;
using System.Threading.Tasks;

using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.CSharp;
Expand All @@ -21,6 +22,10 @@

using McMaster.Extensions.CommandLineUtils;

using Microsoft.Extensions.Hosting;

using NuGet.Versioning;

namespace ICSharpCode.ILSpyCmd
{
[Command(Name = "ilspycmd", Description = "dotnet tool for decompiling .NET assemblies and generating portable PDBs",
Expand Down Expand Up @@ -48,7 +53,9 @@ into nicely nested directories.
MemberName = nameof(DecompilerVersion))]
class ILSpyCmdProgram
{
public static int Main(string[] args) => CommandLineApplication.Execute<ILSpyCmdProgram>(args);
// https://natemcmaster.github.io/CommandLineUtils/docs/advanced/generic-host.html
// https://github.com/natemcmaster/CommandLineUtils/blob/main/docs/samples/dependency-injection/generic-host/Program.cs
public static Task<int> Main(string[] args) => new HostBuilder().RunCommandLineApplicationAsync<ILSpyCmdProgram>(args);

[FilesExist]
[Required]
Expand Down Expand Up @@ -92,22 +99,37 @@ class ILSpyCmdProgram

[DirectoryExists]
[Option("-r|--referencepath <path>", "Path to a directory containing dependencies of the assembly that is being decompiled.", CommandOptionType.MultipleValue)]
public string[] ReferencePaths { get; } = new string[0];
public string[] ReferencePaths { get; }

[Option("--no-dead-code", "Remove dead code.", CommandOptionType.NoValue)]
public bool RemoveDeadCode { get; }

[Option("--no-dead-stores", "Remove dead stores.", CommandOptionType.NoValue)]
public bool RemoveDeadStores { get; }

[Option("-d|--dump-package", "Dump package assembiles into a folder. This requires the output directory option.", CommandOptionType.NoValue)]
[Option("-d|--dump-package", "Dump package assemblies into a folder. This requires the output directory option.", CommandOptionType.NoValue)]
public bool DumpPackageFlag { get; }

[Option("--nested-directories", "Use nested directories for namespaces.", CommandOptionType.NoValue)]
public bool NestedDirectories { get; }

private int OnExecute(CommandLineApplication app)
[Option("--disable-updatecheck", "If using ilspycmd in a tight loop or fully automated scenario, you might want to disable the automatic update check.", CommandOptionType.NoValue)]
public bool DisableUpdateCheck { get; }

private readonly IHostEnvironment _env;
public ILSpyCmdProgram(IHostEnvironment env)
{
_env = env;
}

private async Task<int> OnExecuteAsync(CommandLineApplication app)
{
Task<NuGetVersion> updateCheckTask = null;
if (!DisableUpdateCheck)
{
updateCheckTask = DotNetToolUpdateChecker.CheckForPackageUpdateAsync("ilspycmd");
}

TextWriter output = System.Console.Out;
string outputDirectory = ResolveOutputDirectory(OutputDirectory);

Expand Down Expand Up @@ -156,6 +178,16 @@ private int OnExecute(CommandLineApplication app)
finally
{
output.Close();

if (null != updateCheckTask)
{
var latestVersion = await updateCheckTask;
if (null != latestVersion)
{
Console.WriteLine("You are not using the latest version of the tool, please update.");
Console.WriteLine($"Latest version is '{latestVersion}'");
}
}
}

int PerformPerFileAction(string fileName)
Expand Down Expand Up @@ -240,7 +272,7 @@ CSharpDecompiler GetDecompiler(string assemblyFileName)
{
var module = new PEFile(assemblyFileName);
var resolver = new UniversalAssemblyResolver(assemblyFileName, false, module.Metadata.DetectTargetFrameworkId());
foreach (var path in ReferencePaths)
foreach (var path in (ReferencePaths ?? Array.Empty<string>()))
{
resolver.AddSearchDirectory(path);
}
Expand Down Expand Up @@ -278,7 +310,7 @@ ProjectId DecompileAsProject(string assemblyFileName, string projectFileName)
{
var module = new PEFile(assemblyFileName);
var resolver = new UniversalAssemblyResolver(assemblyFileName, false, module.Metadata.DetectTargetFrameworkId());
foreach (var path in ReferencePaths)
foreach (var path in (ReferencePaths ?? Array.Empty<string>()))
{
resolver.AddSearchDirectory(path);
}
Expand Down

0 comments on commit 7e322d4

Please sign in to comment.