Skip to content

Commit 0ea6696

Browse files
edvilmedsplaisted
authored andcommitted
Move logic to ToolRunFromSourceCommand.cs
1 parent dd13c53 commit 0ea6696

File tree

4 files changed

+92
-55
lines changed

4 files changed

+92
-55
lines changed

src/Cli/dotnet/Commands/Tool/Run/ToolRunCommand.cs

Lines changed: 8 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Microsoft.DotNet.Cli.CommandFactory;
88
using Microsoft.DotNet.Cli.CommandFactory.CommandResolution;
99
using Microsoft.DotNet.Cli.Commands.Tool.Install;
10+
using Microsoft.DotNet.Cli.NuGetPackageDownloader;
1011
using Microsoft.DotNet.Cli.ToolManifest;
1112
using Microsoft.DotNet.Cli.ToolPackage;
1213
using Microsoft.DotNet.Cli.Utils;
@@ -16,18 +17,15 @@ namespace Microsoft.DotNet.Cli.Commands.Tool.Run;
1617

1718
internal class ToolRunCommand(
1819
ParseResult result,
19-
LocalToolsCommandResolver localToolsCommandResolver = null,
20-
ToolManifestFinder toolManifest = null) : CommandBase(result)
20+
LocalToolsCommandResolver localToolsCommandResolver = null) : CommandBase(result)
2121
{
2222
private readonly string _toolCommandName = result.GetValue(ToolRunCommandParser.CommandNameArgument);
23-
private readonly LocalToolsCommandResolver _localToolsCommandResolver = localToolsCommandResolver ?? new LocalToolsCommandResolver();
2423
private readonly IEnumerable<string> _forwardArgument = result.GetValue(ToolRunCommandParser.CommandArgument);
25-
public bool _allowRollForward = result.GetValue(ToolRunCommandParser.RollForwardOption);
26-
private readonly ToolManifestFinder _toolManifest = toolManifest ?? new ToolManifestFinder(new DirectoryPath(Directory.GetCurrentDirectory()));
2724
private readonly bool _fromSource = result.GetValue(ToolRunCommandParser.FromSourceOption);
2825

29-
private readonly IToolManifestEditor _toolManifestEditor = new ToolManifestEditor();
30-
private readonly ILocalToolsResolverCache _localToolsResolverCache = new LocalToolsResolverCache();
26+
private readonly LocalToolsCommandResolver _localToolsCommandResolver = localToolsCommandResolver ?? new LocalToolsCommandResolver();
27+
public bool _allowRollForward = result.GetValue(ToolRunCommandParser.RollForwardOption);
28+
3129
public override int Execute()
3230
{
3331
CommandSpec commandSpec = _localToolsCommandResolver.ResolveStrict(new CommandResolverArguments()
@@ -38,9 +36,10 @@ public override int Execute()
3836

3937
}, _allowRollForward);
4038

41-
if (commandSpec == null && _fromSource && UserAgreedToExecuteFromSource())
39+
if (commandSpec == null && _fromSource)
4240
{
43-
return ExecuteFromSource();
41+
// Reroute to ToolRunFromSourceCommand
42+
return new ToolRunFromSourceCommand(_parseResult).Execute();
4443
}
4544

4645
if (commandSpec == null)
@@ -52,50 +51,5 @@ public override int Execute()
5251
return result.ExitCode;
5352
}
5453

55-
public int ExecuteFromSource()
56-
{
57-
string tempDirectory = PathUtilities.CreateTempSubdirectory();
58-
FilePath manifestFile = _toolManifest.FindFirst(true);
59-
PackageId packageId = new(_toolCommandName);
60-
61-
ToolInstallLocalInstaller _toolInstaller = new(_parseResult, new ToolPackageDownloader(
62-
store: new ToolPackageStoreAndQuery(new DirectoryPath(tempDirectory))));
63-
64-
IToolPackage toolPackage = _toolInstaller.Install(manifestFile, packageId);
65-
66-
_toolManifestEditor.Add(
67-
manifestFile,
68-
toolPackage.Id,
69-
toolPackage.Version,
70-
[toolPackage.Command.Name],
71-
_allowRollForward);
72-
73-
_localToolsResolverCache.SaveToolPackage(
74-
toolPackage,
75-
_toolInstaller.TargetFrameworkToInstall);
76-
77-
CommandSpec commandSpec = _localToolsCommandResolver.ResolveStrict(new CommandResolverArguments()
78-
{
79-
CommandName = $"dotnet-{toolPackage.Command.Name}",
80-
CommandArguments = _forwardArgument,
81-
}, _allowRollForward);
82-
83-
if (commandSpec == null)
84-
{
85-
throw new GracefulException([string.Format(CliCommandStrings.CannotFindCommandName, _toolCommandName)], isUserError: false);
86-
}
87-
88-
var result = CommandFactoryUsingResolver.Create(commandSpec).Execute();
89-
90-
_toolManifestEditor.Remove(manifestFile, toolPackage.Id);
9154

92-
return result.ExitCode;
93-
}
94-
95-
private bool UserAgreedToExecuteFromSource()
96-
{
97-
// TODO: Use a better way to ask for user input
98-
Console.WriteLine("Tool will be run from source. Accept? [yn]");
99-
return Console.ReadLine() == "y";
100-
}
10155
}

