diff --git a/src/Cli/dotnet/CommandFactory/CommandFactoryUsingResolver.cs b/src/Cli/dotnet/CommandFactory/CommandFactoryUsingResolver.cs index 72132ccf9d17..99c7b7f7f6e1 100644 --- a/src/Cli/dotnet/CommandFactory/CommandFactoryUsingResolver.cs +++ b/src/Cli/dotnet/CommandFactory/CommandFactoryUsingResolver.cs @@ -15,12 +15,14 @@ public static Command CreateDotNet( string commandName, IEnumerable args, NuGetFramework framework = null, - string configuration = Constants.DefaultConfiguration) + string configuration = Constants.DefaultConfiguration, + string currentWorkingDirectory = null) { return Create("dotnet", new[] { commandName }.Concat(args), framework, - configuration: configuration); + configuration: configuration, + currentWorkingDirectory); } /// @@ -35,7 +37,8 @@ public static Command Create( NuGetFramework framework = null, string configuration = Constants.DefaultConfiguration, string outputPath = null, - string applicationName = null) + string applicationName = null, + string currentWorkingDirectory = null) { return Create( new DefaultCommandResolverPolicy(), @@ -44,7 +47,8 @@ public static Command Create( framework, configuration, outputPath, - applicationName); + applicationName, + currentWorkingDirectory); } public static Command Create( @@ -54,7 +58,8 @@ public static Command Create( NuGetFramework framework = null, string configuration = Constants.DefaultConfiguration, string outputPath = null, - string applicationName = null) + string applicationName = null, + string currentWorkingDirectory = null) { var commandSpec = CommandResolver.TryResolveCommandSpec( commandResolverPolicy, @@ -63,7 +68,8 @@ public static Command Create( framework, configuration: configuration, outputPath: outputPath, - applicationName: applicationName); + applicationName: applicationName, + currentWorkingDirectory: currentWorkingDirectory); if (commandSpec == null) { diff --git a/src/Cli/dotnet/CommandFactory/CommandResolution/DefaultCommandResolverPolicy.cs b/src/Cli/dotnet/CommandFactory/CommandResolution/DefaultCommandResolverPolicy.cs index a9fd45472161..acdd93509560 100644 --- a/src/Cli/dotnet/CommandFactory/CommandResolution/DefaultCommandResolverPolicy.cs +++ b/src/Cli/dotnet/CommandFactory/CommandResolution/DefaultCommandResolverPolicy.cs @@ -7,12 +7,12 @@ namespace Microsoft.DotNet.CommandFactory { public class DefaultCommandResolverPolicy : ICommandResolverPolicy { - public CompositeCommandResolver CreateCommandResolver() + public CompositeCommandResolver CreateCommandResolver(string currentWorkingDirectory = null) { - return Create(); + return Create(currentWorkingDirectory); } - public static CompositeCommandResolver Create() + public static CompositeCommandResolver Create(string currentWorkingDirectory = null) { var environment = new EnvironmentProvider(); var packagedCommandSpecFactory = new PackagedCommandSpecFactoryWithCliRuntime(); @@ -32,20 +32,22 @@ public static CompositeCommandResolver Create() environment, packagedCommandSpecFactory, platformCommandSpecFactory, - publishedPathCommandSpecFactory); + publishedPathCommandSpecFactory, + currentWorkingDirectory); } public static CompositeCommandResolver CreateDefaultCommandResolver( IEnvironmentProvider environment, IPackagedCommandSpecFactory packagedCommandSpecFactory, IPlatformCommandSpecFactory platformCommandSpecFactory, - IPublishedPathCommandSpecFactory publishedPathCommandSpecFactory) + IPublishedPathCommandSpecFactory publishedPathCommandSpecFactory, + string currentWorkingDirectory = null) { var compositeCommandResolver = new CompositeCommandResolver(); compositeCommandResolver.AddCommandResolver(new MuxerCommandResolver()); compositeCommandResolver.AddCommandResolver(new DotnetToolsCommandResolver()); - compositeCommandResolver.AddCommandResolver(new LocalToolsCommandResolver()); + compositeCommandResolver.AddCommandResolver(new LocalToolsCommandResolver(currentWorkingDirectory: currentWorkingDirectory)); compositeCommandResolver.AddCommandResolver(new RootedCommandResolver()); compositeCommandResolver.AddCommandResolver( new ProjectToolsCommandResolver(packagedCommandSpecFactory, environment)); diff --git a/src/Cli/dotnet/CommandFactory/CommandResolution/ICommandResolverPolicy.cs b/src/Cli/dotnet/CommandFactory/CommandResolution/ICommandResolverPolicy.cs index 13782cc7ef3e..1e6ac839a837 100644 --- a/src/Cli/dotnet/CommandFactory/CommandResolution/ICommandResolverPolicy.cs +++ b/src/Cli/dotnet/CommandFactory/CommandResolution/ICommandResolverPolicy.cs @@ -5,6 +5,6 @@ namespace Microsoft.DotNet.CommandFactory { public interface ICommandResolverPolicy { - CompositeCommandResolver CreateCommandResolver(); + CompositeCommandResolver CreateCommandResolver(string currentWorkingDirectory = null); } } diff --git a/src/Cli/dotnet/CommandFactory/CommandResolution/LocalToolsCommandResolver.cs b/src/Cli/dotnet/CommandFactory/CommandResolution/LocalToolsCommandResolver.cs index 524ea1eb0d04..6b1db04c20de 100644 --- a/src/Cli/dotnet/CommandFactory/CommandResolution/LocalToolsCommandResolver.cs +++ b/src/Cli/dotnet/CommandFactory/CommandResolution/LocalToolsCommandResolver.cs @@ -21,9 +21,10 @@ internal class LocalToolsCommandResolver : ICommandResolver public LocalToolsCommandResolver( ToolManifestFinder toolManifest = null, ILocalToolsResolverCache localToolsResolverCache = null, - IFileSystem fileSystem = null) + IFileSystem fileSystem = null, + string currentWorkingDirectory = null) { - _toolManifest = toolManifest ?? new ToolManifestFinder(new DirectoryPath(Directory.GetCurrentDirectory())); + _toolManifest = toolManifest ?? new ToolManifestFinder(new DirectoryPath(currentWorkingDirectory ?? Directory.GetCurrentDirectory())); _localToolsResolverCache = localToolsResolverCache ?? new LocalToolsResolverCache(); _fileSystem = fileSystem ?? new FileSystemWrapper(); } diff --git a/src/Cli/dotnet/CommandFactory/CommandResolution/PathCommandResolverPolicy.cs b/src/Cli/dotnet/CommandFactory/CommandResolution/PathCommandResolverPolicy.cs index f0b6ea222ddc..f21d60cf7f02 100644 --- a/src/Cli/dotnet/CommandFactory/CommandResolution/PathCommandResolverPolicy.cs +++ b/src/Cli/dotnet/CommandFactory/CommandResolution/PathCommandResolverPolicy.cs @@ -7,7 +7,7 @@ namespace Microsoft.DotNet.CommandFactory { public class PathCommandResolverPolicy : ICommandResolverPolicy { - public CompositeCommandResolver CreateCommandResolver() + public CompositeCommandResolver CreateCommandResolver(string CurrentWorkingDirectory = null) { return Create(); } diff --git a/src/Cli/dotnet/CommandFactory/CommandResolver.cs b/src/Cli/dotnet/CommandFactory/CommandResolver.cs index 3649fddfbb53..678600e8227a 100644 --- a/src/Cli/dotnet/CommandFactory/CommandResolver.cs +++ b/src/Cli/dotnet/CommandFactory/CommandResolver.cs @@ -33,20 +33,21 @@ public static CommandSpec TryResolveCommandSpec( NuGetFramework framework = null, string configuration = Constants.DefaultConfiguration, string outputPath = null, - string applicationName = null) + string applicationName = null, + string currentWorkingDirectory = null) { var commandResolverArgs = new CommandResolverArguments { CommandName = commandName, CommandArguments = args, Framework = framework, - ProjectDirectory = Directory.GetCurrentDirectory(), + ProjectDirectory = currentWorkingDirectory ?? Directory.GetCurrentDirectory(), Configuration = configuration, OutputPath = outputPath, ApplicationName = applicationName }; - var defaultCommandResolver = commandResolverPolicy.CreateCommandResolver(); + var defaultCommandResolver = commandResolverPolicy.CreateCommandResolver(currentWorkingDirectory); return defaultCommandResolver.Resolve(commandResolverArgs); } diff --git a/src/Cli/dotnet/DotNetCommandFactory.cs b/src/Cli/dotnet/DotNetCommandFactory.cs index 22b04fd9df81..190b2385abde 100644 --- a/src/Cli/dotnet/DotNetCommandFactory.cs +++ b/src/Cli/dotnet/DotNetCommandFactory.cs @@ -12,10 +12,12 @@ namespace Microsoft.DotNet.Cli public class DotNetCommandFactory : ICommandFactory { private bool _alwaysRunOutOfProc; + private readonly string _currentWorkingDirectory; - public DotNetCommandFactory(bool alwaysRunOutOfProc = false) + public DotNetCommandFactory(bool alwaysRunOutOfProc = false, string currentWorkingDirectory = null) { _alwaysRunOutOfProc = alwaysRunOutOfProc; + _currentWorkingDirectory = currentWorkingDirectory; } public ICommand Create( @@ -32,7 +34,7 @@ public ICommand Create( return new BuiltInCommand(commandName, args, builtInCommand); } - return CommandFactoryUsingResolver.CreateDotNet(commandName, args, framework, configuration); + return CommandFactoryUsingResolver.CreateDotNet(commandName, args, framework, configuration, _currentWorkingDirectory); } private bool TryGetBuiltInCommand(string commandName, out Func commandFunc) diff --git a/src/Cli/dotnet/NugetPackageDownloader/FirstPartyNuGetPackageSigningVerifier.cs b/src/Cli/dotnet/NugetPackageDownloader/FirstPartyNuGetPackageSigningVerifier.cs index e8f93af7018a..58fafb5b5ec0 100644 --- a/src/Cli/dotnet/NugetPackageDownloader/FirstPartyNuGetPackageSigningVerifier.cs +++ b/src/Cli/dotnet/NugetPackageDownloader/FirstPartyNuGetPackageSigningVerifier.cs @@ -74,10 +74,10 @@ internal bool IsFirstParty(FilePath nupkgToVerify) } } - public static bool NuGetVerify(FilePath nupkgToVerify, out string commandOutput) + public static bool NuGetVerify(FilePath nupkgToVerify, out string commandOutput, string currentWorkingDirectory = null) { var args = new[] { "verify", "--all", nupkgToVerify.Value }; - var command = new DotNetCommandFactory(alwaysRunOutOfProc: true) + var command = new DotNetCommandFactory(alwaysRunOutOfProc: true, currentWorkingDirectory) .Create("nuget", args); var commandResult = command.CaptureStdOut().Execute(); diff --git a/src/Cli/dotnet/NugetPackageDownloader/NuGetPackageDownloader.cs b/src/Cli/dotnet/NugetPackageDownloader/NuGetPackageDownloader.cs index 349caea55594..f3a45811fb59 100644 --- a/src/Cli/dotnet/NugetPackageDownloader/NuGetPackageDownloader.cs +++ b/src/Cli/dotnet/NugetPackageDownloader/NuGetPackageDownloader.cs @@ -40,6 +40,7 @@ internal class NuGetPackageDownloader : INuGetPackageDownloader private bool _verifySignatures; private VerbosityOptions _verbosityOptions; + private readonly string _currentWorkingDirectory; public NuGetPackageDownloader( DirectoryPath packageInstallDir, @@ -51,8 +52,10 @@ public NuGetPackageDownloader( Func> timer = null, bool verifySignatures = false, bool shouldUsePackageSourceMapping = false, - VerbosityOptions verbosityOptions = VerbosityOptions.normal) + VerbosityOptions verbosityOptions = VerbosityOptions.normal, + string currentWorkingDirectory = null) { + _currentWorkingDirectory = currentWorkingDirectory; _packageInstallDir = packageInstallDir; _reporter = reporter ?? Reporter.Output; _verboseLogger = verboseLogger ?? new NuGetConsoleLogger(); @@ -160,7 +163,7 @@ await repository.GetResourceAsync().ConfigureAwait( { string commandOutput; if ((!_shouldUsePackageSourceMapping && !_firstPartyNuGetPackageSigningVerifier.Verify(new FilePath(nupkgPath), out commandOutput)) || - (_shouldUsePackageSourceMapping && !FirstPartyNuGetPackageSigningVerifier.NuGetVerify(new FilePath(nupkgPath), out commandOutput))) + (_shouldUsePackageSourceMapping && !FirstPartyNuGetPackageSigningVerifier.NuGetVerify(new FilePath(nupkgPath), out commandOutput, _currentWorkingDirectory))) { throw new NuGetPackageInstallerException(string.Format(LocalizableStrings.FailedToValidatePackageSigning, commandOutput)); } @@ -315,7 +318,7 @@ private static bool PackageIsInAllowList(IEnumerable files) private IEnumerable LoadNuGetSources(PackageId packageId, PackageSourceLocation packageSourceLocation = null, PackageSourceMapping packageSourceMapping = null) { List defaultSources = new List(); - string currentDirectory = Directory.GetCurrentDirectory(); + string currentDirectory = _currentWorkingDirectory ?? Directory.GetCurrentDirectory(); ISettings settings; if (packageSourceLocation?.NugetConfig != null) { diff --git a/src/Cli/dotnet/ToolPackage/ToolPackageDownloader.cs b/src/Cli/dotnet/ToolPackage/ToolPackageDownloader.cs index 073b29bd750b..6d80ecf25f84 100644 --- a/src/Cli/dotnet/ToolPackage/ToolPackageDownloader.cs +++ b/src/Cli/dotnet/ToolPackage/ToolPackageDownloader.cs @@ -48,15 +48,19 @@ internal class ToolPackageDownloader : IToolPackageDownloader protected readonly string _runtimeJsonPath; + private readonly string _currentWorkingDirectory; + public ToolPackageDownloader( IToolPackageStore store, - string runtimeJsonPathForTests = null + string runtimeJsonPathForTests = null, + string currentWorkingDirectory = null ) { _toolPackageStore = store ?? throw new ArgumentNullException(nameof(store)); _globalToolStageDir = _toolPackageStore.GetRandomStagingDirectory(); - ISettings settings = Settings.LoadDefaultSettings(Directory.GetCurrentDirectory()); + ISettings settings = Settings.LoadDefaultSettings(currentWorkingDirectory ?? Directory.GetCurrentDirectory()); _localToolDownloadDir = new DirectoryPath(SettingsUtility.GetGlobalPackagesFolder(settings)); + _currentWorkingDirectory = currentWorkingDirectory; _localToolAssetDir = new DirectoryPath(PathUtilities.CreateTempSubdirectory()); _runtimeJsonPath = runtimeJsonPathForTests ?? Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "RuntimeIdentifierGraph.json"); @@ -92,7 +96,7 @@ public IToolPackage InstallPackage(PackageLocation packageLocation, PackageId pa var toolDownloadDir = isGlobalTool ? _globalToolStageDir : _localToolDownloadDir; var assetFileDirectory = isGlobalTool ? _globalToolStageDir : _localToolAssetDir; - var nugetPackageDownloader = new NuGetPackageDownloader.NuGetPackageDownloader(toolDownloadDir, verboseLogger: nugetLogger, verifySignatures: verifySignatures, shouldUsePackageSourceMapping: true, verbosityOptions: verbosity); + var nugetPackageDownloader = new NuGetPackageDownloader.NuGetPackageDownloader(toolDownloadDir, verboseLogger: nugetLogger, verifySignatures: verifySignatures, shouldUsePackageSourceMapping: true, verbosityOptions: verbosity, currentWorkingDirectory: _currentWorkingDirectory); var packageSourceLocation = new PackageSourceLocation(packageLocation.NugetConfig, packageLocation.RootConfigDirectory, null, packageLocation.AdditionalFeeds); diff --git a/src/Cli/dotnet/ToolPackage/ToolPackageFactory.cs b/src/Cli/dotnet/ToolPackage/ToolPackageFactory.cs index ad8d8be753c9..92fbc0490a85 100644 --- a/src/Cli/dotnet/ToolPackage/ToolPackageFactory.cs +++ b/src/Cli/dotnet/ToolPackage/ToolPackageFactory.cs @@ -36,10 +36,10 @@ public static (IToolPackageStore, IToolPackageDownloader, IToolPackageUninstaller) CreateToolPackageStoresAndDownloaderAndUninstaller( - DirectoryPath? nonGlobalLocation = null, IEnumerable additionalRestoreArguments = null) + DirectoryPath? nonGlobalLocation = null, IEnumerable additionalRestoreArguments = null, string currentWorkingDirectory = null) { ToolPackageStoreAndQuery toolPackageStore = CreateConcreteToolPackageStore(nonGlobalLocation); - var toolPackageDownloader = new ToolPackageDownloader(toolPackageStore); + var toolPackageDownloader = new ToolPackageDownloader(toolPackageStore, currentWorkingDirectory: currentWorkingDirectory); var toolPackageUninstaller = new ToolPackageUninstaller( toolPackageStore); @@ -47,7 +47,7 @@ public static (IToolPackageStore, } - public static IToolPackageStoreQuery CreateToolPackageStoreQuery( + public static ToolPackageStoreAndQuery CreateToolPackageStoreQuery( DirectoryPath? nonGlobalLocation = null) { return CreateConcreteToolPackageStore(nonGlobalLocation); diff --git a/src/Cli/dotnet/commands/dotnet-tool/install/ToolInstallGlobalOrToolPathCommand.cs b/src/Cli/dotnet/commands/dotnet-tool/install/ToolInstallGlobalOrToolPathCommand.cs index ca015168bbdd..60beb0ef68d1 100644 --- a/src/Cli/dotnet/commands/dotnet-tool/install/ToolInstallGlobalOrToolPathCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-tool/install/ToolInstallGlobalOrToolPathCommand.cs @@ -52,7 +52,8 @@ internal class ToolInstallGlobalOrToolPathCommand : CommandBase private readonly bool _allowRollForward; private readonly bool _allowPackageDowngrade; private readonly bool _updateAll; - + private readonly string _currentWorkingDirectory; + private readonly bool? _verifySignatures; public ToolInstallGlobalOrToolPathCommand( ParseResult parseResult, @@ -62,9 +63,13 @@ public ToolInstallGlobalOrToolPathCommand( IEnvironmentPathInstruction environmentPathInstruction = null, IReporter reporter = null, INuGetPackageDownloader nugetPackageDownloader = null, - IToolPackageStoreQuery store = null) + IToolPackageStoreQuery store = null, + string currentWorkingDirectory = null, + bool? verifySignatures = null) : base(parseResult) { + _verifySignatures = verifySignatures; + _currentWorkingDirectory = currentWorkingDirectory; var packageIdArgument = parseResult.GetValue(ToolInstallCommandParser.PackageIdArgument); _packageId = packageId ?? (packageIdArgument is not null ? new PackageId(packageIdArgument) : null); _packageVersion = parseResult.GetValue(ToolInstallCommandParser.VersionOption); @@ -151,7 +156,7 @@ private int ExecuteInstallCommand(PackageId packageId) (IToolPackageStore toolPackageStore, IToolPackageStoreQuery toolPackageStoreQuery, IToolPackageDownloader toolPackageDownloader, - IToolPackageUninstaller toolPackageUninstaller) = _createToolPackageStoreDownloaderUninstaller(toolPath, _forwardRestoreArguments); + IToolPackageUninstaller toolPackageUninstaller) = _createToolPackageStoreDownloaderUninstaller(toolPath, _forwardRestoreArguments, _currentWorkingDirectory); var appHostSourceDirectory = ShellShimTemplateFinder.GetDefaultAppHostSourceDirectory(); IShellShimRepository shellShimRepository = _createShellShimRepository(appHostSourceDirectory, toolPath); @@ -195,7 +200,8 @@ private int ExecuteInstallCommand(PackageId packageId) targetFramework: _framework, verbosity: _verbosity, isGlobalTool: true, - isGlobalToolRollForward: _allowRollForward + isGlobalToolRollForward: _allowRollForward, + verifySignatures: _verifySignatures ?? true ); EnsureVersionIsHigher(oldPackageNullable, newInstalledPackage, _allowPackageDowngrade); diff --git a/src/Cli/dotnet/commands/dotnet-tool/update/ToolUpdateGlobalOrToolPathCommand.cs b/src/Cli/dotnet/commands/dotnet-tool/update/ToolUpdateGlobalOrToolPathCommand.cs index d9ff2bd02ddc..307d35d5c155 100644 --- a/src/Cli/dotnet/commands/dotnet-tool/update/ToolUpdateGlobalOrToolPathCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-tool/update/ToolUpdateGlobalOrToolPathCommand.cs @@ -16,7 +16,8 @@ namespace Microsoft.DotNet.Tools.Tool.Update { internal delegate (IToolPackageStore, IToolPackageStoreQuery, IToolPackageDownloader, IToolPackageUninstaller) CreateToolPackageStoresAndDownloaderAndUninstaller( DirectoryPath? nonGlobalLocation = null, - IEnumerable additionalRestoreArguments = null); + IEnumerable additionalRestoreArguments = null, + string currentWorkingDirectory = null); internal class ToolUpdateGlobalOrToolPathCommand : CommandBase { diff --git a/test/dotnet.Tests/CommandObjectTests.cs b/test/dotnet.Tests/CommandObjectTests.cs index e312903459ea..a82e79f95b59 100644 --- a/test/dotnet.Tests/CommandObjectTests.cs +++ b/test/dotnet.Tests/CommandObjectTests.cs @@ -28,7 +28,7 @@ public void WhenItCannotResolveCommandButCommandIsInListOfKnownToolsItThrows() private class ResolveNothingCommandResolverPolicy : ICommandResolverPolicy { - public CompositeCommandResolver CreateCommandResolver() + public CompositeCommandResolver CreateCommandResolver(string currentWorkingDirectory = null) { var compositeCommandResolver = new CompositeCommandResolver(); compositeCommandResolver.AddCommandResolver(new ResolveNothingCommandResolver()); diff --git a/test/dotnet.Tests/CommandTests/ToolInstallGlobalOrToolPathCommandTests.cs b/test/dotnet.Tests/CommandTests/ToolInstallGlobalOrToolPathCommandTests.cs index 5d3b42c1d571..e4f7b5f7615c 100644 --- a/test/dotnet.Tests/CommandTests/ToolInstallGlobalOrToolPathCommandTests.cs +++ b/test/dotnet.Tests/CommandTests/ToolInstallGlobalOrToolPathCommandTests.cs @@ -11,6 +11,7 @@ using Microsoft.DotNet.Tools; using Microsoft.DotNet.Tools.Tests.ComponentMocks; using Microsoft.DotNet.Tools.Tool.Install; +using Microsoft.DotNet.Tools.Tool.Uninstall; using Microsoft.DotNet.Tools.Tool.Update; using Microsoft.Extensions.DependencyModel.Tests; using Microsoft.Extensions.EnvironmentAbstractions; @@ -70,7 +71,7 @@ public ToolInstallGlobalOrToolPathCommandTests(ITestOutputHelper log): base(log) new DirectoryPath(_toolsDirectory), _fileSystem); _toolPackageUninstallerMock = new ToolPackageUninstallerMock(_fileSystem, store); - _createToolPackageStoreDownloaderUninstaller = (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, CreateToolPackageDownloader(), _toolPackageUninstallerMock); + _createToolPackageStoreDownloaderUninstaller = (location, forwardArguments, workingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, CreateToolPackageDownloader(), _toolPackageUninstallerMock); _parseResult = Parser.Instance.Parse($"dotnet tool install -g {PackageId}"); @@ -144,7 +145,7 @@ public void WhenRunWithPackageIdWithSourceItShouldCreateValidShim() var toolInstallGlobalOrToolPathCommand = new ToolInstallGlobalOrToolPathCommand( result, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), _createShellShimRepository, _environmentPathInstructionMock, _reporter); @@ -193,7 +194,7 @@ public void WhenRunWithPackageIdPackageFormatIsNotFullySupportedItShouldShowPath var toolInstallGlobalOrToolPathCommand = new ToolInstallGlobalOrToolPathCommand( _parseResult, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, toolPackageDownloader, _toolPackageUninstallerMock), + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, toolPackageDownloader, _toolPackageUninstallerMock), _createShellShimRepository, _environmentPathInstructionMock, _reporter); @@ -216,7 +217,7 @@ public void GivenFailedPackageInstallWhenRunWithPackageIdItShouldFail() var toolInstallGlobalOrToolPathCommand = new ToolInstallGlobalOrToolPathCommand( _parseResult, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, toolPackageDownloader, _toolPackageUninstallerMock), + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, toolPackageDownloader, _toolPackageUninstallerMock), _createShellShimRepository, _environmentPathInstructionMock, _reporter); @@ -265,7 +266,7 @@ public void GivenInCorrectToolConfigurationWhenRunWithPackageIdItShouldFail() var toolInstallGlobalOrToolPathCommand = new ToolInstallGlobalOrToolPathCommand( _parseResult, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, toolPackageDownloader, _toolPackageUninstallerMock), + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, toolPackageDownloader, _toolPackageUninstallerMock), _createShellShimRepository, _environmentPathInstructionMock, _reporter); @@ -415,7 +416,7 @@ public void WhenInstallWithHigherVersionItShouldUpdate() var toolInstallGlobalOrToolPathCommand = new ToolInstallGlobalOrToolPathCommand( result, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), _createShellShimRepository, new EnvironmentPathInstructionMock(_reporter, _pathToPlaceShim, true), _reporter); @@ -437,7 +438,7 @@ public void WhenInstallWithHigherVersionItShouldUpdate() var toolInstallGlobalOrToolPathCommand2 = new ToolInstallGlobalOrToolPathCommand( result2, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), _createShellShimRepository, new EnvironmentPathInstructionMock(_reporter, _pathToPlaceShim, true), _reporter); @@ -463,7 +464,7 @@ public void WhenInstallWithLowerVersionWithAllowDowngradeOptionItShouldDowngrade var toolInstallGlobalOrToolPathCommand = new ToolInstallGlobalOrToolPathCommand( result, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), _createShellShimRepository, new EnvironmentPathInstructionMock(_reporter, _pathToPlaceShim, true), _reporter); @@ -485,7 +486,7 @@ public void WhenInstallWithLowerVersionWithAllowDowngradeOptionItShouldDowngrade var toolInstallGlobalOrToolPathCommand2 = new ToolInstallGlobalOrToolPathCommand( result2, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), _createShellShimRepository, new EnvironmentPathInstructionMock(_reporter, _pathToPlaceShim, true), _reporter); @@ -511,7 +512,7 @@ public void WhenInstallWithLowerVersionItShouldFail() var toolInstallGlobalOrToolPathCommand = new ToolInstallGlobalOrToolPathCommand( result, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), _createShellShimRepository, new EnvironmentPathInstructionMock(_reporter, _pathToPlaceShim, true), _reporter); @@ -533,7 +534,7 @@ public void WhenInstallWithLowerVersionItShouldFail() var toolInstallGlobalOrToolPathCommand2 = new ToolInstallGlobalOrToolPathCommand( result2, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), _createShellShimRepository, new EnvironmentPathInstructionMock(_reporter, _pathToPlaceShim, true), _reporter); @@ -589,16 +590,36 @@ public void WhenRunWithValidBareVersionItShouldInterpretAsNuGetExactVersion() { const string nugetSourcePath = "https://api.nuget.org/v3/index.json"; var testDir = _testAssetsManager.CreateTestDirectory().Path; + var ridGraphPath = TestContext.GetRuntimeGraphFilePath(); - var toolInstallGlobalOrToolPathCommand = new DotnetCommand(Log, "tool", "install", "-g", UnlistedPackageId, "--version", "0.5.0", "--add-source", nugetSourcePath) - .WithEnvironmentVariable("DOTNET_SKIP_WORKLOAD_INTEGRITY_CHECK", "true") - .WithWorkingDirectory(testDir); - - toolInstallGlobalOrToolPathCommand.Execute().Should().Pass(); + var toolInstallCommand = new ToolInstallGlobalOrToolPathCommand(Parser.Instance.Parse($"dotnet tool install -g {UnlistedPackageId} --version 0.5.0 --add-source {nugetSourcePath}"), + createToolPackageStoreDownloaderUninstaller: (nonGlobalLocation, _, _) => + { + ToolPackageStoreAndQuery toolPackageStore = ToolPackageFactory.CreateToolPackageStoreQuery(nonGlobalLocation); + var toolPackageDownloader = new ToolPackageDownloader(toolPackageStore, ridGraphPath, currentWorkingDirectory: testDir); + var toolPackageUninstaller = new ToolPackageUninstaller( + toolPackageStore); + + return (toolPackageStore, toolPackageStore, toolPackageDownloader, toolPackageUninstaller); + }, + createShellShimRepository: _createShellShimRepository, + nugetPackageDownloader: new NuGetPackageDownloader(new DirectoryPath(PathUtilities.CreateTempSubdirectory()), verifySignatures: false, currentWorkingDirectory: testDir), + currentWorkingDirectory: testDir, + verifySignatures: false); + toolInstallCommand.Execute().Should().Be(0); // Uninstall the unlisted package - var toolUninstallCommand = new DotnetCommand(Log, "tool", "uninstall", "-g", UnlistedPackageId); - toolUninstallCommand.Execute().Should().Pass(); + var toolUninstallCommand = new ToolUninstallGlobalOrToolPathCommand(Parser.Instance.Parse("dotnet tool uninstall -g " + UnlistedPackageId), + // This is technically not _createShellShimRepository because that is a Microsoft.DotNet.Tools.Tool.Install.CreateShellShimRepository. + // This is a Microsoft.DotNet.Tools.Tool.Uninstall.CreateShellShimRepository. + createShellShimRepository: (_, nonGlobalLocation) => new ShellShimRepository( + new DirectoryPath(_pathToPlaceShim), + string.Empty, + fileSystem: _fileSystem, + appHostShellShimMaker: new AppHostShellShimMakerMock(_fileSystem), + filePermissionSetter: new NoOpFilePermissionSetter())); + // var toolUninstallCommand = new DotnetCommand(Log, "tool", "uninstall", "-g", UnlistedPackageId); + toolUninstallCommand.Execute().Should().Be(0); } [Fact] @@ -624,7 +645,7 @@ public void WhenRunWithPrereleaseItShouldSucceed() var toolInstallGlobalOrToolPathCommand = new ToolInstallGlobalOrToolPathCommand( result, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), _createShellShimRepository, _environmentPathInstructionMock, _reporter); @@ -651,7 +672,7 @@ public void WhenRunWithPrereleaseAndPackageVersionItShouldThrow() var toolInstallGlobalOrToolPathCommand = new ToolInstallGlobalOrToolPathCommand( result, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, toolToolPackageDownloader, _toolPackageUninstallerMock), _createShellShimRepository, _environmentPathInstructionMock, _reporter); @@ -842,7 +863,7 @@ public void AndPackagedShimIsProvidedWhenRunWithPackageIdItCreateShimUsingPackag var installCommand = new ToolInstallGlobalOrToolPathCommand( result, _packageId, - (location, forwardArguments) => (_toolPackageStore, _toolPackageStoreQuery, new ToolPackageDownloaderMock( + (location, forwardArguments, currentWorkingDirectory) => (_toolPackageStore, _toolPackageStoreQuery, new ToolPackageDownloaderMock( fileSystem: _fileSystem, store: _toolPackageStore, packagedShimsMap: packagedShimsMap, diff --git a/test/dotnet.Tests/CommandTests/ToolUninstallGlobalOrToolPathCommandTests.cs b/test/dotnet.Tests/CommandTests/ToolUninstallGlobalOrToolPathCommandTests.cs index 644464ffbc83..d974d4bed9d4 100644 --- a/test/dotnet.Tests/CommandTests/ToolUninstallGlobalOrToolPathCommandTests.cs +++ b/test/dotnet.Tests/CommandTests/ToolUninstallGlobalOrToolPathCommandTests.cs @@ -240,7 +240,7 @@ private ToolInstallGlobalOrToolPathCommand CreateInstallCommand(string options) return new ToolInstallGlobalOrToolPathCommand( result, new PackageId(PackageId), - (location, forwardArguments) => (store, store, packageDownloaderMock, toolPackageDownloaderMock), + (location, forwardArguments, currentWorkingDirectory) => (store, store, packageDownloaderMock, toolPackageDownloaderMock), (_, _) => new ShellShimRepository( new DirectoryPath(_shimsDirectory), string.Empty, diff --git a/test/dotnet.Tests/CommandTests/ToolUpdateGlobalOrToolPathCommandTests.cs b/test/dotnet.Tests/CommandTests/ToolUpdateGlobalOrToolPathCommandTests.cs index cef787bdc94d..aa5750195c41 100644 --- a/test/dotnet.Tests/CommandTests/ToolUpdateGlobalOrToolPathCommandTests.cs +++ b/test/dotnet.Tests/CommandTests/ToolUpdateGlobalOrToolPathCommandTests.cs @@ -148,7 +148,7 @@ public void GivenAnExistedLowerversionInstallationWhenCallFromRedirectorItCanUpd var toolUpdateGlobalOrToolPathCommand = new ToolUpdateGlobalOrToolPathCommand( result, - (location, forwardArguments) => (_store, _store, new ToolPackageDownloaderMock( + (location, forwardArguments, currentWorkingDirectory) => (_store, _store, new ToolPackageDownloaderMock( store: _store, fileSystem: _fileSystem, reporter: _reporter, @@ -320,7 +320,7 @@ public void GivenAnExistedLowerversionWhenReinstallThrowsIthasTheFirstLineIndica var command = new ToolUpdateGlobalOrToolPathCommand( result, - (location, forwardArguments) => (_store, _store, + (location, forwardArguments, currentWorkingDirectory) => (_store, _store, new ToolPackageDownloaderMock( store: _store, fileSystem: _fileSystem, @@ -347,7 +347,7 @@ public void GivenAnExistedLowerversionWhenReinstallThrowsItRollsBack() var command = new ToolUpdateGlobalOrToolPathCommand( result, - (location, forwardArguments) => (_store, _store, + (location, forwardArguments, currentWorkingDirectory) => (_store, _store, new ToolPackageDownloaderMock( store: _store, fileSystem: _fileSystem, @@ -385,7 +385,7 @@ public void GivenPackagedShimIsProvidedWhenRunWithPackageIdItCreatesShimUsingPac var command = new ToolUpdateGlobalOrToolPathCommand( result, - (_, _) => (_store, _store, new ToolPackageDownloaderMock( + (_, _, _) => (_store, _store, new ToolPackageDownloaderMock( store:_store, fileSystem: _fileSystem, reporter: _reporter, @@ -418,7 +418,7 @@ private ToolInstallGlobalOrToolPathCommand CreateInstallCommand(string options, return new ToolInstallGlobalOrToolPathCommand( result, packageId is null ? _packageId : new PackageId(packageId) , - (location, forwardArguments) => (_store, _store, new ToolPackageDownloaderMock( + (location, forwardArguments, currentWorkingDirectory) => (_store, _store, new ToolPackageDownloaderMock( store: _store, fileSystem: _fileSystem, _reporter, @@ -435,7 +435,7 @@ private ToolUpdateGlobalOrToolPathCommand CreateUpdateCommand(string options) return new ToolUpdateGlobalOrToolPathCommand( result, - (location, forwardArguments) => (_store, _store, new ToolPackageDownloaderMock( + (location, forwardArguments, currentWorkingDirectory) => (_store, _store, new ToolPackageDownloaderMock( store: _store, fileSystem: _fileSystem, _reporter,