src/Cli/dotnet/Commands/Tool/Run/ToolRunCommandParser.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#nullable disable
55

66
using System.CommandLine;
7+
using Microsoft.DotNet.Cli.Commands.Tool.Install;
78

89
namespace Microsoft.DotNet.Cli.Commands.Tool.Run;
910

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.CommandLine;
5+
using Microsoft.DotNet.Cli.CommandFactory;
6+
using Microsoft.DotNet.Cli.CommandFactory.CommandResolution;
7+
using Microsoft.DotNet.Cli.Commands.Tool.Install;
8+
using Microsoft.DotNet.Cli.ToolManifest;
9+
using Microsoft.DotNet.Cli.ToolPackage;
10+
using Microsoft.DotNet.Cli.Utils;
11+
using Microsoft.Extensions.EnvironmentAbstractions;
12+
using NuGet.Versioning;
13+
14+
namespace Microsoft.DotNet.Cli.Commands.Tool.Run
15+
{
16+
internal class ToolRunFromSourceCommand(
17+
ParseResult result) : CommandBase(result)
18+
{
19+
private readonly string? _toolCommandName = result.GetValue(ToolRunCommandParser.CommandNameArgument);
20+
private readonly IEnumerable<string>? _forwardArguments = result.GetValue(ToolRunCommandParser.CommandArgument);
21+
private readonly bool _allowRollForward = result.GetValue(ToolRunCommandParser.RollForwardOption);
22+
23+
public override int Execute()
24+
{
25+
if (!UserAgreedToExecuteFromSource())
26+
{
27+
return 1;
28+
}
29+
30+
PackageId packageId = new(_toolCommandName);
31+
VersionRange versionRange = _parseResult.GetVersionRange();
32+
33+
string tempDirectory = PathUtilities.CreateTempSubdirectory();
34+
35+
IToolManifestFinder toolManifestFinder = new ToolManifestFinder(new(tempDirectory));
36+
IToolManifestEditor toolManifestEditor = new ToolManifestEditor();
37+
FilePath toolManifestPath = toolManifestFinder.FindFirst(true);
38+
39+
ToolPackageStoreAndQuery toolPackageStoreAndQuery = new(new(tempDirectory));
40+
ToolPackageDownloader toolPackageDownloader = new(toolPackageStoreAndQuery);
41+
42+
IToolPackage toolPackage = toolPackageDownloader.InstallPackage(
43+
new PackageLocation(),
44+
packageId: packageId,
45+
verbosity: VerbosityOptions.d,
46+
versionRange: versionRange);
47+
48+
toolManifestEditor.Add(
49+
toolManifestPath,
50+
packageId,
51+
toolPackage.Version,
52+
[toolPackage.Command.Name],
53+
rollForward: _allowRollForward);
54+
55+
LocalToolsCommandResolver localToolsCommandResolver = new();
56+
57+
CommandSpec commandSpec = localToolsCommandResolver.ResolveStrict(new()
58+
{
59+
CommandName = $"dotnet-{toolPackage.Command.Name}",
60+
CommandArguments = _forwardArguments,
61+
}, _allowRollForward);
62+
63+
if (commandSpec == null)
64+
{
65+
throw new GracefulException(
66+
string.Format(CliCommandStrings.CannotFindCommandName, _toolCommandName),
67+
isUserError: false);
68+
}
69+
70+
var command = CommandFactoryUsingResolver.Create(commandSpec);
71+
var result = command.Execute();
72+
73+
return result.ExitCode;
74+
}
75+
private bool UserAgreedToExecuteFromSource()
76+
{
77+
// TODO: Use a better way to ask for user input
78+
Console.WriteLine("Tool will be run from source. Accept? [yn]");
79+
return Console.ReadKey().Key == ConsoleKey.Y;
80+
}
81+
}
82+
}

src/Cli/dotnet/ToolManifest/IToolManifestEditor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace Microsoft.DotNet.Cli.ToolManifest;
1212

1313
internal interface IToolManifestEditor
1414
{
15-
void Add(FilePath manifest, PackageId packageId, NuGetVersion nuGetVersion, ToolCommandName[] toolCommandNames, bool RollForward = false);
15+
void Add(FilePath manifest, PackageId packageId, NuGetVersion nuGetVersion, ToolCommandName[] toolCommandNames, bool rollForward = false);
1616
void Remove(FilePath manifest, PackageId packageId);
1717
void Edit(FilePath manifest, PackageId packageId, NuGetVersion newNuGetVersion, ToolCommandName[] newToolCommandNames);
1818
}

0 commit comments

Comments
 (0)