From ecfaa75fe9ddc1b1f501a013639f556ae89c59db Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Tue, 17 Aug 2021 14:47:15 +0200 Subject: [PATCH 01/32] restore-toolset.sh: remove EOL 1.x versions. --- eng/restore-toolset.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/eng/restore-toolset.sh b/eng/restore-toolset.sh index c5e939fb808f..77a6f32111ff 100644 --- a/eng/restore-toolset.sh +++ b/eng/restore-toolset.sh @@ -20,10 +20,10 @@ function InitializeCustomSDKToolset { fi InitializeDotNetCli true - if [[ "$DISTRO" != "ubuntu" || "$MAJOR_VERSION" -le 16 ]]; then - InstallDotNetSharedFramework "1.0.5" - InstallDotNetSharedFramework "1.1.2" - fi + # if [[ "$DISTRO" != "ubuntu" || "$MAJOR_VERSION" -le 16 ]]; then + # InstallDotNetSharedFramework "1.0.5" + # InstallDotNetSharedFramework "1.1.2" + # fi InstallDotNetSharedFramework "2.1.0" InstallDotNetSharedFramework "2.2.8" InstallDotNetSharedFramework "3.1.0" From e1908410f0c3288d7d9e1afe619f289c52d1e428 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Tue, 17 Aug 2021 15:41:26 +0200 Subject: [PATCH 02/32] Support user local workload installs. --- .../Microsoft.DotNet.Configurer.csproj | 1 + .../ToolPackageFolderPathCalculator.cs | 16 --- .../ShellShim/EnvironmentPathFactory.cs | 11 +- .../install/NetSdkManagedInstaller.cs | 112 ++++++++++-------- ...etSdkManagedInstallationRecordInstaller.cs | 44 +++++-- .../install/WorkloadInstallerFactory.cs | 5 +- src/Cli/dotnet/dotnet.csproj | 2 + .../CliFolderPathCalculator.cs | 42 ++++--- src/Common/WorkloadInstall.cs | 14 +++ .../Microsoft.DotNet.TemplateLocator.csproj | 2 + ...Microsoft.DotNet.MSBuildSdkResolver.csproj | 2 + ....NET.Sdk.WorkloadMSBuildSdkResolver.csproj | 2 + ...soft.NET.Sdk.WorkloadManifestReader.csproj | 2 + .../SdkDirectoryWorkloadManifestProvider.cs | 13 +- .../WorkloadResolver.cs | 9 +- .../Microsoft.NET.Build.Tasks.csproj | 2 + .../ProcessFrameworkReferences.cs | 10 ++ .../GivenAPathCalculator.cs | 2 +- ...atTheUserIsRunningDotNetForTheFirstTime.cs | 4 +- src/Tests/dotnet.Tests/dotnet.Tests.csproj | 4 + 20 files changed, 195 insertions(+), 104 deletions(-) delete mode 100644 src/Cli/Microsoft.DotNet.Configurer/ToolPackageFolderPathCalculator.cs rename src/{Cli/Microsoft.DotNet.Configurer => Common}/CliFolderPathCalculator.cs (65%) create mode 100644 src/Common/WorkloadInstall.cs diff --git a/src/Cli/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj b/src/Cli/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj index e9cdbfb81324..b3689ca50761 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj +++ b/src/Cli/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj @@ -13,6 +13,7 @@ + diff --git a/src/Cli/Microsoft.DotNet.Configurer/ToolPackageFolderPathCalculator.cs b/src/Cli/Microsoft.DotNet.Configurer/ToolPackageFolderPathCalculator.cs deleted file mode 100644 index 4323520ddfb7..000000000000 --- a/src/Cli/Microsoft.DotNet.Configurer/ToolPackageFolderPathCalculator.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.IO; - -namespace Microsoft.DotNet.Configurer -{ - public static class ToolPackageFolderPathCalculator - { - private const string NestedToolPackageFolderName = ".store"; - public static string GetToolPackageFolderPath(string toolsShimPath) - { - return Path.Combine(toolsShimPath, NestedToolPackageFolderName); - } - } -} diff --git a/src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs b/src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs index ec16b2cc2157..8a83d773c3bf 100644 --- a/src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs +++ b/src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs @@ -43,7 +43,7 @@ public static IEnvironmentPath CreateEnvironmentPath( else if (OperatingSystem.IsLinux() && isDotnetBeingInvokedFromNativeInstaller) { environmentPath = new LinuxEnvironmentPath( - CliFolderPathCalculator.ToolsShimPathInUnix, + ToolsShimPathInUnix, Reporter.Output, environmentProvider, new FileWrapper()); @@ -51,7 +51,7 @@ public static IEnvironmentPath CreateEnvironmentPath( else if (OperatingSystem.IsMacOS() && isDotnetBeingInvokedFromNativeInstaller) { environmentPath = new OsxBashEnvironmentPath( - executablePath: CliFolderPathCalculator.ToolsShimPathInUnix, + executablePath: ToolsShimPathInUnix, reporter: Reporter.Output, environmentProvider: environmentProvider, fileSystem: new FileWrapper()); @@ -71,7 +71,7 @@ public static IEnvironmentPathInstruction CreateEnvironmentPathInstruction( if (OperatingSystem.IsMacOS() && ZshDetector.IsZshTheUsersShell(environmentProvider)) { return new OsxZshEnvironmentPathInstruction( - executablePath: CliFolderPathCalculator.ToolsShimPathInUnix, + executablePath: ToolsShimPathInUnix, reporter: Reporter.Output, environmentProvider: environmentProvider); } @@ -88,5 +88,10 @@ public static IEnvironmentPathInstruction CreateEnvironmentPathInstruction( return CreateEnvironmentPath(true, environmentProvider); } + + private static BashPathUnderHomeDirectory ToolsShimPathInUnix => + new BashPathUnderHomeDirectory( + CliFolderPathCalculator.DotnetHomePath, + Path.Combine(CliFolderPathCalculator.DotnetProfileDirectoryName, CliFolderPathCalculator.ToolsShimFolderName)); } } diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs index 320a4482e5e5..b74789660419 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs @@ -8,6 +8,7 @@ using Microsoft.DotNet.Cli; using Microsoft.DotNet.Cli.NuGetPackageDownloader; using Microsoft.DotNet.Cli.Utils; +using Microsoft.DotNet.Configurer; using Microsoft.DotNet.ToolPackage; using Microsoft.Extensions.EnvironmentAbstractions; using Microsoft.NET.Sdk.WorkloadManifestReader; @@ -22,9 +23,11 @@ namespace Microsoft.DotNet.Workloads.Workload.Install internal class NetSdkManagedInstaller : IWorkloadPackInstaller { private readonly IReporter _reporter; - private readonly string _workloadMetadataDir; - private readonly string _installedPacksDir = "InstalledPacks"; + private readonly string _dotnetWorkloadMetadataDir; + private readonly string _userWorkloadMetadataDir; + private const string InstalledPacksDir = "InstalledPacks"; protected readonly string _dotnetDir; + protected readonly string _userProfileDir; protected readonly DirectoryPath _tempPackagesDir; private readonly INuGetPackageDownloader _nugetPackageDownloader; private readonly IWorkloadResolver _workloadResolver; @@ -40,11 +43,13 @@ public NetSdkManagedInstaller(IReporter reporter, IWorkloadResolver workloadResolver, INuGetPackageDownloader nugetPackageDownloader = null, string dotnetDir = null, + string userProfileDir = null, string tempDirPath = null, VerbosityOptions verbosity = VerbosityOptions.normal, PackageSourceLocation packageSourceLocation = null, RestoreActionConfig restoreActionConfig = null) { + _userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; _dotnetDir = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath); _tempPackagesDir = new DirectoryPath(tempDirPath ?? Path.GetTempPath()); ILogger logger = verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger(); @@ -53,11 +58,12 @@ public NetSdkManagedInstaller(IReporter reporter, new NuGetPackageDownloader(_tempPackagesDir, filePermissionSetter: null, new FirstPartyNuGetPackageSigningVerifier(_tempPackagesDir), logger, restoreActionConfig: _restoreActionConfig); - _workloadMetadataDir = Path.Combine(_dotnetDir, "metadata", "workloads"); + _dotnetWorkloadMetadataDir = Path.Combine(dotnetDir, "metadata", "workloads"); + _userWorkloadMetadataDir = Path.Combine(_userProfileDir, "metadata", "workloads"); _reporter = reporter; _sdkFeatureBand = sdkFeatureBand; _workloadResolver = workloadResolver; - _installationRecordRepository = new NetSdkManagedInstallationRecordRepository(_dotnetDir); + _installationRecordRepository = new NetSdkManagedInstallationRecordRepository(_dotnetDir, _userProfileDir); _packageSourceLocation = packageSourceLocation; } @@ -179,7 +185,7 @@ public void RepairWorkloadPack(PackInfo packInfo, SdkFeatureBand sdkFeatureBand, public void RollBackWorkloadPackInstall(PackInfo packInfo, SdkFeatureBand sdkFeatureBand, DirectoryPath? offlineCache = null) { DeletePackInstallationRecord(packInfo, sdkFeatureBand); - if (!PackHasInstallRecords(packInfo)) + if (!PackHasInstallRecords(packInfo, sdkFeatureBand)) { DeletePack(packInfo); } @@ -190,7 +196,9 @@ public void InstallWorkloadManifest(ManifestId manifestId, ManifestVersion manif string packagePath = null; string tempExtractionDir = null; string tempBackupDir = null; - var manifestPath = Path.Combine(_dotnetDir, "sdk-manifests", sdkFeatureBand.ToString(), manifestId.ToString()); + string rootInstallDir = WorkloadInstall.IsUserLocal(_dotnetDir, sdkFeatureBand.ToString()) ? _userProfileDir : _dotnetDir; + // TODO: do we need to use something from _dotnetDir sdk-manifests for user local install? + var manifestPath = Path.Combine(rootInstallDir, "sdk-manifests", sdkFeatureBand.ToString(), manifestId.ToString()); _reporter.WriteLine(string.Format(LocalizableStrings.InstallingWorkloadManifest, manifestId, manifestVersion)); @@ -287,66 +295,71 @@ public void DownloadToOfflineCache(PackInfo packInfo, DirectoryPath cachePath, b public void GarbageCollectInstalledWorkloadPacks(DirectoryPath? offlineCache = null) { - var installedPacksDir = Path.Combine(_workloadMetadataDir, _installedPacksDir, "v1"); var installedSdkFeatureBands = _installationRecordRepository.GetFeatureBandsWithInstallationRecords(); _reporter.WriteLine(string.Format(LocalizableStrings.GarbageCollectingSdkFeatureBandsMessage, string.Join(" ", installedSdkFeatureBands))); var currentBandInstallRecords = GetExpectedPackInstallRecords(_sdkFeatureBand); - if (!Directory.Exists(installedPacksDir)) + foreach (var installedPacksDir in new[] { + Path.Combine(_dotnetWorkloadMetadataDir, InstalledPacksDir, "v1"), + Path.Combine(_userWorkloadMetadataDir, InstalledPacksDir, "v1") + }) { - return; - } + if (!Directory.Exists(installedPacksDir)) + { + continue; + } - foreach (var packIdDir in Directory.GetDirectories(installedPacksDir)) - { - foreach (var packVersionDir in Directory.GetDirectories(packIdDir)) + foreach (var packIdDir in Directory.GetDirectories(installedPacksDir)) { - var bandRecords = Directory.GetFileSystemEntries(packVersionDir); + foreach (var packVersionDir in Directory.GetDirectories(packIdDir)) + { + var bandRecords = Directory.GetFileSystemEntries(packVersionDir); - var unneededBandRecords = bandRecords - .Where(recordPath => !installedSdkFeatureBands.Contains(new SdkFeatureBand(Path.GetFileName(recordPath)))); + var unneededBandRecords = bandRecords + .Where(recordPath => !installedSdkFeatureBands.Contains(new SdkFeatureBand(Path.GetFileName(recordPath)))); - var currentBandRecordPath = Path.Combine(packVersionDir, _sdkFeatureBand.ToString()); - if (bandRecords.Contains(currentBandRecordPath) && !currentBandInstallRecords.Contains(currentBandRecordPath)) - { - unneededBandRecords = unneededBandRecords.Append(currentBandRecordPath); - } + var currentBandRecordPath = Path.Combine(packVersionDir, _sdkFeatureBand.ToString()); + if (bandRecords.Contains(currentBandRecordPath) && !currentBandInstallRecords.Contains(currentBandRecordPath)) + { + unneededBandRecords = unneededBandRecords.Append(currentBandRecordPath); + } - if (!unneededBandRecords.Any()) - { - continue; - } + if (!unneededBandRecords.Any()) + { + continue; + } - // Save the pack info in case we need to delete the pack - var jsonPackInfo = File.ReadAllText(unneededBandRecords.First()); - foreach (var unneededRecord in unneededBandRecords) - { - File.Delete(unneededRecord); - } + // Save the pack info in case we need to delete the pack + var jsonPackInfo = File.ReadAllText(unneededBandRecords.First()); + foreach (var unneededRecord in unneededBandRecords) + { + File.Delete(unneededRecord); + } - if (!bandRecords.Except(unneededBandRecords).Any()) - { - Directory.Delete(packVersionDir); - var deletablePack = GetPackInfo(packVersionDir); - if (deletablePack == null) + if (!bandRecords.Except(unneededBandRecords).Any()) { - // Pack no longer exists in manifests, get pack info from installation record - deletablePack = JsonSerializer.Deserialize(jsonPackInfo, typeof(PackInfo)) as PackInfo; + Directory.Delete(packVersionDir); + var deletablePack = GetPackInfo(packVersionDir); + if (deletablePack == null) + { + // Pack no longer exists in manifests, get pack info from installation record + deletablePack = JsonSerializer.Deserialize(jsonPackInfo, typeof(PackInfo)) as PackInfo; + } + DeletePack(deletablePack); } - DeletePack(deletablePack); } - } - if (!Directory.GetFileSystemEntries(packIdDir).Any()) - { - Directory.Delete(packIdDir); + if (!Directory.GetFileSystemEntries(packIdDir).Any()) + { + Directory.Delete(packIdDir); + } } } } public IEnumerable<(WorkloadPackId, string)> GetInstalledPacks(SdkFeatureBand sdkFeatureBand) { - var installedPacksDir = Path.Combine(_workloadMetadataDir, _installedPacksDir, "v1"); + var installedPacksDir = Path.Combine(GetWorkloadMetadataDir(sdkFeatureBand), InstalledPacksDir, "v1"); if (!Directory.Exists(installedPacksDir)) { return Enumerable.Empty<(WorkloadPackId, string)>(); @@ -429,7 +442,7 @@ private void DeletePack(PackInfo packInfo) } private string GetPackInstallRecordPath(PackInfo packInfo, SdkFeatureBand featureBand) => - Path.Combine(_workloadMetadataDir, _installedPacksDir, "v1", packInfo.Id, packInfo.Version, featureBand.ToString()); + Path.Combine(GetWorkloadMetadataDir(featureBand), InstalledPacksDir, "v1", packInfo.Id, packInfo.Version, featureBand.ToString()); private void WritePackInstallationRecord(PackInfo packInfo, SdkFeatureBand featureBand) { @@ -463,12 +476,17 @@ private void DeletePackInstallationRecord(PackInfo packInfo, SdkFeatureBand feat } } - private bool PackHasInstallRecords(PackInfo packInfo) + private bool PackHasInstallRecords(PackInfo packInfo, SdkFeatureBand sdkFeatureBand) { - var packInstallRecordDir = Path.Combine(_workloadMetadataDir, _installedPacksDir, "v1", packInfo.Id, packInfo.Version); + var packInstallRecordDir = Path.Combine(GetWorkloadMetadataDir(sdkFeatureBand), InstalledPacksDir, "v1", packInfo.Id, packInfo.Version); return Directory.Exists(packInstallRecordDir) && Directory.GetFiles(packInstallRecordDir).Any(); } private bool IsSingleFilePack(PackInfo packInfo) => packInfo.Kind.Equals(WorkloadPackKind.Library) || packInfo.Kind.Equals(WorkloadPackKind.Template); + + private string GetWorkloadMetadataDir(SdkFeatureBand sdkFeatureBand) + { + return WorkloadInstall.IsUserLocal(_dotnetDir, sdkFeatureBand.ToString()) ? _userWorkloadMetadataDir : _dotnetWorkloadMetadataDir; + } } } diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallRecords/NetSdkManagedInstallationRecordInstaller.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallRecords/NetSdkManagedInstallationRecordInstaller.cs index b34fce388dc6..c75981635703 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallRecords/NetSdkManagedInstallationRecordInstaller.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallRecords/NetSdkManagedInstallationRecordInstaller.cs @@ -6,37 +6,52 @@ using System.IO; using System.Linq; using Microsoft.NET.Sdk.WorkloadManifestReader; +using Microsoft.DotNet.Configurer; namespace Microsoft.DotNet.Workloads.Workload.Install.InstallRecord { internal class NetSdkManagedInstallationRecordRepository : IWorkloadInstallationRecordRepository { - private readonly string _workloadMetadataDir; - private readonly string _installedWorkloadDir = "InstalledWorkloads"; + private readonly string _dotnetDir; + private readonly string _dotnetWorkloadMetadataDir; + private readonly string _userWorkloadMetadataDir; + private const string InstalledWorkloadDir = "InstalledWorkloads"; - public NetSdkManagedInstallationRecordRepository(string dotnetDir) + public NetSdkManagedInstallationRecordRepository(string dotnetDir, string userProfileDir) { - _workloadMetadataDir = Path.Combine(dotnetDir, "metadata", "workloads"); + _dotnetDir = dotnetDir; + _dotnetWorkloadMetadataDir = Path.Combine(dotnetDir, "metadata", "workloads"); + + userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; + _userWorkloadMetadataDir = Path.Combine(userProfileDir, "metadata", "workloads"); } public IEnumerable GetFeatureBandsWithInstallationRecords() { - if (Directory.Exists(_workloadMetadataDir)) + if (Directory.Exists(_dotnetWorkloadMetadataDir)) { - var bands = Directory.EnumerateDirectories(_workloadMetadataDir); - return bands - .Where(band => Directory.Exists(Path.Combine(band, _installedWorkloadDir)) && Directory.GetFiles(Path.Combine(band, _installedWorkloadDir)).Any()) - .Select(path => new SdkFeatureBand(Path.GetFileName(path))); + var dotnetBands = Directory.EnumerateDirectories(_dotnetWorkloadMetadataDir) + .Where(band => HasInstalledWorkload(band)); + var userBands = Directory.Exists(_userWorkloadMetadataDir) + ? Directory.EnumerateDirectories(_userWorkloadMetadataDir) + .Where(band => WorkloadInstall.IsUserLocal(_dotnetDir, band) && HasInstalledWorkload(band)) + : Enumerable.Empty(); + return dotnetBands + .Concat(userBands) + .Select(path => new SdkFeatureBand(Path.GetFileName(path))); } else { return new List(); } + + static bool HasInstalledWorkload(string bandDir) + => Directory.Exists(Path.Combine(bandDir, InstalledWorkloadDir)) && Directory.GetFiles(Path.Combine(bandDir, InstalledWorkloadDir)).Any(); } public IEnumerable GetInstalledWorkloads(SdkFeatureBand featureBand) { - var path = Path.Combine(_workloadMetadataDir, featureBand.ToString(), _installedWorkloadDir); + var path = Path.Combine(GetSdkWorkloadMetadataDir(featureBand), InstalledWorkloadDir); if (Directory.Exists(path)) { return Directory.EnumerateFiles(path) @@ -50,7 +65,7 @@ public IEnumerable GetInstalledWorkloads(SdkFeatureBand featureBand) public void WriteWorkloadInstallationRecord(WorkloadId workloadId, SdkFeatureBand featureBand) { - var path = Path.Combine(_workloadMetadataDir, featureBand.ToString(), _installedWorkloadDir, workloadId.ToString()); + var path = Path.Combine(GetSdkWorkloadMetadataDir(featureBand), InstalledWorkloadDir, workloadId.ToString()); if (!File.Exists(path)) { var pathDir = Path.GetDirectoryName(path); @@ -64,11 +79,16 @@ public void WriteWorkloadInstallationRecord(WorkloadId workloadId, SdkFeatureBan public void DeleteWorkloadInstallationRecord(WorkloadId workloadId, SdkFeatureBand featureBand) { - var path = Path.Combine(_workloadMetadataDir, featureBand.ToString(), _installedWorkloadDir, workloadId.ToString()); + var path = Path.Combine(GetSdkWorkloadMetadataDir(featureBand), InstalledWorkloadDir, workloadId.ToString()); if (File.Exists(path)) { File.Delete(path); } } + + private string GetSdkWorkloadMetadataDir(SdkFeatureBand featureBand) + { + return Path.Combine(WorkloadInstall.IsUserLocal(_dotnetDir, featureBand.ToString()) ? _userWorkloadMetadataDir : _dotnetWorkloadMetadataDir, featureBand.ToString()); + } } } diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs index 431e4e823ea4..02aa08f7d88a 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs @@ -40,7 +40,7 @@ public static IInstaller GetWorkloadInstaller( nugetPackageDownloader, verbosity, packageSourceLocation, reporter, tempDirPath); } - if (elevationRequired && !CanWriteToDotnetRoot(dotnetDir)) + if (elevationRequired && !WorkloadInstall.IsUserLocal(dotnetDir, sdkFeatureBand.ToString()) && !CanWriteToDotnetRoot(dotnetDir)) { throw new GracefulException(LocalizableStrings.InadequatePermissions, isUserError: false); } @@ -63,6 +63,7 @@ public static IInstaller GetWorkloadInstaller( /// The associated with the SDK. public static InstallType GetWorkloadInstallType(SdkFeatureBand sdkFeatureBand, string dotnetDir) { + // TODO: does this file come with the SDK under dotnetDir? Or can it be under the userProfileDir for local installs? string installerTypePath = Path.Combine(dotnetDir, "metadata", "workloads", $"{sdkFeatureBand}", "installertype"); @@ -74,7 +75,7 @@ public static InstallType GetWorkloadInstallType(SdkFeatureBand sdkFeatureBand, return InstallType.FileBased; } - private static bool CanWriteToDotnetRoot(string dotnetDir = null) + private static bool CanWriteToDotnetRoot(string dotnetDir = null) // TODO { dotnetDir = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath); try diff --git a/src/Cli/dotnet/dotnet.csproj b/src/Cli/dotnet/dotnet.csproj index 713b797cd209..96c8bce2c18d 100644 --- a/src/Cli/dotnet/dotnet.csproj +++ b/src/Cli/dotnet/dotnet.csproj @@ -18,6 +18,8 @@ + + diff --git a/src/Cli/Microsoft.DotNet.Configurer/CliFolderPathCalculator.cs b/src/Common/CliFolderPathCalculator.cs similarity index 65% rename from src/Cli/Microsoft.DotNet.Configurer/CliFolderPathCalculator.cs rename to src/Common/CliFolderPathCalculator.cs index a4d1d81b06ba..bfd8326df04b 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/CliFolderPathCalculator.cs +++ b/src/Common/CliFolderPathCalculator.cs @@ -4,32 +4,27 @@ using System; using System.IO; using System.Runtime.InteropServices; -using Microsoft.DotNet.Cli.Utils; -using NuGet.Common; +// using Microsoft.DotNet.Cli.Utils; +// using NuGet.Common; namespace Microsoft.DotNet.Configurer { - public static class CliFolderPathCalculator + static class CliFolderPathCalculator { public const string DotnetHomeVariableName = "DOTNET_CLI_HOME"; - private const string DotnetProfileDirectoryName = ".dotnet"; - private const string ToolsShimFolderName = "tools"; + public const string DotnetProfileDirectoryName = ".dotnet"; + public const string ToolsShimFolderName = "tools"; private const string ToolsResolverCacheFolderName = "toolResolverCache"; public static string CliFallbackFolderPath => Environment.GetEnvironmentVariable("DOTNET_CLI_TEST_FALLBACKFOLDER") ?? - Path.Combine(new DirectoryInfo(AppContext.BaseDirectory).Parent.FullName, "NuGetFallbackFolder"); + Path.Combine(new DirectoryInfo(AppContext.BaseDirectory).Parent!.FullName, "NuGetFallbackFolder"); public static string ToolsShimPath => Path.Combine(DotnetUserProfileFolderPath, ToolsShimFolderName); public static string ToolsPackagePath => ToolPackageFolderPathCalculator.GetToolPackageFolderPath(ToolsShimPath); - public static BashPathUnderHomeDirectory ToolsShimPathInUnix => - new BashPathUnderHomeDirectory( - DotnetHomePath, - Path.Combine(DotnetProfileDirectoryName, ToolsShimFolderName)); - public static string WindowsNonExpandedToolsShimPath { get @@ -46,7 +41,7 @@ public static string WindowsNonExpandedToolsShimPath public static string ToolsResolverCachePath => Path.Combine(DotnetUserProfileFolderPath, ToolsResolverCacheFolderName); public static string PlatformHomeVariableName => - OperatingSystem.IsWindows() ? "USERPROFILE" : "HOME"; + IsWindows ? "USERPROFILE" : "HOME"; public static string DotnetHomePath { @@ -58,11 +53,12 @@ public static string DotnetHomePath home = Environment.GetEnvironmentVariable(PlatformHomeVariableName); if (string.IsNullOrEmpty(home)) { - throw new ConfigurationException( - string.Format( - LocalizableStrings.FailedToDetermineUserHomeDirectory, - DotnetHomeVariableName)) - .DisplayAsError(); + throw new Exception(); // TODO + // throw new ConfigurationException( + // string.Format( + // LocalizableStrings.FailedToDetermineUserHomeDirectory, + // DotnetHomeVariableName)) + // .DisplayAsError(); } } @@ -70,7 +66,15 @@ public static string DotnetHomePath } } - public static string NuGetUserSettingsDirectory => - NuGetEnvironment.GetFolderPath(NuGetFolderPath.UserSettingsDirectory); + private static bool IsWindows => Path.DirectorySeparatorChar == '\\'; + } + + static class ToolPackageFolderPathCalculator + { + private const string NestedToolPackageFolderName = ".store"; + public static string GetToolPackageFolderPath(string toolsShimPath) + { + return Path.Combine(toolsShimPath, NestedToolPackageFolderName); + } } } diff --git a/src/Common/WorkloadInstall.cs b/src/Common/WorkloadInstall.cs new file mode 100644 index 000000000000..5247ec314fa8 --- /dev/null +++ b/src/Common/WorkloadInstall.cs @@ -0,0 +1,14 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.IO; + +static class WorkloadInstall +{ + public static bool IsUserLocal(string dotnetDir, string sdkFeatureBand) + { + string userlocalPath = Path.Combine(dotnetDir, "metadata", "workloads", sdkFeatureBand, "userlocal"); + + return File.Exists(userlocalPath); + } +} \ No newline at end of file diff --git a/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj b/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj index 9a22d5c9456e..691f681985ba 100644 --- a/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj +++ b/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj @@ -50,6 +50,8 @@ + + diff --git a/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj b/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj index 52571225e855..71ddeb887c00 100644 --- a/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj +++ b/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj @@ -70,6 +70,8 @@ LinkBase="WorkloadInstallRecords" /> + + diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj b/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj index 6be21db86107..90320ad7ecb3 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj @@ -23,6 +23,8 @@ + + diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj index 3998497c7d7c..9bf383d55f72 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj @@ -19,6 +19,8 @@ + + diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs index 46b6aa5fa2e8..51d0ea0ed636 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using Microsoft.DotNet.Cli; +using Microsoft.DotNet.Configurer; using Microsoft.NET.Sdk.Localization; namespace Microsoft.NET.Sdk.WorkloadManifestReader @@ -25,7 +26,7 @@ public SdkDirectoryWorkloadManifestProvider(string sdkRootPath, string sdkVersio } - internal SdkDirectoryWorkloadManifestProvider(string sdkRootPath, string sdkVersion, Func getEnvironmentVariable) + internal SdkDirectoryWorkloadManifestProvider(string sdkRootPath, string sdkVersion, Func getEnvironmentVariable, string userProfileDir = null!) { if (string.IsNullOrWhiteSpace(sdkVersion)) { @@ -75,6 +76,16 @@ static int Last2DigitsTo0(int versionBuild) { _manifestDirectories = new[] { manifestDirectory }; } + + userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; + if (WorkloadInstall.IsUserLocal(_sdkRootPath, sdkVersion) && Directory.Exists(userProfileDir)) + { + string userManifestsDir = Path.Combine(userProfileDir, "sdk-manifests", _sdkVersionBand); + if (Directory.Exists(userManifestsDir)) + { + _manifestDirectories = new[] { userManifestsDir }.Concat(_manifestDirectories).ToArray(); + } + } } public IEnumerable<(string manifestId, string? informationalPath, Func openManifestStream)> GetManifests() diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs index 7a2f6b916435..5c281aa3f387 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using Microsoft.DotNet.Cli; +using Microsoft.DotNet.Configurer; using Microsoft.NET.Sdk.Localization; using FXVersion = Microsoft.DotNet.MSBuildSdkResolver.FXVersion; @@ -27,7 +28,7 @@ public class WorkloadResolver : IWorkloadResolver private Func? _fileExistOverride; private Func? _directoryExistOverride; - public static WorkloadResolver Create(IWorkloadManifestProvider manifestProvider, string dotnetRootPath, string sdkVersion) + public static WorkloadResolver Create(IWorkloadManifestProvider manifestProvider, string dotnetRootPath, string sdkVersion, string userProfileDir = null!) { string runtimeIdentifierChainPath = Path.Combine(dotnetRootPath, "sdk", sdkVersion, "NETCoreSdkRuntimeIdentifierChain.txt"); string[] currentRuntimeIdentifiers = File.Exists(runtimeIdentifierChainPath) ? @@ -46,6 +47,12 @@ public static WorkloadResolver Create(IWorkloadManifestProvider manifestProvider dotnetRootPaths = new[] { dotnetRootPath }; } + userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; + if (WorkloadInstall.IsUserLocal(dotnetRootPath, sdkVersion) && Directory.Exists(userProfileDir)) + { + dotnetRootPaths = new[] { userProfileDir }.Concat(dotnetRootPaths).ToArray(); + } + return new WorkloadResolver(manifestProvider, dotnetRootPaths, currentRuntimeIdentifiers); } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj b/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj index f5543e055924..1690b276455f 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj +++ b/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj @@ -80,6 +80,8 @@ + + diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs index 6de9e34c8bf2..929e8f42f0ed 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs @@ -10,6 +10,7 @@ using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Microsoft.DotNet.Cli; +using Microsoft.DotNet.Configurer; using Microsoft.NET.Sdk.WorkloadManifestReader; using Newtonsoft.Json; using NuGet.Frameworks; @@ -634,6 +635,15 @@ private string GetPackPath(string packName, string packVersion) { IEnumerable GetPackFolders() { + if (!string.IsNullOrEmpty(NetCoreRoot) && !string.IsNullOrEmpty(NETCoreSdkVersion)) + { + if (WorkloadInstall.IsUserLocal(NetCoreRoot, NETCoreSdkVersion)) + { + // TODO: should DotnetUserProfileFolderPath come from a property? + yield return Path.Combine(CliFolderPathCalculator.DotnetUserProfileFolderPath, "packs"); + } + } + if (!string.IsNullOrEmpty(TargetingPackRoot)) { yield return TargetingPackRoot; diff --git a/src/Tests/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs b/src/Tests/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs index c78c9bca72d6..a86551022018 100644 --- a/src/Tests/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs +++ b/src/Tests/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs @@ -17,7 +17,7 @@ public void It_does_not_return_same_path_for_tools_package_and_tool_shim() { // shim name will conflict with the folder that is PackageId, if commandName and packageId are the same. CliFolderPathCalculator.ToolsPackagePath.Should().NotBe(CliFolderPathCalculator.ToolsShimPath); - CliFolderPathCalculator.ToolsPackagePath.Should().NotBe(CliFolderPathCalculator.ToolsShimPathInUnix.Path); + CliFolderPathCalculator.ToolsPackagePath.Should().NotBe($"{CliFolderPathCalculator.DotnetHomePath}/{Path.Combine(CliFolderPathCalculator.DotnetProfileDirectoryName, CliFolderPathCalculator.ToolsShimFolderName)}"); } } } diff --git a/src/Tests/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs b/src/Tests/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs index ce6ef6e3141c..389ad2c4885b 100644 --- a/src/Tests/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs +++ b/src/Tests/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs @@ -208,7 +208,7 @@ public void ItCreatesTheProfileFileOnLinuxWhenInvokedFromNativeInstaller() File.Exists(profiled).Should().BeTrue(); File.ReadAllText(profiled).Should().Be( - $"export PATH=\"$PATH:{CliFolderPathCalculator.ToolsShimPathInUnix.PathWithDollar}\""); + $"export PATH=\"$PATH:$HOME/{CliFolderPathCalculator.ToolsShimFolderName}\""); } [MacOsOnlyFact] @@ -223,7 +223,7 @@ public void ItCreatesThePathDFileOnMacOSWhenInvokedFromNativeInstaller() command.Execute("internal-reportinstallsuccess", "test").Should().Pass(); File.Exists(pathsd).Should().BeTrue(); - File.ReadAllText(pathsd).Should().Be(CliFolderPathCalculator.ToolsShimPathInUnix.PathWithTilde); + File.ReadAllText(pathsd).Should().Be($"~/{CliFolderPathCalculator.ToolsShimFolderName}"); } private string GetDotnetVersion() diff --git a/src/Tests/dotnet.Tests/dotnet.Tests.csproj b/src/Tests/dotnet.Tests/dotnet.Tests.csproj index 84bde802e7c4..286789fe53d0 100644 --- a/src/Tests/dotnet.Tests/dotnet.Tests.csproj +++ b/src/Tests/dotnet.Tests/dotnet.Tests.csproj @@ -14,6 +14,9 @@ on a valid layout. --> $(ArtifactsBinDir)redist\$(Configuration) false + + + $(NoWarn);0436 @@ -51,6 +54,7 @@ + PreserveNewest From 6b7fdbbae08b8007653d9b0988a3b9abe44d87cc Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 30 Aug 2021 10:22:44 +0200 Subject: [PATCH 03/32] Add back DisplayAsError to CliFolderPathCalculator --- .../Microsoft.DotNet.Cli.Utils.csproj | 4 ++++ .../LocalizableStrings.resx | 3 --- .../Microsoft.DotNet.Configurer.csproj | 6 ++++++ .../xlf/LocalizableStrings.cs.xlf | 5 ----- .../xlf/LocalizableStrings.de.xlf | 5 ----- .../xlf/LocalizableStrings.es.xlf | 5 ----- .../xlf/LocalizableStrings.fr.xlf | 5 ----- .../xlf/LocalizableStrings.it.xlf | 5 ----- .../xlf/LocalizableStrings.ja.xlf | 5 ----- .../xlf/LocalizableStrings.ko.xlf | 5 ----- .../xlf/LocalizableStrings.pl.xlf | 5 ----- .../xlf/LocalizableStrings.pt-BR.xlf | 5 ----- .../xlf/LocalizableStrings.ru.xlf | 5 ----- .../xlf/LocalizableStrings.tr.xlf | 5 ----- .../xlf/LocalizableStrings.zh-Hans.xlf | 5 ----- .../xlf/LocalizableStrings.zh-Hant.xlf | 5 ----- src/Cli/dotnet/CommonLocalizableStrings.resx | 3 +++ src/Cli/dotnet/Program.cs | 4 ++-- src/Cli/dotnet/dotnet.csproj | 5 +++++ src/Cli/dotnet/xlf/CommonLocalizableStrings.cs.xlf | 5 +++++ src/Cli/dotnet/xlf/CommonLocalizableStrings.de.xlf | 5 +++++ src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf | 5 +++++ src/Cli/dotnet/xlf/CommonLocalizableStrings.fr.xlf | 5 +++++ src/Cli/dotnet/xlf/CommonLocalizableStrings.it.xlf | 5 +++++ src/Cli/dotnet/xlf/CommonLocalizableStrings.ja.xlf | 5 +++++ src/Cli/dotnet/xlf/CommonLocalizableStrings.ko.xlf | 5 +++++ src/Cli/dotnet/xlf/CommonLocalizableStrings.pl.xlf | 5 +++++ .../dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf | 5 +++++ src/Cli/dotnet/xlf/CommonLocalizableStrings.ru.xlf | 5 +++++ src/Cli/dotnet/xlf/CommonLocalizableStrings.tr.xlf | 5 +++++ .../xlf/CommonLocalizableStrings.zh-Hans.xlf | 5 +++++ .../xlf/CommonLocalizableStrings.zh-Hant.xlf | 5 +++++ src/Common/CliFolderPathCalculator.cs | 14 ++++++-------- .../ConfigurationException.cs | 0 .../ExceptionExtensions.cs | 5 ----- .../Microsoft.DotNet.TemplateLocator.csproj | 3 +++ .../Microsoft.DotNet.MSBuildSdkResolver.csproj | 6 ++++++ ...osoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj | 6 ++++++ ...Microsoft.NET.Sdk.WorkloadManifestReader.csproj | 3 +++ .../Microsoft.NET.Build.Tasks.csproj | 3 +++ src/Tests/dotnet.Tests/dotnet.Tests.csproj | 8 +++++++- 41 files changed, 119 insertions(+), 84 deletions(-) rename src/{Cli/Microsoft.DotNet.Configurer => Common}/ConfigurationException.cs (100%) rename src/{Cli/Microsoft.DotNet.Cli.Utils => Common}/ExceptionExtensions.cs (80%) diff --git a/src/Cli/Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj b/src/Cli/Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj index 66a26913b7e9..bfb7215e6a8c 100644 --- a/src/Cli/Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj +++ b/src/Cli/Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj @@ -25,6 +25,10 @@ + + + + - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Telemetry --------- diff --git a/src/Cli/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj b/src/Cli/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj index b3689ca50761..22741782a0c6 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj +++ b/src/Cli/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj @@ -9,11 +9,17 @@ git $(DefineConstants);EXCLUDE_ASPNETCORE true + + + $(NoWarn);0436 + + + diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.cs.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.cs.xlf index 134152e56b00..c9ec0c8f66ff 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.cs.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.cs.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Nešlo určit domovský adresář uživatele. Nastavte proměnnou prostředí {0}, která určí adresář, který se má použít. - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.de.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.de.xlf index e757d42138fb..2f080cbf5d6e 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.de.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.de.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Das Startverzeichnis des Benutzers konnte nicht ermittelt werden. Legen Sie die Umgebungsvariable "{0}" fest, um das zu verwendende Verzeichnis anzugeben. - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.es.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.es.xlf index 481a73bb1e0c..f4f2462d69d7 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.es.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.es.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - No se puede determinar el directorio raíz del usuario. Establezca la variable de entorno “{0}” para especificar el directorio que debe usarse. - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.fr.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.fr.xlf index 27da1cb03099..3c7f0a1c118b 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.fr.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.fr.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Impossible de déterminer le répertoire de base de l'utilisateur. Définissez la variable d'environnement '{0}' pour spécifier le répertoire à utiliser. - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.it.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.it.xlf index 4e28cdc82b33..83a22cbe41e6 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.it.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.it.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Non è stato possibile determinare la home directory dell'utente. Impostare la variabile di ambiente '{0}' per specificare la directory da usare. - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ja.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ja.xlf index dab78dd97df3..169b1eaa4791 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ja.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ja.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - ユーザーのホーム ディレクトリを特定できませんでした。使用するディレクトリを指定するには、'{0}' 環境変数を設定してください。 - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ko.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ko.xlf index bfba085a0595..20c5a15809a2 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ko.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ko.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - 사용자의 홈 디렉터리를 확인할 수 없습니다. '{0}' 환경 변수를 설정하여 사용할 디렉터리를 지정하세요. - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pl.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pl.xlf index 135539034541..c99f34d73c57 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pl.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pl.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Nie można określić katalogu macierzystego użytkownika. Ustaw zmienną środowiskową „{0}”, aby określić katalog do użycia. - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pt-BR.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pt-BR.xlf index 278792b0bb07..eb4d48ef7553 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pt-BR.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pt-BR.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - O diretório inicial do usuário não pôde ser definido. Configure a variável de ambiente '{0}' para especificar o diretório a ser utilizado. - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ru.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ru.xlf index cfc29cfb640c..43134bdc249b 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ru.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ru.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Не удалось определить домашний каталог пользователя. Чтобы указать нужный каталог, задайте переменную среды "{0}". - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.tr.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.tr.xlf index bdd35178e1b4..d973b0e243ae 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.tr.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.tr.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Kullanıcının giriş dizini belirlenemedi. Kullanılacak dizini belirtmek için '{0}' ortam değişkenini ayarlayın. - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hans.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hans.xlf index 11178b70011c..54231e29c2f7 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hans.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hans.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - 无法确定用户的主目录。设置“{0}”环境变量以指定要使用的目录。 - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hant.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hant.xlf index 025953cfa9c8..dece9bc4f44f 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hant.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hant.xlf @@ -2,11 +2,6 @@ - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - 無法判定該使用者的主目錄。請設定 '{0}' 環境變數,指定要使用的目錄。 - - ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/dotnet/CommonLocalizableStrings.resx b/src/Cli/dotnet/CommonLocalizableStrings.resx index c5a8fc30e679..10025299abc6 100644 --- a/src/Cli/dotnet/CommonLocalizableStrings.resx +++ b/src/Cli/dotnet/CommonLocalizableStrings.resx @@ -699,4 +699,7 @@ The default is 'true' if a runtime identifier is specified. The '--self-contained' and '--no-self-contained' options cannot be used together. + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + diff --git a/src/Cli/dotnet/Program.cs b/src/Cli/dotnet/Program.cs index c3be733b4a56..fdefbce77649 100644 --- a/src/Cli/dotnet/Program.cs +++ b/src/Cli/dotnet/Program.cs @@ -70,7 +70,7 @@ public static int Main(string[] args) Reporter.Output.WriteLine(e.Message); return 0; } - catch (Exception e) when (e.ShouldBeDisplayedAsError()) + catch (Exception e) when (ExceptionExtensions.ShouldBeDisplayedAsError(e)) { Reporter.Error.WriteLine(CommandContext.IsVerbose() ? e.ToString().Red().Bold() @@ -84,7 +84,7 @@ public static int Main(string[] args) return 1; } - catch (Exception e) when (!e.ShouldBeDisplayedAsError()) + catch (Exception e) when (!ExceptionExtensions.ShouldBeDisplayedAsError(e)) { // If telemetry object has not been initialized yet. It cannot be collected TelemetryEventEntry.SendFiltered(e); diff --git a/src/Cli/dotnet/dotnet.csproj b/src/Cli/dotnet/dotnet.csproj index 96c8bce2c18d..c5629c4d8f7f 100644 --- a/src/Cli/dotnet/dotnet.csproj +++ b/src/Cli/dotnet/dotnet.csproj @@ -12,6 +12,9 @@ Microsoft.DotNet.Cli false true + + + $(NoWarn);0436 @@ -19,6 +22,8 @@ + + diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.cs.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.cs.xlf index 2c4fff34cddd..6a6272e7ae2d 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.cs.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.cs.xlf @@ -95,6 +95,11 @@ export PATH="$PATH:{0}" + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Nešlo určit domovský adresář uživatele. Nastavte proměnnou prostředí {0}, která určí adresář, který se má použít. + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.de.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.de.xlf index 93ccace590bd..ac475fc5160d 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.de.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.de.xlf @@ -95,6 +95,11 @@ export PATH="$PATH:{0}" + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Das Startverzeichnis des Benutzers konnte nicht ermittelt werden. Legen Sie die Umgebungsvariable "{0}" fest, um das zu verwendende Verzeichnis anzugeben. + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf index 8b5f301768fe..5c382d16d872 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf @@ -95,6 +95,11 @@ export PATH="$PATH:{0}" + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + No se puede determinar el directorio raíz del usuario. Establezca la variable de entorno “{0}” para especificar el directorio que debe usarse. + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.fr.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.fr.xlf index f876daa63ce2..07229ee5a7dd 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.fr.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.fr.xlf @@ -95,6 +95,11 @@ export PATH="$PATH:{0}" + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Impossible de déterminer le répertoire de base de l'utilisateur. Définissez la variable d'environnement '{0}' pour spécifier le répertoire à utiliser. + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.it.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.it.xlf index 53069a26c9a5..edf79bad163c 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.it.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.it.xlf @@ -95,6 +95,11 @@ export PATH="$PATH:{0}" + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Non è stato possibile determinare la home directory dell'utente. Impostare la variabile di ambiente '{0}' per specificare la directory da usare. + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.ja.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.ja.xlf index 69404148ec9c..f5eb9cdb9d60 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.ja.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.ja.xlf @@ -95,6 +95,11 @@ export PATH="$PATH:{0}" + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + ユーザーのホーム ディレクトリを特定できませんでした。使用するディレクトリを指定するには、'{0}' 環境変数を設定してください。 + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.ko.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.ko.xlf index 28cdbd174eab..b21cd6fee591 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.ko.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.ko.xlf @@ -95,6 +95,11 @@ export PATH="$PATH:{0}" + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + 사용자의 홈 디렉터리를 확인할 수 없습니다. '{0}' 환경 변수를 설정하여 사용할 디렉터리를 지정하세요. + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.pl.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.pl.xlf index c94f55e9b1a7..df2abc834daa 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.pl.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.pl.xlf @@ -95,6 +95,11 @@ export PATH="$PATH:{0}" + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Nie można określić katalogu macierzystego użytkownika. Ustaw zmienną środowiskową „{0}”, aby określić katalog do użycia. + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf index 49df27c5ebc7..214b62deac3b 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf @@ -95,6 +95,11 @@ export PATH="$PATH:{0}" + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + O diretório inicial do usuário não pôde ser definido. Configure a variável de ambiente '{0}' para especificar o diretório a ser utilizado. + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.ru.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.ru.xlf index 2ab9b2976c90..c235f2f7ef7a 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.ru.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.ru.xlf @@ -95,6 +95,11 @@ export PATH="$PATH:{0}" + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Не удалось определить домашний каталог пользователя. Чтобы указать нужный каталог, задайте переменную среды "{0}". + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.tr.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.tr.xlf index 2a6a2fe78891..47cea022edc0 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.tr.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.tr.xlf @@ -95,6 +95,11 @@ export PATH="$PATH:{0}" + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Kullanıcının giriş dizini belirlenemedi. Kullanılacak dizini belirtmek için '{0}' ortam değişkenini ayarlayın. + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf index 45d1f202932a..b6e4b5649cc8 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf @@ -95,6 +95,11 @@ EOF + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + 无法确定用户的主目录。设置“{0}”环境变量以指定要使用的目录。 + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hant.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hant.xlf index e02e7bf2fc8c..5a50ea5140c6 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hant.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hant.xlf @@ -95,6 +95,11 @@ export PATH="$PATH:{0}" + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + 無法判定該使用者的主目錄。請設定 '{0}' 環境變數,指定要使用的目錄。 + + Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Common/CliFolderPathCalculator.cs b/src/Common/CliFolderPathCalculator.cs index bfd8326df04b..5a0dd8e4c772 100644 --- a/src/Common/CliFolderPathCalculator.cs +++ b/src/Common/CliFolderPathCalculator.cs @@ -4,8 +4,8 @@ using System; using System.IO; using System.Runtime.InteropServices; -// using Microsoft.DotNet.Cli.Utils; -// using NuGet.Common; +using Microsoft.DotNet.Tools; +using Microsoft.DotNet.Cli.Utils; namespace Microsoft.DotNet.Configurer { @@ -53,12 +53,10 @@ public static string DotnetHomePath home = Environment.GetEnvironmentVariable(PlatformHomeVariableName); if (string.IsNullOrEmpty(home)) { - throw new Exception(); // TODO - // throw new ConfigurationException( - // string.Format( - // LocalizableStrings.FailedToDetermineUserHomeDirectory, - // DotnetHomeVariableName)) - // .DisplayAsError(); + throw ExceptionExtensions.DisplayAsError(new ConfigurationException( + string.Format( + CommonLocalizableStrings.FailedToDetermineUserHomeDirectory, + DotnetHomeVariableName))); } } diff --git a/src/Cli/Microsoft.DotNet.Configurer/ConfigurationException.cs b/src/Common/ConfigurationException.cs similarity index 100% rename from src/Cli/Microsoft.DotNet.Configurer/ConfigurationException.cs rename to src/Common/ConfigurationException.cs diff --git a/src/Cli/Microsoft.DotNet.Cli.Utils/ExceptionExtensions.cs b/src/Common/ExceptionExtensions.cs similarity index 80% rename from src/Cli/Microsoft.DotNet.Cli.Utils/ExceptionExtensions.cs rename to src/Common/ExceptionExtensions.cs index 265edd05e945..03f984404c37 100644 --- a/src/Cli/Microsoft.DotNet.Cli.Utils/ExceptionExtensions.cs +++ b/src/Common/ExceptionExtensions.cs @@ -14,11 +14,6 @@ public static TException DisplayAsError(this TException exception) return exception; } - public static void ReportAsWarning(this Exception e) - { - Reporter.Verbose.WriteLine($"Warning: Ignoring exception: {e.ToString().Yellow()}"); - } - public static bool ShouldBeDisplayedAsError(this Exception e) => e.Data.Contains(CLI_User_Displayed_Exception); diff --git a/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj b/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj index 691f681985ba..97d059b585af 100644 --- a/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj +++ b/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj @@ -51,11 +51,14 @@ + + + diff --git a/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj b/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj index 71ddeb887c00..463d1f2d9bee 100644 --- a/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj +++ b/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj @@ -19,6 +19,9 @@ $(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage + + + $(NoWarn);0436 @@ -51,6 +54,7 @@ + @@ -71,6 +75,8 @@ + + diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj b/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj index 90320ad7ecb3..0a40a13fb2e5 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj @@ -3,6 +3,9 @@ $(SdkTargetFramework) true + + + $(NoWarn);0436 @@ -11,6 +14,7 @@ + @@ -24,6 +28,8 @@ Exclude="..\..\Cli\dotnet\commands\dotnet-workload\install\WorkloadInstallRecords\RegistryWorkloadInstallationRecordRepository.cs" LinkBase="WorkloadInstallRecords" /> + + diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj index 9bf383d55f72..0ef41b919d84 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj @@ -17,9 +17,12 @@ + + + diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj b/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj index 1690b276455f..dbd4ab91abdf 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj +++ b/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj @@ -81,12 +81,15 @@ + + + diff --git a/src/Tests/dotnet.Tests/dotnet.Tests.csproj b/src/Tests/dotnet.Tests/dotnet.Tests.csproj index 286789fe53d0..b561f4605c7f 100644 --- a/src/Tests/dotnet.Tests/dotnet.Tests.csproj +++ b/src/Tests/dotnet.Tests/dotnet.Tests.csproj @@ -15,7 +15,7 @@ $(ArtifactsBinDir)redist\$(Configuration) false - + $(NoWarn);0436 @@ -55,6 +55,8 @@ + + PreserveNewest @@ -163,4 +165,8 @@ + + + + From bb7a3a6ae1458f9a7f06caad15ac58b6d4a41921 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 30 Aug 2021 10:32:27 +0200 Subject: [PATCH 04/32] Remove handled TODO comment --- .../dotnet-workload/install/WorkloadInstallerFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs index 02aa08f7d88a..17faa37613e4 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs @@ -75,7 +75,7 @@ public static InstallType GetWorkloadInstallType(SdkFeatureBand sdkFeatureBand, return InstallType.FileBased; } - private static bool CanWriteToDotnetRoot(string dotnetDir = null) // TODO + private static bool CanWriteToDotnetRoot(string dotnetDir = null) { dotnetDir = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath); try From cfabaea6b6767a2717a39839167611309bf026a9 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 30 Aug 2021 10:34:16 +0200 Subject: [PATCH 05/32] Use RuntimeInformation class to detect Windows. --- src/Common/CliFolderPathCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Common/CliFolderPathCalculator.cs b/src/Common/CliFolderPathCalculator.cs index 5a0dd8e4c772..2594d1ee4cd7 100644 --- a/src/Common/CliFolderPathCalculator.cs +++ b/src/Common/CliFolderPathCalculator.cs @@ -64,7 +64,7 @@ public static string DotnetHomePath } } - private static bool IsWindows => Path.DirectorySeparatorChar == '\\'; + private static bool IsWindows => RuntimeInformation.IsOSPlatform(OSPlatform.Windows); } static class ToolPackageFolderPathCalculator From 754715addf501ff5f96a1c3d2512bb32bb713a7d Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 30 Aug 2021 10:55:32 +0200 Subject: [PATCH 06/32] Prefer folders specified by envvar. --- .../SdkDirectoryWorkloadManifestProvider.cs | 28 ++++++++----------- .../WorkloadResolver.cs | 19 ++++++------- .../ProcessFrameworkReferences.cs | 17 +++++------ 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs index 51d0ea0ed636..e33c66876a61 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs @@ -61,7 +61,17 @@ static int Last2DigitsTo0(int versionBuild) _knownManifestIds = File.ReadAllLines(knownManifestIdsFilePath).Where(l => !string.IsNullOrEmpty(l)).ToHashSet(); } - var manifestDirectory = Path.Combine(_sdkRootPath, "sdk-manifests", _sdkVersionBand); + userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; + string userManifestsDir = Path.Combine(userProfileDir, "sdk-manifests", _sdkVersionBand); + string dotnetManifestDir = Path.Combine(_sdkRootPath, "sdk-manifests", _sdkVersionBand); + if (WorkloadInstall.IsUserLocal(_sdkRootPath, sdkVersion) && Directory.Exists(userManifestsDir)) + { + _manifestDirectories = new[] { userManifestsDir, dotnetManifestDir }; + } + else + { + _manifestDirectories = new[] { dotnetManifestDir }; + } var manifestDirectoryEnvironmentVariable = getEnvironmentVariable(EnvironmentVariableNames.WORKLOAD_MANIFEST_ROOTS); if (manifestDirectoryEnvironmentVariable != null) @@ -70,21 +80,7 @@ static int Last2DigitsTo0(int versionBuild) // environment variable settings to be shared by multiple SDKs. _manifestDirectories = manifestDirectoryEnvironmentVariable.Split(Path.PathSeparator) .Select(p => Path.Combine(p, _sdkVersionBand)) - .Append(manifestDirectory).ToArray(); - } - else - { - _manifestDirectories = new[] { manifestDirectory }; - } - - userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; - if (WorkloadInstall.IsUserLocal(_sdkRootPath, sdkVersion) && Directory.Exists(userProfileDir)) - { - string userManifestsDir = Path.Combine(userProfileDir, "sdk-manifests", _sdkVersionBand); - if (Directory.Exists(userManifestsDir)) - { - _manifestDirectories = new[] { userManifestsDir }.Concat(_manifestDirectories).ToArray(); - } + .Concat(_manifestDirectories).ToArray(); } } diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs index 5c281aa3f387..d324292b9a38 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs @@ -35,25 +35,24 @@ public static WorkloadResolver Create(IWorkloadManifestProvider manifestProvider File.ReadAllLines(runtimeIdentifierChainPath).Where(l => !string.IsNullOrEmpty(l)).ToArray() : new string[] { }; - var packRootEnvironmentVariable = Environment.GetEnvironmentVariable(EnvironmentVariableNames.WORKLOAD_PACK_ROOTS); - - string[] dotnetRootPaths; - if (!string.IsNullOrEmpty(packRootEnvironmentVariable)) + userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; + string[] workloadRootPaths; + if (WorkloadInstall.IsUserLocal(dotnetRootPath, sdkVersion) && Directory.Exists(userProfileDir)) { - dotnetRootPaths = packRootEnvironmentVariable.Split(Path.PathSeparator).Append(dotnetRootPath).ToArray(); + workloadRootPaths = new[] { userProfileDir, dotnetRootPath }; } else { - dotnetRootPaths = new[] { dotnetRootPath }; + workloadRootPaths = new[] { dotnetRootPath }; } - userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; - if (WorkloadInstall.IsUserLocal(dotnetRootPath, sdkVersion) && Directory.Exists(userProfileDir)) + var packRootEnvironmentVariable = Environment.GetEnvironmentVariable(EnvironmentVariableNames.WORKLOAD_PACK_ROOTS); + if (!string.IsNullOrEmpty(packRootEnvironmentVariable)) { - dotnetRootPaths = new[] { userProfileDir }.Concat(dotnetRootPaths).ToArray(); + workloadRootPaths = packRootEnvironmentVariable.Split(Path.PathSeparator).Concat(workloadRootPaths).ToArray(); } - return new WorkloadResolver(manifestProvider, dotnetRootPaths, currentRuntimeIdentifiers); + return new WorkloadResolver(manifestProvider, workloadRootPaths, currentRuntimeIdentifiers); } public static WorkloadResolver CreateForTests(IWorkloadManifestProvider manifestProvider, string[] dotNetRootPaths, string[]? currentRuntimeIdentifiers = null) diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs index 929e8f42f0ed..e9983091c602 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs @@ -635,6 +635,15 @@ private string GetPackPath(string packName, string packVersion) { IEnumerable GetPackFolders() { + var packRootEnvironmentVariable = Environment.GetEnvironmentVariable(EnvironmentVariableNames.WORKLOAD_PACK_ROOTS); + if (!string.IsNullOrEmpty(packRootEnvironmentVariable)) + { + foreach (var packRoot in packRootEnvironmentVariable.Split(Path.PathSeparator)) + { + yield return Path.Combine(packRoot, "packs"); + } + } + if (!string.IsNullOrEmpty(NetCoreRoot) && !string.IsNullOrEmpty(NETCoreSdkVersion)) { if (WorkloadInstall.IsUserLocal(NetCoreRoot, NETCoreSdkVersion)) @@ -648,14 +657,6 @@ IEnumerable GetPackFolders() { yield return TargetingPackRoot; } - var packRootEnvironmentVariable = Environment.GetEnvironmentVariable(EnvironmentVariableNames.WORKLOAD_PACK_ROOTS); - if (!string.IsNullOrEmpty(packRootEnvironmentVariable)) - { - foreach (var packRoot in packRootEnvironmentVariable.Split(Path.PathSeparator)) - { - yield return Path.Combine(packRoot, "packs"); - } - } } foreach (var packFolder in GetPackFolders()) From 782800a2e800774be6c90032f39e954dc5479b9c Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 30 Aug 2021 11:06:09 +0200 Subject: [PATCH 07/32] Fix CI compilation failure. --- src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs b/src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs index 8a83d773c3bf..f7e5ee4e8611 100644 --- a/src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs +++ b/src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; +using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Xml.Xsl; From eb739fc2723c37640c622088c1672791bbfd91b2 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 30 Aug 2021 11:14:00 +0200 Subject: [PATCH 08/32] Update src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs Co-authored-by: Daniel Plaisted --- .../commands/dotnet-workload/install/NetSdkManagedInstaller.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs index b74789660419..4107c832be44 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs @@ -58,7 +58,7 @@ public NetSdkManagedInstaller(IReporter reporter, new NuGetPackageDownloader(_tempPackagesDir, filePermissionSetter: null, new FirstPartyNuGetPackageSigningVerifier(_tempPackagesDir), logger, restoreActionConfig: _restoreActionConfig); - _dotnetWorkloadMetadataDir = Path.Combine(dotnetDir, "metadata", "workloads"); + _dotnetWorkloadMetadataDir = Path.Combine(_dotnetDir, "metadata", "workloads"); _userWorkloadMetadataDir = Path.Combine(_userProfileDir, "metadata", "workloads"); _reporter = reporter; _sdkFeatureBand = sdkFeatureBand; From 819f44631ed8624bdbe5f94fdae7793053efd6a5 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 30 Aug 2021 11:16:55 +0200 Subject: [PATCH 09/32] Fix CI compilation failure. --- .../GivenAPathCalculator.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Tests/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs b/src/Tests/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs index a86551022018..23cf8faa4b42 100644 --- a/src/Tests/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs +++ b/src/Tests/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; +using System.IO; using System.Collections.Generic; using Microsoft.DotNet.Cli.Utils; using Microsoft.DotNet.Tools.Test.Utilities; From 610eef49b66e0ff4e1d300fceca5a0a803dc2d42 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 30 Aug 2021 11:37:07 +0200 Subject: [PATCH 10/32] Limit cleanup to user local packs when SDK does user local install. --- .../install/NetSdkManagedInstaller.cs | 79 +++++++++---------- 1 file changed, 37 insertions(+), 42 deletions(-) diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs index 4107c832be44..81f586fb90a9 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs @@ -298,61 +298,56 @@ public void GarbageCollectInstalledWorkloadPacks(DirectoryPath? offlineCache = n var installedSdkFeatureBands = _installationRecordRepository.GetFeatureBandsWithInstallationRecords(); _reporter.WriteLine(string.Format(LocalizableStrings.GarbageCollectingSdkFeatureBandsMessage, string.Join(" ", installedSdkFeatureBands))); var currentBandInstallRecords = GetExpectedPackInstallRecords(_sdkFeatureBand); + string installedPacksDir = Path.Combine(GetWorkloadMetadataDir(_sdkFeatureBand), InstalledPacksDir, "v1"); - foreach (var installedPacksDir in new[] { - Path.Combine(_dotnetWorkloadMetadataDir, InstalledPacksDir, "v1"), - Path.Combine(_userWorkloadMetadataDir, InstalledPacksDir, "v1") - }) + if (!Directory.Exists(installedPacksDir)) { - if (!Directory.Exists(installedPacksDir)) - { - continue; - } + return; + } - foreach (var packIdDir in Directory.GetDirectories(installedPacksDir)) + foreach (var packIdDir in Directory.GetDirectories(installedPacksDir)) + { + foreach (var packVersionDir in Directory.GetDirectories(packIdDir)) { - foreach (var packVersionDir in Directory.GetDirectories(packIdDir)) - { - var bandRecords = Directory.GetFileSystemEntries(packVersionDir); + var bandRecords = Directory.GetFileSystemEntries(packVersionDir); - var unneededBandRecords = bandRecords - .Where(recordPath => !installedSdkFeatureBands.Contains(new SdkFeatureBand(Path.GetFileName(recordPath)))); + var unneededBandRecords = bandRecords + .Where(recordPath => !installedSdkFeatureBands.Contains(new SdkFeatureBand(Path.GetFileName(recordPath)))); - var currentBandRecordPath = Path.Combine(packVersionDir, _sdkFeatureBand.ToString()); - if (bandRecords.Contains(currentBandRecordPath) && !currentBandInstallRecords.Contains(currentBandRecordPath)) - { - unneededBandRecords = unneededBandRecords.Append(currentBandRecordPath); - } + var currentBandRecordPath = Path.Combine(packVersionDir, _sdkFeatureBand.ToString()); + if (bandRecords.Contains(currentBandRecordPath) && !currentBandInstallRecords.Contains(currentBandRecordPath)) + { + unneededBandRecords = unneededBandRecords.Append(currentBandRecordPath); + } - if (!unneededBandRecords.Any()) - { - continue; - } + if (!unneededBandRecords.Any()) + { + continue; + } - // Save the pack info in case we need to delete the pack - var jsonPackInfo = File.ReadAllText(unneededBandRecords.First()); - foreach (var unneededRecord in unneededBandRecords) - { - File.Delete(unneededRecord); - } + // Save the pack info in case we need to delete the pack + var jsonPackInfo = File.ReadAllText(unneededBandRecords.First()); + foreach (var unneededRecord in unneededBandRecords) + { + File.Delete(unneededRecord); + } - if (!bandRecords.Except(unneededBandRecords).Any()) + if (!bandRecords.Except(unneededBandRecords).Any()) + { + Directory.Delete(packVersionDir); + var deletablePack = GetPackInfo(packVersionDir); + if (deletablePack == null) { - Directory.Delete(packVersionDir); - var deletablePack = GetPackInfo(packVersionDir); - if (deletablePack == null) - { - // Pack no longer exists in manifests, get pack info from installation record - deletablePack = JsonSerializer.Deserialize(jsonPackInfo, typeof(PackInfo)) as PackInfo; - } - DeletePack(deletablePack); + // Pack no longer exists in manifests, get pack info from installation record + deletablePack = JsonSerializer.Deserialize(jsonPackInfo, typeof(PackInfo)) as PackInfo; } + DeletePack(deletablePack); } + } - if (!Directory.GetFileSystemEntries(packIdDir).Any()) - { - Directory.Delete(packIdDir); - } + if (!Directory.GetFileSystemEntries(packIdDir).Any()) + { + Directory.Delete(packIdDir); } } } From a3bbefeb2c5abeca22f7b689bee0778e498e992e Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 30 Aug 2021 11:39:39 +0200 Subject: [PATCH 11/32] Remove TODO --- .../commands/dotnet-workload/install/NetSdkManagedInstaller.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs index 81f586fb90a9..ab0357f89ca3 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs @@ -197,7 +197,6 @@ public void InstallWorkloadManifest(ManifestId manifestId, ManifestVersion manif string tempExtractionDir = null; string tempBackupDir = null; string rootInstallDir = WorkloadInstall.IsUserLocal(_dotnetDir, sdkFeatureBand.ToString()) ? _userProfileDir : _dotnetDir; - // TODO: do we need to use something from _dotnetDir sdk-manifests for user local install? var manifestPath = Path.Combine(rootInstallDir, "sdk-manifests", sdkFeatureBand.ToString(), manifestId.ToString()); _reporter.WriteLine(string.Format(LocalizableStrings.InstallingWorkloadManifest, manifestId, manifestVersion)); From 57fd5d577c77e2b6167741a673d6253454a40b87 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 30 Aug 2021 14:02:12 +0200 Subject: [PATCH 12/32] revert restore-toolset.sh changes --- eng/restore-toolset.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/eng/restore-toolset.sh b/eng/restore-toolset.sh index 77a6f32111ff..c5e939fb808f 100644 --- a/eng/restore-toolset.sh +++ b/eng/restore-toolset.sh @@ -20,10 +20,10 @@ function InitializeCustomSDKToolset { fi InitializeDotNetCli true - # if [[ "$DISTRO" != "ubuntu" || "$MAJOR_VERSION" -le 16 ]]; then - # InstallDotNetSharedFramework "1.0.5" - # InstallDotNetSharedFramework "1.1.2" - # fi + if [[ "$DISTRO" != "ubuntu" || "$MAJOR_VERSION" -le 16 ]]; then + InstallDotNetSharedFramework "1.0.5" + InstallDotNetSharedFramework "1.1.2" + fi InstallDotNetSharedFramework "2.1.0" InstallDotNetSharedFramework "2.2.8" InstallDotNetSharedFramework "3.1.0" From 6a8fd55ec66b1a6bb9ff682caba2435236c94727 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Tue, 31 Aug 2021 11:04:34 +0200 Subject: [PATCH 13/32] Fix test --- .../GivenThatTheUserIsRunningDotNetForTheFirstTime.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Tests/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs b/src/Tests/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs index 389ad2c4885b..1a83583eaafe 100644 --- a/src/Tests/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs +++ b/src/Tests/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs @@ -208,7 +208,7 @@ public void ItCreatesTheProfileFileOnLinuxWhenInvokedFromNativeInstaller() File.Exists(profiled).Should().BeTrue(); File.ReadAllText(profiled).Should().Be( - $"export PATH=\"$PATH:$HOME/{CliFolderPathCalculator.ToolsShimFolderName}\""); + $"export PATH=\"$PATH:$HOME/{CliFolderPathCalculator.DotnetProfileDirectoryName}/{CliFolderPathCalculator.ToolsShimFolderName}\""); } [MacOsOnlyFact] @@ -223,7 +223,7 @@ public void ItCreatesThePathDFileOnMacOSWhenInvokedFromNativeInstaller() command.Execute("internal-reportinstallsuccess", "test").Should().Pass(); File.Exists(pathsd).Should().BeTrue(); - File.ReadAllText(pathsd).Should().Be($"~/{CliFolderPathCalculator.ToolsShimFolderName}"); + File.ReadAllText(pathsd).Should().Be($"~/{CliFolderPathCalculator.DotnetProfileDirectoryName}/{CliFolderPathCalculator.ToolsShimFolderName}"); } private string GetDotnetVersion() From d0101a701ce35f6e63a29d38eed2c037d36b3476 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Tue, 31 Aug 2021 12:41:10 +0200 Subject: [PATCH 14/32] NetSdkManagedInstaller: use profile xor dotnet root folder depending on userlocal. --- .../install/NetSdkManagedInstaller.cs | 22 ++++------ ...etSdkManagedInstallationRecordInstaller.cs | 41 +++++-------------- 2 files changed, 19 insertions(+), 44 deletions(-) diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs index ab0357f89ca3..2e9426619f28 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs @@ -23,8 +23,7 @@ namespace Microsoft.DotNet.Workloads.Workload.Install internal class NetSdkManagedInstaller : IWorkloadPackInstaller { private readonly IReporter _reporter; - private readonly string _dotnetWorkloadMetadataDir; - private readonly string _userWorkloadMetadataDir; + private readonly string _workloadMetadataDir; private const string InstalledPacksDir = "InstalledPacks"; protected readonly string _dotnetDir; protected readonly string _userProfileDir; @@ -58,12 +57,12 @@ public NetSdkManagedInstaller(IReporter reporter, new NuGetPackageDownloader(_tempPackagesDir, filePermissionSetter: null, new FirstPartyNuGetPackageSigningVerifier(_tempPackagesDir), logger, restoreActionConfig: _restoreActionConfig); - _dotnetWorkloadMetadataDir = Path.Combine(_dotnetDir, "metadata", "workloads"); - _userWorkloadMetadataDir = Path.Combine(_userProfileDir, "metadata", "workloads"); + bool userLocal = WorkloadInstall.IsUserLocal(_dotnetDir, sdkFeatureBand.ToString()); + _workloadMetadataDir = Path.Combine(userLocal ? _userProfileDir : _dotnetDir, "metadata", "workloads"); _reporter = reporter; _sdkFeatureBand = sdkFeatureBand; _workloadResolver = workloadResolver; - _installationRecordRepository = new NetSdkManagedInstallationRecordRepository(_dotnetDir, _userProfileDir); + _installationRecordRepository = new NetSdkManagedInstallationRecordRepository(_workloadMetadataDir); _packageSourceLocation = packageSourceLocation; } @@ -297,7 +296,7 @@ public void GarbageCollectInstalledWorkloadPacks(DirectoryPath? offlineCache = n var installedSdkFeatureBands = _installationRecordRepository.GetFeatureBandsWithInstallationRecords(); _reporter.WriteLine(string.Format(LocalizableStrings.GarbageCollectingSdkFeatureBandsMessage, string.Join(" ", installedSdkFeatureBands))); var currentBandInstallRecords = GetExpectedPackInstallRecords(_sdkFeatureBand); - string installedPacksDir = Path.Combine(GetWorkloadMetadataDir(_sdkFeatureBand), InstalledPacksDir, "v1"); + string installedPacksDir = Path.Combine(_workloadMetadataDir, InstalledPacksDir, "v1"); if (!Directory.Exists(installedPacksDir)) { @@ -353,7 +352,7 @@ public void GarbageCollectInstalledWorkloadPacks(DirectoryPath? offlineCache = n public IEnumerable<(WorkloadPackId, string)> GetInstalledPacks(SdkFeatureBand sdkFeatureBand) { - var installedPacksDir = Path.Combine(GetWorkloadMetadataDir(sdkFeatureBand), InstalledPacksDir, "v1"); + var installedPacksDir = Path.Combine(_workloadMetadataDir, InstalledPacksDir, "v1"); if (!Directory.Exists(installedPacksDir)) { return Enumerable.Empty<(WorkloadPackId, string)>(); @@ -436,7 +435,7 @@ private void DeletePack(PackInfo packInfo) } private string GetPackInstallRecordPath(PackInfo packInfo, SdkFeatureBand featureBand) => - Path.Combine(GetWorkloadMetadataDir(featureBand), InstalledPacksDir, "v1", packInfo.Id, packInfo.Version, featureBand.ToString()); + Path.Combine(_workloadMetadataDir, InstalledPacksDir, "v1", packInfo.Id, packInfo.Version, featureBand.ToString()); private void WritePackInstallationRecord(PackInfo packInfo, SdkFeatureBand featureBand) { @@ -472,15 +471,10 @@ private void DeletePackInstallationRecord(PackInfo packInfo, SdkFeatureBand feat private bool PackHasInstallRecords(PackInfo packInfo, SdkFeatureBand sdkFeatureBand) { - var packInstallRecordDir = Path.Combine(GetWorkloadMetadataDir(sdkFeatureBand), InstalledPacksDir, "v1", packInfo.Id, packInfo.Version); + var packInstallRecordDir = Path.Combine(_workloadMetadataDir, InstalledPacksDir, "v1", packInfo.Id, packInfo.Version); return Directory.Exists(packInstallRecordDir) && Directory.GetFiles(packInstallRecordDir).Any(); } private bool IsSingleFilePack(PackInfo packInfo) => packInfo.Kind.Equals(WorkloadPackKind.Library) || packInfo.Kind.Equals(WorkloadPackKind.Template); - - private string GetWorkloadMetadataDir(SdkFeatureBand sdkFeatureBand) - { - return WorkloadInstall.IsUserLocal(_dotnetDir, sdkFeatureBand.ToString()) ? _userWorkloadMetadataDir : _dotnetWorkloadMetadataDir; - } } } diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallRecords/NetSdkManagedInstallationRecordInstaller.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallRecords/NetSdkManagedInstallationRecordInstaller.cs index c75981635703..23571a5be296 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallRecords/NetSdkManagedInstallationRecordInstaller.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallRecords/NetSdkManagedInstallationRecordInstaller.cs @@ -12,46 +12,32 @@ namespace Microsoft.DotNet.Workloads.Workload.Install.InstallRecord { internal class NetSdkManagedInstallationRecordRepository : IWorkloadInstallationRecordRepository { - private readonly string _dotnetDir; - private readonly string _dotnetWorkloadMetadataDir; - private readonly string _userWorkloadMetadataDir; + private readonly string _workloadMetadataDir; private const string InstalledWorkloadDir = "InstalledWorkloads"; - public NetSdkManagedInstallationRecordRepository(string dotnetDir, string userProfileDir) + public NetSdkManagedInstallationRecordRepository(string workloadMetadataDir) { - _dotnetDir = dotnetDir; - _dotnetWorkloadMetadataDir = Path.Combine(dotnetDir, "metadata", "workloads"); - - userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; - _userWorkloadMetadataDir = Path.Combine(userProfileDir, "metadata", "workloads"); + _workloadMetadataDir = workloadMetadataDir; } public IEnumerable GetFeatureBandsWithInstallationRecords() { - if (Directory.Exists(_dotnetWorkloadMetadataDir)) + if (Directory.Exists(_workloadMetadataDir)) { - var dotnetBands = Directory.EnumerateDirectories(_dotnetWorkloadMetadataDir) - .Where(band => HasInstalledWorkload(band)); - var userBands = Directory.Exists(_userWorkloadMetadataDir) - ? Directory.EnumerateDirectories(_userWorkloadMetadataDir) - .Where(band => WorkloadInstall.IsUserLocal(_dotnetDir, band) && HasInstalledWorkload(band)) - : Enumerable.Empty(); - return dotnetBands - .Concat(userBands) - .Select(path => new SdkFeatureBand(Path.GetFileName(path))); + var bands = Directory.EnumerateDirectories(_workloadMetadataDir); + return bands + .Where(band => Directory.Exists(Path.Combine(band, InstalledWorkloadDir)) && Directory.GetFiles(Path.Combine(band, InstalledWorkloadDir)).Any()) + .Select(path => new SdkFeatureBand(Path.GetFileName(path))); } else { return new List(); } - - static bool HasInstalledWorkload(string bandDir) - => Directory.Exists(Path.Combine(bandDir, InstalledWorkloadDir)) && Directory.GetFiles(Path.Combine(bandDir, InstalledWorkloadDir)).Any(); } public IEnumerable GetInstalledWorkloads(SdkFeatureBand featureBand) { - var path = Path.Combine(GetSdkWorkloadMetadataDir(featureBand), InstalledWorkloadDir); + var path = Path.Combine(_workloadMetadataDir, featureBand.ToString(), InstalledWorkloadDir); if (Directory.Exists(path)) { return Directory.EnumerateFiles(path) @@ -65,7 +51,7 @@ public IEnumerable GetInstalledWorkloads(SdkFeatureBand featureBand) public void WriteWorkloadInstallationRecord(WorkloadId workloadId, SdkFeatureBand featureBand) { - var path = Path.Combine(GetSdkWorkloadMetadataDir(featureBand), InstalledWorkloadDir, workloadId.ToString()); + var path = Path.Combine(_workloadMetadataDir, featureBand.ToString(), InstalledWorkloadDir, workloadId.ToString()); if (!File.Exists(path)) { var pathDir = Path.GetDirectoryName(path); @@ -79,16 +65,11 @@ public void WriteWorkloadInstallationRecord(WorkloadId workloadId, SdkFeatureBan public void DeleteWorkloadInstallationRecord(WorkloadId workloadId, SdkFeatureBand featureBand) { - var path = Path.Combine(GetSdkWorkloadMetadataDir(featureBand), InstalledWorkloadDir, workloadId.ToString()); + var path = Path.Combine(_workloadMetadataDir, featureBand.ToString(), InstalledWorkloadDir, workloadId.ToString()); if (File.Exists(path)) { File.Delete(path); } } - - private string GetSdkWorkloadMetadataDir(SdkFeatureBand featureBand) - { - return Path.Combine(WorkloadInstall.IsUserLocal(_dotnetDir, featureBand.ToString()) ? _userWorkloadMetadataDir : _dotnetWorkloadMetadataDir, featureBand.ToString()); - } } } From 64c4e1059bd58b0c13b0cacda159de0ec6ccb435 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Wed, 1 Sep 2021 13:22:19 +0200 Subject: [PATCH 15/32] Run GivenDotnetWorkloadInstall tests with userlocal --- eng/restore-toolset.sh | 8 +-- .../install/WorkloadInstallCommand.cs | 10 ++-- .../install/WorkloadInstallerFactory.cs | 5 ++ .../install/WorkloadManifestUpdater.cs | 22 +++---- .../list/WorkloadListCommand.cs | 12 ++-- .../repair/WorkloadRepairCommand.cs | 5 +- .../update/WorkloadUpdateCommand.cs | 10 ++-- .../WorkloadResolver.cs | 11 +++- .../TestAssetsManager.cs | 3 + .../GivenDotnetWorkloadInstall.cs | 60 +++++++++++++++---- .../GivenWorkloadManifestUpdater.cs | 14 ++--- .../GivenDotnetWorkloadList.cs | 6 +- ...nWorkloadInstallerAndWorkloadsInstalled.cs | 6 +- .../GivenDotnetWorkloadRepair.cs | 4 +- .../GivenDotnetWorkloadUninstall.cs | 2 +- .../GivenDotnetWorkloadUpdate.cs | 8 +-- 16 files changed, 119 insertions(+), 67 deletions(-) diff --git a/eng/restore-toolset.sh b/eng/restore-toolset.sh index c5e939fb808f..77a6f32111ff 100644 --- a/eng/restore-toolset.sh +++ b/eng/restore-toolset.sh @@ -20,10 +20,10 @@ function InitializeCustomSDKToolset { fi InitializeDotNetCli true - if [[ "$DISTRO" != "ubuntu" || "$MAJOR_VERSION" -le 16 ]]; then - InstallDotNetSharedFramework "1.0.5" - InstallDotNetSharedFramework "1.1.2" - fi + # if [[ "$DISTRO" != "ubuntu" || "$MAJOR_VERSION" -le 16 ]]; then + # InstallDotNetSharedFramework "1.0.5" + # InstallDotNetSharedFramework "1.1.2" + # fi InstallDotNetSharedFramework "2.1.0" InstallDotNetSharedFramework "2.2.8" InstallDotNetSharedFramework "3.1.0" diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs index 80168c082522..22421e64c30d 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs @@ -42,7 +42,7 @@ internal class WorkloadInstallCommand : CommandBase private readonly IWorkloadManifestUpdater _workloadManifestUpdater; private readonly ReleaseVersion _sdkVersion; private readonly SdkFeatureBand _sdkFeatureBand; - private readonly string _userHome; + private readonly string _userProfileDir; private readonly string _tempDirPath; private readonly string _dotnetPath; @@ -54,7 +54,7 @@ public WorkloadInstallCommand( INuGetPackageDownloader nugetPackageDownloader = null, IWorkloadManifestUpdater workloadManifestUpdater = null, string dotnetDir = null, - string userHome = null, + string userProfileDir = null, string tempDirPath = null, string version = null, IReadOnlyCollection workloadIds = null) @@ -90,12 +90,12 @@ public WorkloadInstallCommand( filePermissionSetter: null, new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir, _verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger()), _verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger(), restoreActionConfig: restoreActionConfig); + _userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; _workloadInstaller = workloadInstaller ?? WorkloadInstallerFactory.GetWorkloadInstaller(_reporter, sdkFeatureBand, - _workloadResolver, _verbosity, _nugetPackageDownloader, _dotnetPath, _tempDirPath, + _workloadResolver, _verbosity, _nugetPackageDownloader, _dotnetPath, _tempDirPath, _userProfileDir, _packageSourceLocation, restoreActionConfig, elevationRequired: !_printDownloadLinkOnly && string.IsNullOrWhiteSpace(_downloadToCacheOption)); - _userHome = userHome ?? CliFolderPathCalculator.DotnetHomePath; - _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter, _workloadResolver, _nugetPackageDownloader, _userHome, _tempDirPath, + _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter, _workloadResolver, _nugetPackageDownloader, _userProfileDir, _tempDirPath, _workloadInstaller.GetWorkloadInstallationRecordRepository(), _packageSourceLocation); ValidateWorkloadIdsInput(); diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs index 17faa37613e4..7524c03d9710 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs @@ -8,6 +8,7 @@ using Microsoft.DotNet.Workloads.Workload.Install.InstallRecord; using Microsoft.DotNet.Cli; using Microsoft.DotNet.Cli.NuGetPackageDownloader; +using Microsoft.DotNet.Configurer; namespace Microsoft.DotNet.Workloads.Workload.Install { @@ -21,6 +22,7 @@ public static IInstaller GetWorkloadInstaller( INuGetPackageDownloader nugetPackageDownloader = null, string dotnetDir = null, string tempDirPath = null, + string userProfileDir = null, PackageSourceLocation packageSourceLocation = null, RestoreActionConfig restoreActionConfig = null, bool elevationRequired = true) @@ -45,12 +47,15 @@ public static IInstaller GetWorkloadInstaller( throw new GracefulException(LocalizableStrings.InadequatePermissions, isUserError: false); } + userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; + return new NetSdkManagedInstaller(reporter, sdkFeatureBand, workloadResolver, nugetPackageDownloader, dotnetDir: dotnetDir, tempDirPath: tempDirPath, + userProfileDir: userProfileDir, verbosity: verbosity, packageSourceLocation: packageSourceLocation, restoreActionConfig: restoreActionConfig); diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs index 3fba464eb6b9..adcc562de654 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs @@ -27,7 +27,7 @@ internal class WorkloadManifestUpdater : IWorkloadManifestUpdater private readonly IWorkloadResolver _workloadResolver; private readonly INuGetPackageDownloader _nugetPackageDownloader; private readonly SdkFeatureBand _sdkFeatureBand; - private readonly string _userHome; + private readonly string _userProfileDir; private readonly string _tempDirPath; private readonly PackageSourceLocation _packageSourceLocation; Func _getEnvironmentVariable; @@ -36,7 +36,7 @@ internal class WorkloadManifestUpdater : IWorkloadManifestUpdater public WorkloadManifestUpdater(IReporter reporter, IWorkloadResolver workloadResolver, INuGetPackageDownloader nugetPackageDownloader, - string userHome, + string userProfileDir, string tempDirPath, IWorkloadInstallationRecordRepository workloadRecordRepo, PackageSourceLocation packageSourceLocation = null, @@ -44,7 +44,7 @@ public WorkloadManifestUpdater(IReporter reporter, { _reporter = reporter; _workloadResolver = workloadResolver; - _userHome = userHome; + _userProfileDir = userProfileDir; _tempDirPath = tempDirPath; _nugetPackageDownloader = nugetPackageDownloader; _sdkFeatureBand = new SdkFeatureBand(_workloadResolver.GetSdkFeatureBand()); @@ -66,11 +66,11 @@ private static WorkloadManifestUpdater GetInstance() new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir, new NullLogger()), new NullLogger(), reporter); - var userHome = CliFolderPathCalculator.DotnetHomePath; + var userProfileDir = CliFolderPathCalculator.DotnetUserProfileFolderPath; var workloadRecordRepo = WorkloadInstallerFactory.GetWorkloadInstaller(reporter, new SdkFeatureBand(sdkVersion), workloadResolver, Cli.VerbosityOptions.normal) .GetWorkloadInstallationRecordRepository(); - return new WorkloadManifestUpdater(reporter, workloadResolver, nugetPackageDownloader, userHome, tempPackagesDir.Value, workloadRecordRepo); + return new WorkloadManifestUpdater(reporter, workloadResolver, nugetPackageDownloader, userProfileDir, tempPackagesDir.Value, workloadRecordRepo); } public async Task UpdateAdvertisingManifestsAsync(bool includePreviews, DirectoryPath? offlineCache = null) @@ -140,7 +140,7 @@ public static void AdvertiseWorkloadUpdates() try { var backgroundUpdatesDisabled = bool.TryParse(Environment.GetEnvironmentVariable(EnvironmentVariableNames.WORKLOAD_UPDATE_NOTIFY_DISABLE), out var disableEnvVar) && disableEnvVar; - var adUpdatesFile = GetAdvertisingWorkloadsFilePath(CliFolderPathCalculator.DotnetHomePath); + var adUpdatesFile = GetAdvertisingWorkloadsFilePath(CliFolderPathCalculator.DotnetUserProfileFolderPath); if (!backgroundUpdatesDisabled && File.Exists(adUpdatesFile)) { var updatableWorkloads = JsonSerializer.Deserialize(File.ReadAllText(adUpdatesFile)); @@ -192,7 +192,7 @@ public IEnumerable GetUpdatableWorkloadsToAdvertise(IEnumerable NewerManifestPackageExists(ManifestId manifest) private bool BackgroundUpdatesAreDisabled() => bool.TryParse(_getEnvironmentVariable(EnvironmentVariableNames.WORKLOAD_UPDATE_NOTIFY_DISABLE), out var disableEnvVar) && disableEnvVar; - private string GetAdvertisingManifestSentinalPath() => Path.Combine(_userHome, ".dotnet", ".workloadAdvertisingManifestSentinal"); + private string GetAdvertisingManifestSentinalPath() => Path.Combine(_userProfileDir, ".workloadAdvertisingManifestSentinal"); - private string GetAdvertisingWorkloadsFilePath() => GetAdvertisingWorkloadsFilePath(_userHome); + private string GetAdvertisingWorkloadsFilePath() => GetAdvertisingWorkloadsFilePath(_userProfileDir); - private static string GetAdvertisingWorkloadsFilePath(string userHome) => Path.Combine(userHome, ".dotnet", ".workloadAdvertisingUpdates"); + private static string GetAdvertisingWorkloadsFilePath(string userProfileDir) => Path.Combine(userProfileDir, ".workloadAdvertisingUpdates"); private string GetAdvertisingManifestPath(SdkFeatureBand featureBand, ManifestId manifestId) => - Path.Combine(_userHome, ".dotnet", "sdk-advertising", featureBand.ToString(), manifestId.ToString()); + Path.Combine(_userProfileDir, "sdk-advertising", featureBand.ToString(), manifestId.ToString()); internal static PackageId GetManifestPackageId(SdkFeatureBand featureBand, ManifestId manifestId) => GetManifestPackageId(featureBand, manifestId, InstallType.FileBased); diff --git a/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs index 44d0a864b07c..47c9c4a097e8 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs @@ -31,7 +31,7 @@ internal class WorkloadListCommand : CommandBase private readonly IReporter _reporter; private readonly string _targetSdkVersion; private readonly string _tempDirPath; - private readonly string _userHome; + private readonly string _userProfileDir; private readonly VerbosityOptions _verbosity; private readonly IWorkloadManifestUpdater _workloadManifestUpdater; private readonly IWorkloadInstallationRecordRepository _workloadRecordRepo; @@ -42,7 +42,7 @@ public WorkloadListCommand( IWorkloadInstallationRecordRepository workloadRecordRepo = null, string currentSdkVersion = null, string dotnetDir = null, - string userHome = null, + string userProfileDir = null, string tempDirPath = null, INuGetPackageDownloader nugetPackageDownloader = null, IWorkloadManifestUpdater workloadManifestUpdater = null, @@ -69,9 +69,9 @@ public WorkloadListCommand( string.IsNullOrWhiteSpace(_targetSdkVersion) ? currentSdkReleaseVersion.ToString() : _targetSdkVersion); - _userHome = userHome ?? CliFolderPathCalculator.DotnetHomePath; + _userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; DirectoryPath tempPackagesDir = - new(Path.Combine(_userHome, ".dotnet", "sdk-advertising-temp")); + new(Path.Combine(_userProfileDir, "sdk-advertising-temp")); NullLogger nullLogger = new NullLogger(); _nugetPackageDownloader = nugetPackageDownloader ?? new NuGetPackageDownloader(tempPackagesDir, null, @@ -81,11 +81,11 @@ public WorkloadListCommand( workloadResolver ??= WorkloadResolver.Create(workloadManifestProvider, _dotnetPath, currentSdkReleaseVersion.ToString()); _workloadRecordRepo = workloadRecordRepo ?? - WorkloadInstallerFactory.GetWorkloadInstaller(reporter, _currentSdkFeatureBand, workloadResolver, _verbosity, + WorkloadInstallerFactory.GetWorkloadInstaller(reporter, _currentSdkFeatureBand, workloadResolver, _verbosity, userProfileDir: _userProfileDir, elevationRequired: false).GetWorkloadInstallationRecordRepository(); _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter, - workloadResolver, _nugetPackageDownloader, _userHome, _tempDirPath, _workloadRecordRepo); + workloadResolver, _nugetPackageDownloader, _userProfileDir, _tempDirPath, _workloadRecordRepo); } public override int Execute() diff --git a/src/Cli/dotnet/commands/dotnet-workload/repair/WorkloadRepairCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/repair/WorkloadRepairCommand.cs index d2655a75a548..dcd9f2a5edf9 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/repair/WorkloadRepairCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/repair/WorkloadRepairCommand.cs @@ -7,6 +7,7 @@ using Microsoft.Deployment.DotNet.Releases; using Microsoft.DotNet.Cli; using Microsoft.DotNet.Cli.Utils; +using Microsoft.DotNet.Configurer; using Microsoft.NET.Sdk.WorkloadManifestReader; using System.IO; using System.Linq; @@ -36,6 +37,7 @@ public WorkloadRepairCommand( INuGetPackageDownloader nugetPackageDownloader = null, string dotnetDir = null, string tempDirPath = null, + string userProfileDir = null, string version = null) : base(parseResult) { @@ -61,9 +63,10 @@ public WorkloadRepairCommand( tempPackagesDir, filePermissionSetter: null, new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir, nullLogger), nullLogger, restoreActionConfig: _parseResult.ToRestoreActionConfig()); + userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; _workloadInstaller = workloadInstaller ?? WorkloadInstallerFactory.GetWorkloadInstaller(_reporter, sdkFeatureBand, - _workloadResolver, _verbosity, nugetPackageDownloader, dotnetDir, tempDirPath, + _workloadResolver, _verbosity, nugetPackageDownloader, dotnetDir, tempDirPath, userProfileDir, _packageSourceLocation, _parseResult.ToRestoreActionConfig()); } diff --git a/src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs index 1272593a16ef..43b57367714c 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs @@ -42,7 +42,7 @@ internal class WorkloadUpdateCommand : CommandBase private readonly INuGetPackageDownloader _nugetPackageDownloader; private readonly IWorkloadManifestUpdater _workloadManifestUpdater; private readonly ReleaseVersion _sdkVersion; - private readonly string _userHome; + private readonly string _userProfileDir; private readonly string _dotnetPath; private readonly string _tempDirPath; @@ -54,7 +54,7 @@ public WorkloadUpdateCommand( INuGetPackageDownloader nugetPackageDownloader = null, IWorkloadManifestUpdater workloadManifestUpdater = null, string dotnetDir = null, - string userHome = null, + string userProfileDir = null, string tempDirPath = null, string version = null) : base(parseResult) @@ -85,16 +85,16 @@ public WorkloadUpdateCommand( _workloadResolver = workloadResolver ?? WorkloadResolver.Create(workloadManifestProvider, _dotnetPath, _sdkVersion.ToString()); var sdkFeatureBand = new SdkFeatureBand(_sdkVersion); var restoreActionConfig = _parseResult.ToRestoreActionConfig(); + _userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; _workloadInstaller = workloadInstaller ?? WorkloadInstallerFactory.GetWorkloadInstaller(_reporter, sdkFeatureBand, _workloadResolver, _verbosity, nugetPackageDownloader, - dotnetDir, _tempDirPath, packageSourceLocation: _packageSourceLocation, restoreActionConfig, + dotnetDir, _tempDirPath, _userProfileDir, packageSourceLocation: _packageSourceLocation, restoreActionConfig, elevationRequired: !_printDownloadLinkOnly && string.IsNullOrWhiteSpace(_downloadToCacheOption)); - _userHome = userHome ?? CliFolderPathCalculator.DotnetHomePath; var tempPackagesDir = new DirectoryPath(Path.Combine(_tempDirPath, "dotnet-sdk-advertising-temp")); _nugetPackageDownloader = nugetPackageDownloader ?? new NuGetPackageDownloader(tempPackagesDir, filePermissionSetter: null, new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir, _verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger()), _verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger(), restoreActionConfig: restoreActionConfig); - _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter, _workloadResolver, _nugetPackageDownloader, _userHome, _tempDirPath, + _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter, _workloadResolver, _nugetPackageDownloader, _userProfileDir, _tempDirPath, _workloadInstaller.GetWorkloadInstallationRecordRepository(), _packageSourceLocation); } diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs index d324292b9a38..666caaefe281 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs @@ -289,10 +289,12 @@ internal void ReplaceFilesystemChecksForTest(Func fileExists, Func string GetPackPath(WorkloadPackId resolvedPackageId, string packageVersion, WorkloadPackKind kind, out bool isInstalled) { isInstalled = false; - string packPath = ""; - bool isFile; + string? firstPackPath = null; + string? installedPackPath = null; foreach (var rootPath in _dotnetRootPaths) { + string packPath; + bool isFile; switch (kind) { case WorkloadPackKind.Framework: @@ -316,6 +318,8 @@ string GetPackPath(WorkloadPackId resolvedPackageId, string packageVersion, Work throw new ArgumentException($"The package kind '{kind}' is not known", nameof(kind)); } + firstPackPath ??= packPath; + //can we do a more robust check than directory.exists? isInstalled = isFile ? _fileExistOverride?.Invoke(packPath) ?? File.Exists(packPath) : @@ -323,10 +327,11 @@ string GetPackPath(WorkloadPackId resolvedPackageId, string packageVersion, Work if (isInstalled) { + installedPackPath = packPath; break; } } - return packPath; + return installedPackPath ?? firstPackPath ?? ""; } } diff --git a/src/Tests/Microsoft.NET.TestFramework/TestAssetsManager.cs b/src/Tests/Microsoft.NET.TestFramework/TestAssetsManager.cs index ea4d572c4d91..3ef099f00e02 100644 --- a/src/Tests/Microsoft.NET.TestFramework/TestAssetsManager.cs +++ b/src/Tests/Microsoft.NET.TestFramework/TestAssetsManager.cs @@ -124,6 +124,9 @@ public static string GetTestDestinationDirectoryPath( directoryName = directoryName.Append(testProjectName); } + // avoid collisions between derived test classes using same base method concurrently + directoryName = directoryName.Append(Guid.NewGuid().ToString("N").Substring(0, 8)); + // We need to ensure the directory name isn't over 24 characters in length if (directoryName.Length > 24) { diff --git a/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs b/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs index f8fd8296ce97..36a9d785301f 100644 --- a/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs +++ b/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs @@ -25,13 +25,15 @@ namespace Microsoft.DotNet.Cli.Workload.Install.Tests { - public class GivenDotnetWorkloadInstall : SdkTest + public abstract class GivenDotnetWorkloadInstallBase : SdkTest { private readonly BufferedReporter _reporter; private readonly string _manifestPath; + private readonly bool _userLocal; - public GivenDotnetWorkloadInstall(ITestOutputHelper log) : base(log) + protected GivenDotnetWorkloadInstallBase(ITestOutputHelper log, bool userLocal) : base(log) { + _userLocal = userLocal; _reporter = new BufferedReporter(); _manifestPath = Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleManifest"), "Sample.json"); } @@ -241,7 +243,7 @@ public void GivenWorkloadInstallItErrorsOnUnsupportedPlatform() var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", mockWorkloadId }); var exceptionThrown = Assert.Throws(() => new WorkloadInstallCommand(parseResult, reporter: _reporter, workloadResolver: workloadResolver, workloadInstaller: installer, - nugetPackageDownloader: nugetDownloader, workloadManifestUpdater: manifestUpdater, userHome: testDirectory, dotnetDir: dotnetRoot, version: "6.0.100")); + nugetPackageDownloader: nugetDownloader, workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, dotnetDir: dotnetRoot, version: "6.0.100")); exceptionThrown.Message.Should().Be(String.Format(Workloads.Workload.Install.LocalizableStrings.WorkloadNotSupportedOnPlatform, mockWorkloadId)); } @@ -250,35 +252,42 @@ public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback() { var testDirectory = _testAssetsManager.CreateTestDirectory().Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); + var tmpDir = Path.Combine(testDirectory, "tmp"); var manifestPath = Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleManifest"), "MockWorkloadsSample.json"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { manifestPath }), new string[] { dotnetRoot }); - var nugetDownloader = new FailingNuGetPackageDownloader(dotnetRoot); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { manifestPath }), _userLocal ? new string[] { userProfileDir, dotnetRoot } : new string[] { dotnetRoot }); + var nugetDownloader = new FailingNuGetPackageDownloader(tmpDir); var manifestUpdater = new MockWorkloadManifestUpdater(); var sdkFeatureVersion = "6.0.100"; var existingWorkload = "mock-1"; var installingWorkload = "mock-2"; + if (_userLocal) + { + SetUserLocal(dotnetRoot, sdkFeatureVersion); + } // Successfully install a workload var installParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", existingWorkload }); - var installCommand = new WorkloadInstallCommand(installParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: new MockNuGetPackageDownloader(dotnetRoot), - workloadManifestUpdater: manifestUpdater, userHome: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + var installCommand = new WorkloadInstallCommand(installParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: new MockNuGetPackageDownloader(tmpDir), + workloadManifestUpdater: manifestUpdater, userProfileDir: userProfileDir, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); installCommand.Execute(); // Install a workload with a mocked nuget failure installParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", installingWorkload }); installCommand = new WorkloadInstallCommand(installParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userHome: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: userProfileDir, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); var exceptionThrown = Assert.Throws(() => installCommand.Execute()); exceptionThrown.Message.Should().Contain("Test Failure"); // Existing installation is still present - var installRecordPath = Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads"); + string installRoot = _userLocal ? userProfileDir : dotnetRoot; + var installRecordPath = Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads"); Directory.GetFiles(installRecordPath).Count().Should().Be(1); File.Exists(Path.Combine(installRecordPath, existingWorkload)) .Should().BeTrue(); - var packRecordDirs = Directory.GetDirectories(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1")); + var packRecordDirs = Directory.GetDirectories(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1")); packRecordDirs.Count().Should().Be(3); - var installPacks = Directory.GetDirectories(Path.Combine(dotnetRoot, "packs")); + var installPacks = Directory.GetDirectories(Path.Combine(installRoot, "packs")); installPacks.Count().Should().Be(3); } @@ -296,6 +305,11 @@ public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback() var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(manifestUpdates, tempDirManifestPath); + string sdkVersion = "6.0.100"; + if (_userLocal) + { + SetUserLocal(dotnetRoot, sdkVersion); + } var installManager = new WorkloadInstallCommand( parseResult, reporter: _reporter, @@ -303,11 +317,33 @@ public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback() workloadInstaller: installer, nugetPackageDownloader: nugetDownloader, workloadManifestUpdater: manifestUpdater, - userHome: testDirectory, + userProfileDir: testDirectory, dotnetDir: dotnetRoot, version: "6.0.100"); return (testDirectory, installManager, installer, workloadResolver, manifestUpdater, nugetDownloader); } + + private void SetUserLocal(string dotnetDir, string sdkFeatureBand) + { + // Add the userlocal marker file. + string workloadMetadataDir = Path.Combine(dotnetDir, "metadata", "workloads", sdkFeatureBand); + Directory.CreateDirectory(workloadMetadataDir); + File.WriteAllText(Path.Combine(workloadMetadataDir, "userlocal"), ""); + + Assert.True(WorkloadInstall.IsUserLocal(dotnetDir, sdkFeatureBand)); + } + } + + public class UserLocalGivenDotnetWorkloadInstall : GivenDotnetWorkloadInstallBase + { + public UserLocalGivenDotnetWorkloadInstall(ITestOutputHelper log) : base(log, userLocal: true) + { } + } + + public class DotnetWorkloadInstall : GivenDotnetWorkloadInstallBase + { + public DotnetWorkloadInstall(ITestOutputHelper log) : base(log, userLocal: false) + { } } } diff --git a/src/Tests/dotnet-workload-install.Tests/GivenWorkloadManifestUpdater.cs b/src/Tests/dotnet-workload-install.Tests/GivenWorkloadManifestUpdater.cs index 0b371dc4daa8..73214ed2da94 100644 --- a/src/Tests/dotnet-workload-install.Tests/GivenWorkloadManifestUpdater.cs +++ b/src/Tests/dotnet-workload-install.Tests/GivenWorkloadManifestUpdater.cs @@ -51,22 +51,22 @@ public void GivenWorkloadManifestUpdateItCanUpdateAdvertisingManifests() [Fact] public void GivenAdvertisingManifestUpdateItUpdatesWhenNoSentinalExists() { - (var manifestUpdater, var nugetDownloader, var testDir) = GetTestUpdater(); + (var manifestUpdater, var nugetDownloader, var userProfileDir) = GetTestUpdater(); manifestUpdater.BackgroundUpdateAdvertisingManifestsWhenRequiredAsync().Wait(); var expectedDownloadedPackages = _installedManifests .Select(id => ((PackageId, NuGetVersion, DirectoryPath?, PackageSourceLocation))(new PackageId($"{id}.manifest-6.0.100"), null, null, null)); nugetDownloader.DownloadCallParams.Should().BeEquivalentTo(expectedDownloadedPackages); - File.Exists(Path.Combine(testDir, ".dotnet", _manifestSentinalFileName)).Should().BeTrue(); + File.Exists(Path.Combine(userProfileDir, _manifestSentinalFileName)).Should().BeTrue(); } [Fact] public void GivenAdvertisingManifestUpdateItUpdatesWhenDue() { Func getEnvironmentVariable = (envVar) => envVar.Equals(EnvironmentVariableNames.WORKLOAD_UPDATE_NOTIFY_INTERVAL_HOURS) ? "0" : string.Empty; - (var manifestUpdater, var nugetDownloader, var testDir) = GetTestUpdater(getEnvironmentVariable: getEnvironmentVariable); + (var manifestUpdater, var nugetDownloader, var userProfileDir) = GetTestUpdater(getEnvironmentVariable: getEnvironmentVariable); - var sentinalPath = Path.Combine(testDir, ".dotnet", _manifestSentinalFileName); + var sentinalPath = Path.Combine(userProfileDir, _manifestSentinalFileName); File.WriteAllText(sentinalPath, string.Empty); var createTime = DateTime.Now; @@ -82,9 +82,9 @@ public void GivenAdvertisingManifestUpdateItUpdatesWhenDue() [Fact] public void GivenAdvertisingManifestUpdateItDoesNotUpdateWhenNotDue() { - (var manifestUpdater, var nugetDownloader, var testDir) = GetTestUpdater(); + (var manifestUpdater, var nugetDownloader, var userProfileDir) = GetTestUpdater(); - var sentinalPath = Path.Combine(testDir, ".dotnet", _manifestSentinalFileName); + var sentinalPath = Path.Combine(userProfileDir, _manifestSentinalFileName); File.Create(sentinalPath); var createTime = DateTime.Now; @@ -142,7 +142,7 @@ public void GivenWorkloadManifestUpdateItCanCalculateUpdates() var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var workloadResolver = WorkloadResolver.CreateForTests(workloadManifestProvider, new string[] { dotnetRoot }); var installationRepo = new MockInstallationRecordRepository(); - var manifestUpdater = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, testDir, testDir, installationRepo); + var manifestUpdater = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, userProfileDir: Path.Combine(testDir, ".dotnet"), testDir, installationRepo); var manifestUpdates = manifestUpdater.CalculateManifestUpdates().Select( m => (m.manifestId, m.existingVersion,m .newVersion)); manifestUpdates.Should().BeEquivalentTo(expectedManifestUpdates); diff --git a/src/Tests/dotnet-workload-list.Tests/GivenDotnetWorkloadList.cs b/src/Tests/dotnet-workload-list.Tests/GivenDotnetWorkloadList.cs index 8a25958e5c13..2c4f81da1cd2 100644 --- a/src/Tests/dotnet-workload-list.Tests/GivenDotnetWorkloadList.cs +++ b/src/Tests/dotnet-workload-list.Tests/GivenDotnetWorkloadList.cs @@ -96,12 +96,12 @@ public void GivenWorkloadsAreOutOfDateUpdatesAreAdvertised() var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { testDirectory }); // Lay out fake advertising manifests with pack version update for pack A (in workloads 1 and 3) - var userHome = Path.Combine(testDirectory, "userHome"); - var manifestPath = Path.Combine(userHome, ".dotnet", "sdk-advertising", "6.0.100", "SampleManifest", "WorkloadManifest.json"); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); + var manifestPath = Path.Combine(userProfileDir, "sdk-advertising", "6.0.100", "SampleManifest", "WorkloadManifest.json"); Directory.CreateDirectory(Path.GetDirectoryName(manifestPath)); File.Copy(Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleManifest"), "MockListSampleUpdated.json"), manifestPath); - var command = new WorkloadListCommand(_parseResult, _reporter, workloadInstaller, "6.0.100", workloadResolver: workloadResolver, userHome: userHome); + var command = new WorkloadListCommand(_parseResult, _reporter, workloadInstaller, "6.0.100", workloadResolver: workloadResolver, userProfileDir: userProfileDir); command.Execute(); // Workloads 1 and 3 should have updates diff --git a/src/Tests/dotnet-workload-list.Tests/GivenWorkloadInstallerAndWorkloadsInstalled.cs b/src/Tests/dotnet-workload-list.Tests/GivenWorkloadInstallerAndWorkloadsInstalled.cs index 1ff884358465..3dd57df289cc 100644 --- a/src/Tests/dotnet-workload-list.Tests/GivenWorkloadInstallerAndWorkloadsInstalled.cs +++ b/src/Tests/dotnet-workload-list.Tests/GivenWorkloadInstallerAndWorkloadsInstalled.cs @@ -96,7 +96,7 @@ private void Setup(string identifier) _reporter, nugetPackageDownloader: _nugetDownloader, workloadManifestUpdater: new MockWorkloadManifestUpdater(_mockManifestUpdates), - userHome: _testDirectory, + userProfileDir: _testDirectory, currentSdkVersion: CurrentSdkVersion, dotnetDir: _dotnetRoot, workloadRecordRepo: new MockMatchingFeatureBandInstallationRecordRepository()); @@ -135,7 +135,7 @@ public void GivenLowerTargetVersionItShouldThrow() _reporter, nugetPackageDownloader: _nugetDownloader, workloadManifestUpdater: new MockWorkloadManifestUpdater(_mockManifestUpdates), - userHome: _testDirectory, + userProfileDir: _testDirectory, currentSdkVersion: CurrentSdkVersion, dotnetDir: _dotnetRoot, workloadRecordRepo: new MockMatchingFeatureBandInstallationRecordRepository()); @@ -155,7 +155,7 @@ public void GivenSameLowerTargetVersionBandItShouldNotThrow() _reporter, nugetPackageDownloader: _nugetDownloader, workloadManifestUpdater: new MockWorkloadManifestUpdater(_mockManifestUpdates), - userHome: _testDirectory, + userProfileDir: _testDirectory, currentSdkVersion: "6.0.101", dotnetDir: _dotnetRoot, workloadRecordRepo: new MockMatchingFeatureBandInstallationRecordRepository()); diff --git a/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs b/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs index aa197f961b75..ef0e1ff55e8b 100644 --- a/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs +++ b/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs @@ -63,7 +63,7 @@ public void GivenExtraPacksInstalledRepairGarbageCollects() // Install a workload var installParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", installingWorkload }); var installCommand = new WorkloadInstallCommand(installParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userHome: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); installCommand.Execute(); // Add extra pack dirs and records @@ -101,7 +101,7 @@ public void GivenMissingPacksRepairFixesInstall() // Install a workload var installParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", installingWorkload }); var installCommand = new WorkloadInstallCommand(installParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userHome: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); installCommand.Execute(); // Delete pack dirs/ records diff --git a/src/Tests/dotnet-workload-uninstall.Tests/GivenDotnetWorkloadUninstall.cs b/src/Tests/dotnet-workload-uninstall.Tests/GivenDotnetWorkloadUninstall.cs index 04124718ef47..c7ebbeb1c908 100644 --- a/src/Tests/dotnet-workload-uninstall.Tests/GivenDotnetWorkloadUninstall.cs +++ b/src/Tests/dotnet-workload-uninstall.Tests/GivenDotnetWorkloadUninstall.cs @@ -150,7 +150,7 @@ private void InstallWorkload(string installingWorkload, string testDirectory, st var manifestUpdater = new MockWorkloadManifestUpdater(); var installParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", installingWorkload }); var installCommand = new WorkloadInstallCommand(installParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userHome: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); installCommand.Execute(); } diff --git a/src/Tests/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs b/src/Tests/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs index 48d8645343cf..7810d9271242 100644 --- a/src/Tests/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs +++ b/src/Tests/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs @@ -51,7 +51,7 @@ public void GivenWorkloadUpdateItRemovesOldPacksAfterInstall() // Install a workload var installParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", installingWorkload }); var installCommand = new WorkloadInstallCommand(installParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userHome: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); installCommand.Execute(); // 7 packs in packs dir, 1 template pack @@ -85,7 +85,7 @@ public void GivenWorkloadUpdateItRemovesOldPacksAfterInstall() // Update workload var updateParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update" }); var updateCommand = new WorkloadUpdateCommand(updateParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userHome: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); updateCommand.Execute(); // 6 packs in packs dir, 1 template pack @@ -144,7 +144,7 @@ public void GivenWorkloadUpdateAcrossFeatureBandsItUpdatesPacks() // Update workload (without installing any workloads to this feature band) var updateParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--from-previous-sdk" }); var updateCommand = new WorkloadUpdateCommand(updateParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userHome: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); updateCommand.Execute(); foreach (var pack in workloadPacks) @@ -328,7 +328,7 @@ public void GivenPrintRollbackDefinitionItIncludesAllInstalledManifests() workloadInstaller: installer, nugetPackageDownloader: nugetDownloader, workloadManifestUpdater: manifestUpdater, - userHome: testDirectory, + userProfileDir: testDirectory, version: "6.0.100"); return (testDirectory, installManager, installer, workloadResolver, manifestUpdater, nugetDownloader); From 93ab493c92b641c5684645303bcc98fde95718d4 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Thu, 2 Sep 2021 15:35:54 +0200 Subject: [PATCH 16/32] Refactor all the things! --- .../ExceptionExtensions.cs | 5 ++ .../Microsoft.DotNet.Cli.Utils.csproj | 4 -- .../CliFolderPathCalculator.cs | 52 +++++++------------ .../ConfigurationException.cs | 0 .../LocalizableStrings.resx | 3 ++ .../Microsoft.DotNet.Configurer.csproj | 11 ++-- .../ToolPackageFolderPathCalculator.cs | 16 ++++++ .../xlf/LocalizableStrings.cs.xlf | 5 ++ .../xlf/LocalizableStrings.de.xlf | 5 ++ .../xlf/LocalizableStrings.es.xlf | 5 ++ .../xlf/LocalizableStrings.fr.xlf | 5 ++ .../xlf/LocalizableStrings.it.xlf | 5 ++ .../xlf/LocalizableStrings.ja.xlf | 5 ++ .../xlf/LocalizableStrings.ko.xlf | 5 ++ .../xlf/LocalizableStrings.pl.xlf | 5 ++ .../xlf/LocalizableStrings.pt-BR.xlf | 5 ++ .../xlf/LocalizableStrings.ru.xlf | 5 ++ .../xlf/LocalizableStrings.tr.xlf | 5 ++ .../xlf/LocalizableStrings.zh-Hans.xlf | 5 ++ .../xlf/LocalizableStrings.zh-Hant.xlf | 5 ++ src/Cli/dotnet/CommonLocalizableStrings.resx | 3 -- .../ShellShim/EnvironmentPathFactory.cs | 12 ++--- src/Cli/dotnet/commands/RestoringCommand.cs | 7 ++- .../dotnet-new/OptionalWorkloadProvider.cs | 4 +- .../install/NetSdkManagedInstaller.cs | 4 +- .../install/WorkloadInstallCommand.cs | 10 ++-- ...etSdkManagedInstallationRecordInstaller.cs | 1 - .../install/WorkloadInstallerFactory.cs | 4 +- .../install/WorkloadManifestUpdater.cs | 13 +++-- .../install/WorkloadOptionsExtensions.cs | 4 +- .../list/WorkloadListCommand.cs | 9 ++-- .../repair/WorkloadRepairCommand.cs | 10 ++-- .../search/WorkloadSearchCommand.cs | 9 ++-- .../uninstall/WorkloadUninstallCommand.cs | 11 ++-- .../update/WorkloadUpdateCommand.cs | 16 +++--- src/Cli/dotnet/dotnet.csproj | 6 --- .../xlf/CommonLocalizableStrings.cs.xlf | 5 -- .../xlf/CommonLocalizableStrings.de.xlf | 5 -- .../xlf/CommonLocalizableStrings.es.xlf | 5 -- .../xlf/CommonLocalizableStrings.fr.xlf | 5 -- .../xlf/CommonLocalizableStrings.it.xlf | 5 -- .../xlf/CommonLocalizableStrings.ja.xlf | 5 -- .../xlf/CommonLocalizableStrings.ko.xlf | 5 -- .../xlf/CommonLocalizableStrings.pl.xlf | 5 -- .../xlf/CommonLocalizableStrings.pt-BR.xlf | 5 -- .../xlf/CommonLocalizableStrings.ru.xlf | 5 -- .../xlf/CommonLocalizableStrings.tr.xlf | 5 -- .../xlf/CommonLocalizableStrings.zh-Hans.xlf | 5 -- .../xlf/CommonLocalizableStrings.zh-Hant.xlf | 5 -- src/Common/CliFolderPathCalculatorCore.cs | 46 ++++++++++++++++ .../Microsoft.DotNet.TemplateLocator.csproj | 4 -- .../TemplateLocator.cs | 7 +-- .../MSBuildSdkResolver.cs | 4 +- ...Microsoft.DotNet.MSBuildSdkResolver.csproj | 8 +-- .../CachingWorkloadResolver.cs | 6 +-- ....NET.Sdk.WorkloadMSBuildSdkResolver.csproj | 8 +-- .../WorkloadSdkResolver.cs | 5 +- ...soft.NET.Sdk.WorkloadManifestReader.csproj | 4 -- .../SdkDirectoryWorkloadManifestProvider.cs | 12 ++--- .../WorkloadResolver.cs | 6 +-- .../Microsoft.NET.Build.Tasks.csproj | 5 +- .../ProcessFrameworkReferences.cs | 11 ++-- .../ShowMissingWorkloads.cs | 6 ++- .../GivenAPathCalculator.cs | 3 +- .../GivenAnTemplateLocator.cs | 6 +-- ...kDirectoryWorkloadManifestProviderTests.cs | 20 +++---- .../GivenNetSdkManagedWorkloadInstall.cs | 2 +- ...atTheUserIsRunningDotNetForTheFirstTime.cs | 4 +- src/Tests/dotnet.Tests/dotnet.Tests.csproj | 10 ---- 69 files changed, 268 insertions(+), 253 deletions(-) rename src/{Common => Cli/Microsoft.DotNet.Cli.Utils}/ExceptionExtensions.cs (80%) rename src/{Common => Cli/Microsoft.DotNet.Configurer}/CliFolderPathCalculator.cs (51%) rename src/{Common => Cli/Microsoft.DotNet.Configurer}/ConfigurationException.cs (100%) create mode 100644 src/Cli/Microsoft.DotNet.Configurer/ToolPackageFolderPathCalculator.cs create mode 100644 src/Common/CliFolderPathCalculatorCore.cs diff --git a/src/Common/ExceptionExtensions.cs b/src/Cli/Microsoft.DotNet.Cli.Utils/ExceptionExtensions.cs similarity index 80% rename from src/Common/ExceptionExtensions.cs rename to src/Cli/Microsoft.DotNet.Cli.Utils/ExceptionExtensions.cs index 03f984404c37..265edd05e945 100644 --- a/src/Common/ExceptionExtensions.cs +++ b/src/Cli/Microsoft.DotNet.Cli.Utils/ExceptionExtensions.cs @@ -14,6 +14,11 @@ public static TException DisplayAsError(this TException exception) return exception; } + public static void ReportAsWarning(this Exception e) + { + Reporter.Verbose.WriteLine($"Warning: Ignoring exception: {e.ToString().Yellow()}"); + } + public static bool ShouldBeDisplayedAsError(this Exception e) => e.Data.Contains(CLI_User_Displayed_Exception); diff --git a/src/Cli/Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj b/src/Cli/Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj index bfb7215e6a8c..66a26913b7e9 100644 --- a/src/Cli/Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj +++ b/src/Cli/Microsoft.DotNet.Cli.Utils/Microsoft.DotNet.Cli.Utils.csproj @@ -25,10 +25,6 @@ - - - - Environment.GetEnvironmentVariable("DOTNET_CLI_TEST_FALLBACKFOLDER") ?? - Path.Combine(new DirectoryInfo(AppContext.BaseDirectory).Parent!.FullName, "NuGetFallbackFolder"); + Path.Combine(new DirectoryInfo(AppContext.BaseDirectory).Parent.FullName, "NuGetFallbackFolder"); public static string ToolsShimPath => Path.Combine(DotnetUserProfileFolderPath, ToolsShimFolderName); public static string ToolsPackagePath => ToolPackageFolderPathCalculator.GetToolPackageFolderPath(ToolsShimPath); + public static BashPathUnderHomeDirectory ToolsShimPathInUnix => + new BashPathUnderHomeDirectory( + DotnetHomePath, + Path.Combine(DotnetProfileDirectoryName, ToolsShimFolderName)); + public static string WindowsNonExpandedToolsShimPath { get @@ -40,39 +45,22 @@ public static string WindowsNonExpandedToolsShimPath public static string ToolsResolverCachePath => Path.Combine(DotnetUserProfileFolderPath, ToolsResolverCacheFolderName); - public static string PlatformHomeVariableName => - IsWindows ? "USERPROFILE" : "HOME"; + public static string PlatformHomeVariableName => CliFolderPathCalculatorCore.PlatformHomeVariableName; public static string DotnetHomePath { get { - var home = Environment.GetEnvironmentVariable(DotnetHomeVariableName); - if (string.IsNullOrEmpty(home)) - { - home = Environment.GetEnvironmentVariable(PlatformHomeVariableName); - if (string.IsNullOrEmpty(home)) - { - throw ExceptionExtensions.DisplayAsError(new ConfigurationException( - string.Format( - CommonLocalizableStrings.FailedToDetermineUserHomeDirectory, - DotnetHomeVariableName))); - } - } - - return home; + return CliFolderPathCalculatorCore.GetDotnetUserProfileFolderPath() + ?? throw new ConfigurationException( + string.Format( + LocalizableStrings.FailedToDetermineUserHomeDirectory, + DotnetHomeVariableName)) + .DisplayAsError(); } } - private static bool IsWindows => RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - } - - static class ToolPackageFolderPathCalculator - { - private const string NestedToolPackageFolderName = ".store"; - public static string GetToolPackageFolderPath(string toolsShimPath) - { - return Path.Combine(toolsShimPath, NestedToolPackageFolderName); - } + public static string NuGetUserSettingsDirectory => + NuGetEnvironment.GetFolderPath(NuGetFolderPath.UserSettingsDirectory); } } diff --git a/src/Common/ConfigurationException.cs b/src/Cli/Microsoft.DotNet.Configurer/ConfigurationException.cs similarity index 100% rename from src/Common/ConfigurationException.cs rename to src/Cli/Microsoft.DotNet.Configurer/ConfigurationException.cs diff --git a/src/Cli/Microsoft.DotNet.Configurer/LocalizableStrings.resx b/src/Cli/Microsoft.DotNet.Configurer/LocalizableStrings.resx index cd52ebe7f46e..e5d77533d328 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/LocalizableStrings.resx +++ b/src/Cli/Microsoft.DotNet.Configurer/LocalizableStrings.resx @@ -122,6 +122,9 @@ --------------------- SDK Version: {1} + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Telemetry --------- diff --git a/src/Cli/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj b/src/Cli/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj index 22741782a0c6..203d4f273e3a 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj +++ b/src/Cli/Microsoft.DotNet.Configurer/Microsoft.DotNet.Configurer.csproj @@ -9,17 +9,10 @@ git $(DefineConstants);EXCLUDE_ASPNETCORE true - - - $(NoWarn);0436 - - - - @@ -31,4 +24,8 @@ + + + + diff --git a/src/Cli/Microsoft.DotNet.Configurer/ToolPackageFolderPathCalculator.cs b/src/Cli/Microsoft.DotNet.Configurer/ToolPackageFolderPathCalculator.cs new file mode 100644 index 000000000000..4323520ddfb7 --- /dev/null +++ b/src/Cli/Microsoft.DotNet.Configurer/ToolPackageFolderPathCalculator.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.IO; + +namespace Microsoft.DotNet.Configurer +{ + public static class ToolPackageFolderPathCalculator + { + private const string NestedToolPackageFolderName = ".store"; + public static string GetToolPackageFolderPath(string toolsShimPath) + { + return Path.Combine(toolsShimPath, NestedToolPackageFolderName); + } + } +} diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.cs.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.cs.xlf index c9ec0c8f66ff..134152e56b00 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.cs.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.cs.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Nešlo určit domovský adresář uživatele. Nastavte proměnnou prostředí {0}, která určí adresář, který se má použít. + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.de.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.de.xlf index 2f080cbf5d6e..e757d42138fb 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.de.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.de.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Das Startverzeichnis des Benutzers konnte nicht ermittelt werden. Legen Sie die Umgebungsvariable "{0}" fest, um das zu verwendende Verzeichnis anzugeben. + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.es.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.es.xlf index f4f2462d69d7..481a73bb1e0c 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.es.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.es.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + No se puede determinar el directorio raíz del usuario. Establezca la variable de entorno “{0}” para especificar el directorio que debe usarse. + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.fr.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.fr.xlf index 3c7f0a1c118b..27da1cb03099 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.fr.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.fr.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Impossible de déterminer le répertoire de base de l'utilisateur. Définissez la variable d'environnement '{0}' pour spécifier le répertoire à utiliser. + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.it.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.it.xlf index 83a22cbe41e6..4e28cdc82b33 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.it.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.it.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Non è stato possibile determinare la home directory dell'utente. Impostare la variabile di ambiente '{0}' per specificare la directory da usare. + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ja.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ja.xlf index 169b1eaa4791..dab78dd97df3 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ja.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ja.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + ユーザーのホーム ディレクトリを特定できませんでした。使用するディレクトリを指定するには、'{0}' 環境変数を設定してください。 + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ko.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ko.xlf index 20c5a15809a2..bfba085a0595 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ko.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ko.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + 사용자의 홈 디렉터리를 확인할 수 없습니다. '{0}' 환경 변수를 설정하여 사용할 디렉터리를 지정하세요. + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pl.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pl.xlf index c99f34d73c57..135539034541 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pl.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pl.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Nie można określić katalogu macierzystego użytkownika. Ustaw zmienną środowiskową „{0}”, aby określić katalog do użycia. + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pt-BR.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pt-BR.xlf index eb4d48ef7553..278792b0bb07 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pt-BR.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.pt-BR.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + O diretório inicial do usuário não pôde ser definido. Configure a variável de ambiente '{0}' para especificar o diretório a ser utilizado. + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ru.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ru.xlf index 43134bdc249b..cfc29cfb640c 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ru.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.ru.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Не удалось определить домашний каталог пользователя. Чтобы указать нужный каталог, задайте переменную среды "{0}". + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.tr.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.tr.xlf index d973b0e243ae..bdd35178e1b4 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.tr.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.tr.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + Kullanıcının giriş dizini belirlenemedi. Kullanılacak dizini belirtmek için '{0}' ortam değişkenini ayarlayın. + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hans.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hans.xlf index 54231e29c2f7..11178b70011c 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hans.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hans.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + 无法确定用户的主目录。设置“{0}”环境变量以指定要使用的目录。 + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hant.xlf b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hant.xlf index dece9bc4f44f..025953cfa9c8 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hant.xlf +++ b/src/Cli/Microsoft.DotNet.Configurer/xlf/LocalizableStrings.zh-Hant.xlf @@ -2,6 +2,11 @@ + + The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. + 無法判定該使用者的主目錄。請設定 '{0}' 環境變數,指定要使用的目錄。 + + ---------------- Installed an ASP.NET Core HTTPS development certificate. diff --git a/src/Cli/dotnet/CommonLocalizableStrings.resx b/src/Cli/dotnet/CommonLocalizableStrings.resx index 10025299abc6..c5a8fc30e679 100644 --- a/src/Cli/dotnet/CommonLocalizableStrings.resx +++ b/src/Cli/dotnet/CommonLocalizableStrings.resx @@ -699,7 +699,4 @@ The default is 'true' if a runtime identifier is specified. The '--self-contained' and '--no-self-contained' options cannot be used together. - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - diff --git a/src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs b/src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs index f7e5ee4e8611..ec16b2cc2157 100644 --- a/src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs +++ b/src/Cli/dotnet/ShellShim/EnvironmentPathFactory.cs @@ -2,7 +2,6 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; -using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Xml.Xsl; @@ -44,7 +43,7 @@ public static IEnvironmentPath CreateEnvironmentPath( else if (OperatingSystem.IsLinux() && isDotnetBeingInvokedFromNativeInstaller) { environmentPath = new LinuxEnvironmentPath( - ToolsShimPathInUnix, + CliFolderPathCalculator.ToolsShimPathInUnix, Reporter.Output, environmentProvider, new FileWrapper()); @@ -52,7 +51,7 @@ public static IEnvironmentPath CreateEnvironmentPath( else if (OperatingSystem.IsMacOS() && isDotnetBeingInvokedFromNativeInstaller) { environmentPath = new OsxBashEnvironmentPath( - executablePath: ToolsShimPathInUnix, + executablePath: CliFolderPathCalculator.ToolsShimPathInUnix, reporter: Reporter.Output, environmentProvider: environmentProvider, fileSystem: new FileWrapper()); @@ -72,7 +71,7 @@ public static IEnvironmentPathInstruction CreateEnvironmentPathInstruction( if (OperatingSystem.IsMacOS() && ZshDetector.IsZshTheUsersShell(environmentProvider)) { return new OsxZshEnvironmentPathInstruction( - executablePath: ToolsShimPathInUnix, + executablePath: CliFolderPathCalculator.ToolsShimPathInUnix, reporter: Reporter.Output, environmentProvider: environmentProvider); } @@ -89,10 +88,5 @@ public static IEnvironmentPathInstruction CreateEnvironmentPathInstruction( return CreateEnvironmentPath(true, environmentProvider); } - - private static BashPathUnderHomeDirectory ToolsShimPathInUnix => - new BashPathUnderHomeDirectory( - CliFolderPathCalculator.DotnetHomePath, - Path.Combine(CliFolderPathCalculator.DotnetProfileDirectoryName, CliFolderPathCalculator.ToolsShimFolderName)); } } diff --git a/src/Cli/dotnet/commands/RestoringCommand.cs b/src/Cli/dotnet/commands/RestoringCommand.cs index dc5f94f5edcc..f5860fe07311 100644 --- a/src/Cli/dotnet/commands/RestoringCommand.cs +++ b/src/Cli/dotnet/commands/RestoringCommand.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.DotNet.Configurer; using Microsoft.DotNet.Tools.MSBuild; using Microsoft.DotNet.Tools.Restore; using Microsoft.DotNet.Workloads.Workload.Install; @@ -18,10 +19,12 @@ public class RestoringCommand : MSBuildForwardingApp public RestoringCommand( IEnumerable msbuildArgs, bool noRestore, - string msbuildPath = null) + string msbuildPath = null, + string userProfileDir = null) : base(GetCommandArguments(msbuildArgs, noRestore), msbuildPath) { - Task.Run(() => WorkloadManifestUpdater.BackgroundUpdateAdvertisingManifestsAsync()); + userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; + Task.Run(() => WorkloadManifestUpdater.BackgroundUpdateAdvertisingManifestsAsync(userProfileDir)); SeparateRestoreCommand = GetSeparateRestoreCommand(msbuildArgs, noRestore, msbuildPath); } diff --git a/src/Cli/dotnet/commands/dotnet-new/OptionalWorkloadProvider.cs b/src/Cli/dotnet/commands/dotnet-new/OptionalWorkloadProvider.cs index 28252a167be5..0e370a1d0cd8 100644 --- a/src/Cli/dotnet/commands/dotnet-new/OptionalWorkloadProvider.cs +++ b/src/Cli/dotnet/commands/dotnet-new/OptionalWorkloadProvider.cs @@ -1,4 +1,5 @@ using Microsoft.DotNet.Cli; +using Microsoft.DotNet.Configurer; using Microsoft.TemplateEngine.Abstractions; using Microsoft.TemplateEngine.Abstractions.TemplatePackage; using System; @@ -35,8 +36,9 @@ public Task> GetAllTemplatePackagesAsync(Cancell var sdkDirectory = Path.GetDirectoryName(typeof(DotnetFiles).Assembly.Location); var sdkVersion = Path.GetFileName(sdkDirectory); var dotnetRootPath = Path.GetDirectoryName(Path.GetDirectoryName(sdkDirectory)); + string userProfileDir = CliFolderPathCalculator.DotnetUserProfileFolderPath; - var packages = optionalWorkloadLocator.GetDotnetSdkTemplatePackages(sdkVersion, dotnetRootPath); + var packages = optionalWorkloadLocator.GetDotnetSdkTemplatePackages(sdkVersion, dotnetRootPath, userProfileDir); var fileSystem = _environmentSettings.Host.FileSystem; foreach (var packageInfo in packages) { diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs index 2e9426619f28..2af04c45879c 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs @@ -40,15 +40,15 @@ internal class NetSdkManagedInstaller : IWorkloadPackInstaller public NetSdkManagedInstaller(IReporter reporter, SdkFeatureBand sdkFeatureBand, IWorkloadResolver workloadResolver, + string userProfileDir, INuGetPackageDownloader nugetPackageDownloader = null, string dotnetDir = null, - string userProfileDir = null, string tempDirPath = null, VerbosityOptions verbosity = VerbosityOptions.normal, PackageSourceLocation packageSourceLocation = null, RestoreActionConfig restoreActionConfig = null) { - _userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; + _userProfileDir = userProfileDir; _dotnetDir = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath); _tempPackagesDir = new DirectoryPath(tempDirPath ?? Path.GetTempPath()); ILogger logger = verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger(); diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs index 22421e64c30d..6276c60ec1f1 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs @@ -69,7 +69,8 @@ public WorkloadInstallCommand( _workloadIds = workloadIds ?? parseResult.ValueForArgument>(WorkloadInstallCommandParser.WorkloadIdArgument).ToList().AsReadOnly(); _verbosity = parseResult.ValueForOption(WorkloadInstallCommandParser.VerbosityOption); _dotnetPath = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath); - _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.ValueForOption(WorkloadInstallCommandParser.VersionOption), version, _dotnetPath); + _userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; + _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.ValueForOption(WorkloadInstallCommandParser.VersionOption), version, _dotnetPath, _userProfileDir); _sdkFeatureBand = new SdkFeatureBand(string.Join('.', _sdkVersion.Major, _sdkVersion.Minor, _sdkVersion.SdkFeatureBand)); _tempDirPath = tempDirPath ?? (string.IsNullOrWhiteSpace(parseResult.ValueForOption(WorkloadInstallCommandParser.TempDirOption)) ? Path.GetTempPath() : @@ -80,8 +81,8 @@ public WorkloadInstallCommand( _packageSourceLocation = string.IsNullOrEmpty(configOption) && (sourceOption == null || !sourceOption.Any()) ? null : new PackageSourceLocation(string.IsNullOrEmpty(configOption) ? null : new FilePath(configOption), sourceFeedOverrides: sourceOption); - var sdkWorkloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(_dotnetPath, _sdkVersion.ToString()); - _workloadResolver = workloadResolver ?? WorkloadResolver.Create(sdkWorkloadManifestProvider, _dotnetPath, _sdkVersion.ToString()); + var sdkWorkloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(_dotnetPath, _sdkVersion.ToString(), userProfileDir); + _workloadResolver = workloadResolver ?? WorkloadResolver.Create(sdkWorkloadManifestProvider, _dotnetPath, _sdkVersion.ToString(), _userProfileDir); var sdkFeatureBand = new SdkFeatureBand(_sdkVersion); var tempPackagesDir = new DirectoryPath(Path.Combine(_tempDirPath, "dotnet-sdk-advertising-temp")); var restoreActionConfig = _parseResult.ToRestoreActionConfig(); @@ -90,10 +91,9 @@ public WorkloadInstallCommand( filePermissionSetter: null, new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir, _verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger()), _verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger(), restoreActionConfig: restoreActionConfig); - _userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; _workloadInstaller = workloadInstaller ?? WorkloadInstallerFactory.GetWorkloadInstaller(_reporter, sdkFeatureBand, - _workloadResolver, _verbosity, _nugetPackageDownloader, _dotnetPath, _tempDirPath, _userProfileDir, + _workloadResolver, _verbosity, _userProfileDir, _nugetPackageDownloader, _dotnetPath, _tempDirPath, _packageSourceLocation, restoreActionConfig, elevationRequired: !_printDownloadLinkOnly && string.IsNullOrWhiteSpace(_downloadToCacheOption)); _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter, _workloadResolver, _nugetPackageDownloader, _userProfileDir, _tempDirPath, _workloadInstaller.GetWorkloadInstallationRecordRepository(), _packageSourceLocation); diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallRecords/NetSdkManagedInstallationRecordInstaller.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallRecords/NetSdkManagedInstallationRecordInstaller.cs index 23571a5be296..518bf698affe 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallRecords/NetSdkManagedInstallationRecordInstaller.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallRecords/NetSdkManagedInstallationRecordInstaller.cs @@ -6,7 +6,6 @@ using System.IO; using System.Linq; using Microsoft.NET.Sdk.WorkloadManifestReader; -using Microsoft.DotNet.Configurer; namespace Microsoft.DotNet.Workloads.Workload.Install.InstallRecord { diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs index 7524c03d9710..e5fbe26e77d6 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs @@ -19,10 +19,10 @@ public static IInstaller GetWorkloadInstaller( SdkFeatureBand sdkFeatureBand, IWorkloadResolver workloadResolver, VerbosityOptions verbosity, + string userProfileDir, INuGetPackageDownloader nugetPackageDownloader = null, string dotnetDir = null, string tempDirPath = null, - string userProfileDir = null, PackageSourceLocation packageSourceLocation = null, RestoreActionConfig restoreActionConfig = null, bool elevationRequired = true) @@ -52,10 +52,10 @@ public static IInstaller GetWorkloadInstaller( return new NetSdkManagedInstaller(reporter, sdkFeatureBand, workloadResolver, + userProfileDir, nugetPackageDownloader, dotnetDir: dotnetDir, tempDirPath: tempDirPath, - userProfileDir: userProfileDir, verbosity: verbosity, packageSourceLocation: packageSourceLocation, restoreActionConfig: restoreActionConfig); diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs index adcc562de654..8b0bcb0f4a4e 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs @@ -53,21 +53,20 @@ public WorkloadManifestUpdater(IReporter reporter, _workloadRecordRepo = workloadRecordRepo; } - private static WorkloadManifestUpdater GetInstance() + private static WorkloadManifestUpdater GetInstance(string userProfileDir) { var reporter = new NullReporter(); var dotnetPath = Path.GetDirectoryName(Environment.ProcessPath); var sdkVersion = Product.Version; - var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(dotnetPath, sdkVersion); - var workloadResolver = WorkloadResolver.Create(workloadManifestProvider, dotnetPath, sdkVersion); + var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(dotnetPath, sdkVersion, userProfileDir); + var workloadResolver = WorkloadResolver.Create(workloadManifestProvider, dotnetPath, sdkVersion, userProfileDir); var tempPackagesDir = new DirectoryPath(Path.Combine(Path.GetTempPath(), "dotnet-sdk-advertising-temp")); var nugetPackageDownloader = new NuGetPackageDownloader(tempPackagesDir, filePermissionSetter: null, new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir, new NullLogger()), new NullLogger(), reporter); - var userProfileDir = CliFolderPathCalculator.DotnetUserProfileFolderPath; - var workloadRecordRepo = WorkloadInstallerFactory.GetWorkloadInstaller(reporter, new SdkFeatureBand(sdkVersion), workloadResolver, Cli.VerbosityOptions.normal) + var workloadRecordRepo = WorkloadInstallerFactory.GetWorkloadInstaller(reporter, new SdkFeatureBand(sdkVersion), workloadResolver, Cli.VerbosityOptions.normal, userProfileDir) .GetWorkloadInstallationRecordRepository(); return new WorkloadManifestUpdater(reporter, workloadResolver, nugetPackageDownloader, userProfileDir, tempPackagesDir.Value, workloadRecordRepo); @@ -81,11 +80,11 @@ await Task.WhenAll(manifests.Select(manifest => UpdateAdvertisingManifestAsync(m WriteUpdatableWorkloadsFile(); } - public async static Task BackgroundUpdateAdvertisingManifestsAsync() + public async static Task BackgroundUpdateAdvertisingManifestsAsync(string userProfileDir) { try { - var manifestUpdater = WorkloadManifestUpdater.GetInstance(); + var manifestUpdater = WorkloadManifestUpdater.GetInstance(userProfileDir); await manifestUpdater.BackgroundUpdateAdvertisingManifestsWhenRequiredAsync(); } catch (Exception) diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadOptionsExtensions.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadOptionsExtensions.cs index 4596e388d910..1584f8c7634d 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadOptionsExtensions.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadOptionsExtensions.cs @@ -17,7 +17,7 @@ namespace Microsoft.DotNet.Workloads.Workload.Install { internal class WorkloadOptionsExtensions { - internal static ReleaseVersion GetValidatedSdkVersion(string versionOption, string providedVersion, string dotnetPath) + internal static ReleaseVersion GetValidatedSdkVersion(string versionOption, string providedVersion, string dotnetPath, string userProfileDir) { if (string.IsNullOrEmpty(versionOption)) @@ -26,7 +26,7 @@ internal static ReleaseVersion GetValidatedSdkVersion(string versionOption, stri } else { - var manifests = new SdkDirectoryWorkloadManifestProvider(dotnetPath, versionOption).GetManifests(); + var manifests = new SdkDirectoryWorkloadManifestProvider(dotnetPath, versionOption, userProfileDir).GetManifests(); if (!manifests.Any()) { throw new GracefulException(string.Format(LocalizableStrings.NoManifestsExistForFeatureBand, versionOption), isUserError: false); diff --git a/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs index 47c9c4a097e8..109a49d1a7c7 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs @@ -64,12 +64,13 @@ public WorkloadListCommand( ? Path.GetTempPath() : result.ValueForOption(WorkloadListCommandParser.TempDirOption)); _targetSdkVersion = result.ValueForOption(WorkloadListCommandParser.VersionOption); + _userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(_dotnetPath, string.IsNullOrWhiteSpace(_targetSdkVersion) ? currentSdkReleaseVersion.ToString() - : _targetSdkVersion); - _userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; + : _targetSdkVersion, + _userProfileDir); DirectoryPath tempPackagesDir = new(Path.Combine(_userProfileDir, "sdk-advertising-temp")); NullLogger nullLogger = new NullLogger(); @@ -78,10 +79,10 @@ public WorkloadListCommand( new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir, nullLogger), verboseLogger: nullLogger, restoreActionConfig: _parseResult.ToRestoreActionConfig()); - workloadResolver ??= WorkloadResolver.Create(workloadManifestProvider, _dotnetPath, currentSdkReleaseVersion.ToString()); + workloadResolver ??= WorkloadResolver.Create(workloadManifestProvider, _dotnetPath, currentSdkReleaseVersion.ToString(), _userProfileDir); _workloadRecordRepo = workloadRecordRepo ?? - WorkloadInstallerFactory.GetWorkloadInstaller(reporter, _currentSdkFeatureBand, workloadResolver, _verbosity, userProfileDir: _userProfileDir, + WorkloadInstallerFactory.GetWorkloadInstaller(reporter, _currentSdkFeatureBand, workloadResolver, _verbosity, _userProfileDir, elevationRequired: false).GetWorkloadInstallationRecordRepository(); _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter, diff --git a/src/Cli/dotnet/commands/dotnet-workload/repair/WorkloadRepairCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/repair/WorkloadRepairCommand.cs index dcd9f2a5edf9..b3a6b2323f10 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/repair/WorkloadRepairCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/repair/WorkloadRepairCommand.cs @@ -44,15 +44,16 @@ public WorkloadRepairCommand( _reporter = reporter ?? Reporter.Output; _verbosity = parseResult.ValueForOption(WorkloadRepairCommandParser.VerbosityOption); _dotnetPath = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath); - _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.ValueForOption(WorkloadRepairCommandParser.VersionOption), version, _dotnetPath); + userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; + _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.ValueForOption(WorkloadRepairCommandParser.VersionOption), version, _dotnetPath, userProfileDir); var configOption = parseResult.ValueForOption(WorkloadRepairCommandParser.ConfigOption); var sourceOption = parseResult.ValueForOption(WorkloadRepairCommandParser.SourceOption); _packageSourceLocation = string.IsNullOrEmpty(configOption) && (sourceOption == null || !sourceOption.Any()) ? null : new PackageSourceLocation(string.IsNullOrEmpty(configOption) ? null : new FilePath(configOption), sourceFeedOverrides: sourceOption); - var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(_dotnetPath, _sdkVersion.ToString()); - _workloadResolver = workloadResolver ?? WorkloadResolver.Create(workloadManifestProvider, _dotnetPath, _sdkVersion.ToString()); + var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(_dotnetPath, _sdkVersion.ToString(), userProfileDir); + _workloadResolver = workloadResolver ?? WorkloadResolver.Create(workloadManifestProvider, _dotnetPath, _sdkVersion.ToString(), userProfileDir); var sdkFeatureBand = new SdkFeatureBand(_sdkVersion); tempDirPath = tempDirPath ?? (string.IsNullOrWhiteSpace(parseResult.ValueForOption(WorkloadInstallCommandParser.TempDirOption)) ? Path.GetTempPath() : @@ -63,10 +64,9 @@ public WorkloadRepairCommand( tempPackagesDir, filePermissionSetter: null, new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir, nullLogger), nullLogger, restoreActionConfig: _parseResult.ToRestoreActionConfig()); - userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; _workloadInstaller = workloadInstaller ?? WorkloadInstallerFactory.GetWorkloadInstaller(_reporter, sdkFeatureBand, - _workloadResolver, _verbosity, nugetPackageDownloader, dotnetDir, tempDirPath, userProfileDir, + _workloadResolver, _verbosity, userProfileDir, nugetPackageDownloader, dotnetDir, tempDirPath, _packageSourceLocation, _parseResult.ToRestoreActionConfig()); } diff --git a/src/Cli/dotnet/commands/dotnet-workload/search/WorkloadSearchCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/search/WorkloadSearchCommand.cs index 85943fdc1ea2..ffe2a1a5fe0c 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/search/WorkloadSearchCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/search/WorkloadSearchCommand.cs @@ -7,6 +7,7 @@ using Microsoft.Deployment.DotNet.Releases; using Microsoft.DotNet.Cli; using Microsoft.DotNet.Cli.Utils; +using Microsoft.DotNet.Configurer; using Microsoft.NET.Sdk.WorkloadManifestReader; using System.Linq; using Microsoft.DotNet.Workloads.Workload.Install; @@ -26,15 +27,17 @@ public WorkloadSearchCommand( ParseResult result, IReporter reporter = null, IWorkloadResolver workloadResolver = null, + string userProfileDir = null, string version = null) : base(result) { _reporter = reporter ?? Reporter.Output; _verbosity = result.ValueForOption(WorkloadSearchCommandParser.VerbosityOption); _workloadIdStub = result.ValueForArgument(WorkloadSearchCommandParser.WorkloadIdStubArgument); var dotnetPath = Path.GetDirectoryName(Environment.ProcessPath); - _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(result.ValueForOption(WorkloadSearchCommandParser.VersionOption), version, dotnetPath); - var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(dotnetPath, _sdkVersion.ToString()); - _workloadResolver = workloadResolver ?? WorkloadResolver.Create(workloadManifestProvider, dotnetPath, _sdkVersion.ToString()); + userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; + _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(result.ValueForOption(WorkloadSearchCommandParser.VersionOption), version, dotnetPath, userProfileDir); + var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(dotnetPath, _sdkVersion.ToString(), userProfileDir); + _workloadResolver = workloadResolver ?? WorkloadResolver.Create(workloadManifestProvider, dotnetPath, _sdkVersion.ToString(), userProfileDir); } public override int Execute() diff --git a/src/Cli/dotnet/commands/dotnet-workload/uninstall/WorkloadUninstallCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/uninstall/WorkloadUninstallCommand.cs index b5caf9f4e51e..ea42950ba53d 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/uninstall/WorkloadUninstallCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/uninstall/WorkloadUninstallCommand.cs @@ -10,6 +10,7 @@ using Microsoft.DotNet.Cli; using Microsoft.DotNet.Cli.NuGetPackageDownloader; using Microsoft.DotNet.Cli.Utils; +using Microsoft.DotNet.Configurer; using Microsoft.DotNet.Workloads.Workload.Install; using Microsoft.DotNet.Workloads.Workload.Install.InstallRecord; using Microsoft.Extensions.EnvironmentAbstractions; @@ -32,6 +33,7 @@ public WorkloadUninstallCommand( IWorkloadResolver workloadResolver = null, INuGetPackageDownloader nugetPackageDownloader = null, string dotnetDir = null, + string userProfileDir = null, string version = null) : base(parseResult) { @@ -39,13 +41,14 @@ public WorkloadUninstallCommand( _workloadIds = parseResult.ValueForArgument>(WorkloadUninstallCommandParser.WorkloadIdArgument) .Select(workloadId => new WorkloadId(workloadId)).ToList().AsReadOnly(); var dotnetPath = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath); - _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.ValueForOption(WorkloadUninstallCommandParser.VersionOption), version, dotnetPath); + userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; + _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.ValueForOption(WorkloadUninstallCommandParser.VersionOption), version, dotnetPath, userProfileDir); var verbosity = parseResult.ValueForOption(WorkloadUninstallCommandParser.VerbosityOption); - var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(dotnetPath, _sdkVersion.ToString()); - workloadResolver ??= WorkloadResolver.Create(workloadManifestProvider, dotnetPath, _sdkVersion.ToString()); + var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(dotnetPath, _sdkVersion.ToString(), userProfileDir); + workloadResolver ??= WorkloadResolver.Create(workloadManifestProvider, dotnetPath, _sdkVersion.ToString(), userProfileDir); nugetPackageDownloader ??= new NuGetPackageDownloader(new DirectoryPath(Path.GetTempPath()), filePermissionSetter: null, verboseLogger: new NullLogger()); var sdkFeatureBand = new SdkFeatureBand(_sdkVersion); - _workloadInstaller = WorkloadInstallerFactory.GetWorkloadInstaller(_reporter, sdkFeatureBand, workloadResolver, verbosity, nugetPackageDownloader, dotnetPath); + _workloadInstaller = WorkloadInstallerFactory.GetWorkloadInstaller(_reporter, sdkFeatureBand, workloadResolver, verbosity, userProfileDir, nugetPackageDownloader, dotnetPath); } public override int Execute() diff --git a/src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs index 43b57367714c..07a69a993db1 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs @@ -69,7 +69,8 @@ public WorkloadUpdateCommand( _downloadToCacheOption = parseResult.ValueForOption(WorkloadUpdateCommandParser.DownloadToCacheOption); _verbosity = parseResult.ValueForOption(WorkloadUpdateCommandParser.VerbosityOption); _dotnetPath = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath); - _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.ValueForOption(WorkloadUpdateCommandParser.VersionOption), version, _dotnetPath); + _userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; + _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.ValueForOption(WorkloadUpdateCommandParser.VersionOption), version, _dotnetPath, _userProfileDir); _tempDirPath = tempDirPath ?? (string.IsNullOrWhiteSpace(parseResult.ValueForOption(WorkloadUpdateCommandParser.TempDirOption)) ? Path.GetTempPath() : parseResult.ValueForOption(WorkloadUpdateCommandParser.TempDirOption)); @@ -81,14 +82,13 @@ public WorkloadUpdateCommand( _packageSourceLocation = string.IsNullOrEmpty(configOption) && (sourceOption == null || !sourceOption.Any()) ? null : new PackageSourceLocation(string.IsNullOrEmpty(configOption) ? null : new FilePath(configOption), sourceFeedOverrides: sourceOption); - var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(_dotnetPath, _sdkVersion.ToString()); - _workloadResolver = workloadResolver ?? WorkloadResolver.Create(workloadManifestProvider, _dotnetPath, _sdkVersion.ToString()); + var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(_dotnetPath, _sdkVersion.ToString(), _userProfileDir); + _workloadResolver = workloadResolver ?? WorkloadResolver.Create(workloadManifestProvider, _dotnetPath, _sdkVersion.ToString(), _userProfileDir); var sdkFeatureBand = new SdkFeatureBand(_sdkVersion); var restoreActionConfig = _parseResult.ToRestoreActionConfig(); - _userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; _workloadInstaller = workloadInstaller ?? WorkloadInstallerFactory.GetWorkloadInstaller(_reporter, - sdkFeatureBand, _workloadResolver, _verbosity, nugetPackageDownloader, - dotnetDir, _tempDirPath, _userProfileDir, packageSourceLocation: _packageSourceLocation, restoreActionConfig, + sdkFeatureBand, _workloadResolver, _verbosity, _userProfileDir, nugetPackageDownloader, + dotnetDir, _tempDirPath, packageSourceLocation: _packageSourceLocation, restoreActionConfig, elevationRequired: !_printDownloadLinkOnly && string.IsNullOrWhiteSpace(_downloadToCacheOption)); var tempPackagesDir = new DirectoryPath(Path.Combine(_tempDirPath, "dotnet-sdk-advertising-temp")); _nugetPackageDownloader = nugetPackageDownloader ?? new NuGetPackageDownloader(tempPackagesDir, @@ -241,7 +241,7 @@ private async Task DownloadToOfflineCacheAsync(DirectoryPath offlineCache, bool { await _workloadManifestUpdater.ExtractManifestPackagesToTempDirAsync(manifestPackagePaths, new DirectoryPath(tempManifestDir)); var overlayManifestProvider = new TempDirectoryWorkloadManifestProvider(tempManifestDir, _sdkVersion.ToString()); - _workloadResolver = WorkloadResolver.Create(overlayManifestProvider, _dotnetPath, _sdkVersion.ToString()); + _workloadResolver = WorkloadResolver.Create(overlayManifestProvider, _dotnetPath, _sdkVersion.ToString(), _userProfileDir); if (_workloadInstaller.GetInstallationUnit().Equals(InstallationUnit.Packs)) { @@ -306,7 +306,7 @@ private async Task UseTempManifestsToResolvePacksAsync(DirectoryPath tempPath, b var manifestPackagePaths = await _workloadManifestUpdater.DownloadManifestPackagesAsync(includePreview, tempPath); await _workloadManifestUpdater.ExtractManifestPackagesToTempDirAsync(manifestPackagePaths, tempPath); var overlayManifestProvider = new TempDirectoryWorkloadManifestProvider(tempPath.Value, _sdkVersion.ToString()); - _workloadResolver = WorkloadResolver.Create(overlayManifestProvider, _dotnetPath, _sdkVersion.ToString()); + _workloadResolver = WorkloadResolver.Create(overlayManifestProvider, _dotnetPath, _sdkVersion.ToString(), _userProfileDir); } private IEnumerable GetUpdatableWorkloads() diff --git a/src/Cli/dotnet/dotnet.csproj b/src/Cli/dotnet/dotnet.csproj index c5629c4d8f7f..4859fa4afb01 100644 --- a/src/Cli/dotnet/dotnet.csproj +++ b/src/Cli/dotnet/dotnet.csproj @@ -12,18 +12,12 @@ Microsoft.DotNet.Cli false true - - - $(NoWarn);0436 - - - diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.cs.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.cs.xlf index 6a6272e7ae2d..2c4fff34cddd 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.cs.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.cs.xlf @@ -95,11 +95,6 @@ export PATH="$PATH:{0}" - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Nešlo určit domovský adresář uživatele. Nastavte proměnnou prostředí {0}, která určí adresář, který se má použít. - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.de.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.de.xlf index ac475fc5160d..93ccace590bd 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.de.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.de.xlf @@ -95,11 +95,6 @@ export PATH="$PATH:{0}" - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Das Startverzeichnis des Benutzers konnte nicht ermittelt werden. Legen Sie die Umgebungsvariable "{0}" fest, um das zu verwendende Verzeichnis anzugeben. - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf index 5c382d16d872..8b5f301768fe 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.es.xlf @@ -95,11 +95,6 @@ export PATH="$PATH:{0}" - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - No se puede determinar el directorio raíz del usuario. Establezca la variable de entorno “{0}” para especificar el directorio que debe usarse. - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.fr.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.fr.xlf index 07229ee5a7dd..f876daa63ce2 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.fr.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.fr.xlf @@ -95,11 +95,6 @@ export PATH="$PATH:{0}" - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Impossible de déterminer le répertoire de base de l'utilisateur. Définissez la variable d'environnement '{0}' pour spécifier le répertoire à utiliser. - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.it.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.it.xlf index edf79bad163c..53069a26c9a5 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.it.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.it.xlf @@ -95,11 +95,6 @@ export PATH="$PATH:{0}" - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Non è stato possibile determinare la home directory dell'utente. Impostare la variabile di ambiente '{0}' per specificare la directory da usare. - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.ja.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.ja.xlf index f5eb9cdb9d60..69404148ec9c 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.ja.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.ja.xlf @@ -95,11 +95,6 @@ export PATH="$PATH:{0}" - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - ユーザーのホーム ディレクトリを特定できませんでした。使用するディレクトリを指定するには、'{0}' 環境変数を設定してください。 - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.ko.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.ko.xlf index b21cd6fee591..28cdbd174eab 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.ko.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.ko.xlf @@ -95,11 +95,6 @@ export PATH="$PATH:{0}" - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - 사용자의 홈 디렉터리를 확인할 수 없습니다. '{0}' 환경 변수를 설정하여 사용할 디렉터리를 지정하세요. - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.pl.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.pl.xlf index df2abc834daa..c94f55e9b1a7 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.pl.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.pl.xlf @@ -95,11 +95,6 @@ export PATH="$PATH:{0}" - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Nie można określić katalogu macierzystego użytkownika. Ustaw zmienną środowiskową „{0}”, aby określić katalog do użycia. - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf index 214b62deac3b..49df27c5ebc7 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.pt-BR.xlf @@ -95,11 +95,6 @@ export PATH="$PATH:{0}" - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - O diretório inicial do usuário não pôde ser definido. Configure a variável de ambiente '{0}' para especificar o diretório a ser utilizado. - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.ru.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.ru.xlf index c235f2f7ef7a..2ab9b2976c90 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.ru.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.ru.xlf @@ -95,11 +95,6 @@ export PATH="$PATH:{0}" - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Не удалось определить домашний каталог пользователя. Чтобы указать нужный каталог, задайте переменную среды "{0}". - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.tr.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.tr.xlf index 47cea022edc0..2a6a2fe78891 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.tr.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.tr.xlf @@ -95,11 +95,6 @@ export PATH="$PATH:{0}" - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - Kullanıcının giriş dizini belirlenemedi. Kullanılacak dizini belirtmek için '{0}' ortam değişkenini ayarlayın. - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf index b6e4b5649cc8..45d1f202932a 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hans.xlf @@ -95,11 +95,6 @@ EOF - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - 无法确定用户的主目录。设置“{0}”环境变量以指定要使用的目录。 - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hant.xlf b/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hant.xlf index 5a50ea5140c6..e02e7bf2fc8c 100644 --- a/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hant.xlf +++ b/src/Cli/dotnet/xlf/CommonLocalizableStrings.zh-Hant.xlf @@ -95,11 +95,6 @@ export PATH="$PATH:{0}" - - The user's home directory could not be determined. Set the '{0}' environment variable to specify the directory to use. - 無法判定該使用者的主目錄。請設定 '{0}' 環境變數,指定要使用的目錄。 - - Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. Publish your application as a framework dependent application. A compatible .NET runtime must be installed on the target machine to run your application. diff --git a/src/Common/CliFolderPathCalculatorCore.cs b/src/Common/CliFolderPathCalculatorCore.cs new file mode 100644 index 000000000000..02c7c0d9451b --- /dev/null +++ b/src/Common/CliFolderPathCalculatorCore.cs @@ -0,0 +1,46 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.IO; +using System.Runtime.InteropServices; + +#nullable enable + +namespace Microsoft.DotNet.Configurer +{ + static class CliFolderPathCalculatorCore + { + public const string DotnetHomeVariableName = "DOTNET_CLI_HOME"; + public const string DotnetProfileDirectoryName = ".dotnet"; + + public static string PlatformHomeVariableName => + RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "USERPROFILE" : "HOME"; + + public static string? GetDotnetUserProfileFolderPath() + { + string? homePath = GetDotnetHomePath(); + if (homePath is null) + { + return null; + } + + return Path.Combine(homePath, DotnetProfileDirectoryName); + } + + public static string? GetDotnetHomePath() + { + var home = Environment.GetEnvironmentVariable(DotnetHomeVariableName); + if (string.IsNullOrEmpty(home)) + { + home = Environment.GetEnvironmentVariable(PlatformHomeVariableName); + if (string.IsNullOrEmpty(home)) + { + return null; + } + } + + return home; + } + } +} diff --git a/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj b/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj index 97d059b585af..815b1f6aa32c 100644 --- a/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj +++ b/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj @@ -50,15 +50,11 @@ - - - - diff --git a/src/Microsoft.DotNet.TemplateLocator/TemplateLocator.cs b/src/Microsoft.DotNet.TemplateLocator/TemplateLocator.cs index 03cf6d7cf1da..4151a5afe418 100644 --- a/src/Microsoft.DotNet.TemplateLocator/TemplateLocator.cs +++ b/src/Microsoft.DotNet.TemplateLocator/TemplateLocator.cs @@ -40,7 +40,8 @@ public TemplateLocator(Func getEnvironmentVariable, VSSettings v public IReadOnlyCollection GetDotnetSdkTemplatePackages( string sdkVersion, - string dotnetRootPath) + string dotnetRootPath, + string userProfileDir) { if (string.IsNullOrWhiteSpace(sdkVersion)) { @@ -53,8 +54,8 @@ public IReadOnlyCollection GetDotnetSdkTemplate nameof(dotnetRootPath)); } - _workloadManifestProvider ??= new SdkDirectoryWorkloadManifestProvider(dotnetRootPath, sdkVersion); - _workloadResolver ??= WorkloadResolver.Create(_workloadManifestProvider, dotnetRootPath, sdkVersion); + _workloadManifestProvider ??= new SdkDirectoryWorkloadManifestProvider(dotnetRootPath, sdkVersion, userProfileDir); + _workloadResolver ??= WorkloadResolver.Create(_workloadManifestProvider, dotnetRootPath, sdkVersion, userProfileDir); return _workloadResolver.GetInstalledWorkloadPacksOfKind(WorkloadPackKind.Template) .Select(pack => new OptionalSdkTemplatePackageInfo(pack.Id, pack.Version, pack.Path)).ToList(); diff --git a/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/MSBuildSdkResolver.cs b/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/MSBuildSdkResolver.cs index 94a44a558a47..08889e6c2890 100644 --- a/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/MSBuildSdkResolver.cs +++ b/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/MSBuildSdkResolver.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. using Microsoft.Build.Framework; +using Microsoft.DotNet.Configurer; using Microsoft.DotNet.DotNetSdkResolver; using Microsoft.DotNet.NativeWrapper; using System; @@ -170,7 +171,8 @@ public override SdkResult Resolve(SdkReference sdkReference, SdkResolverContext }; // First check if requested SDK resolves to a workload SDK pack - var workloadResult = workloadResolver.Resolve(sdkReference.Name, dotnetRoot, netcoreSdkVersion); + string userProfileDir = CliFolderPathCalculatorCore.GetDotnetUserProfileFolderPath(); + var workloadResult = workloadResolver.Resolve(sdkReference.Name, dotnetRoot, netcoreSdkVersion, userProfileDir); if (workloadResult is not CachingWorkloadResolver.NullResolutionResult) { diff --git a/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj b/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj index 463d1f2d9bee..66b83c7c4a25 100644 --- a/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj +++ b/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj @@ -19,9 +19,6 @@ $(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage - - - $(NoWarn);0436 @@ -54,7 +51,6 @@ - @@ -74,9 +70,7 @@ LinkBase="WorkloadInstallRecords" /> - - - + diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/CachingWorkloadResolver.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/CachingWorkloadResolver.cs index 136251301819..75ce81b42cd6 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/CachingWorkloadResolver.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/CachingWorkloadResolver.cs @@ -173,7 +173,7 @@ private static ResolutionResult Resolve(string sdkReferenceName, IWorkloadManife return new NullResolutionResult(); } - public ResolutionResult Resolve(string sdkReferenceName, string dotnetRootPath, string sdkVersion) + public ResolutionResult Resolve(string sdkReferenceName, string dotnetRootPath, string sdkVersion, string userProfileDir) { if (!_enabled) { @@ -188,8 +188,8 @@ public ResolutionResult Resolve(string sdkReferenceName, string dotnetRootPath, _cachedState.DotnetRootPath != dotnetRootPath || _cachedState.SdkVersion != sdkVersion) { - var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(dotnetRootPath, sdkVersion); - var workloadResolver = WorkloadResolver.Create(workloadManifestProvider, dotnetRootPath, sdkVersion); + var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(dotnetRootPath, sdkVersion, userProfileDir); + var workloadResolver = WorkloadResolver.Create(workloadManifestProvider, dotnetRootPath, sdkVersion, userProfileDir); _cachedState = new CachedState() { diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj b/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj index 0a40a13fb2e5..00308587df35 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj @@ -3,9 +3,6 @@ $(SdkTargetFramework) true - - - $(NoWarn);0436 @@ -14,7 +11,6 @@ - @@ -27,9 +23,7 @@ - - - + diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/WorkloadSdkResolver.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/WorkloadSdkResolver.cs index 4b87c627252c..51d241f156d6 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/WorkloadSdkResolver.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/WorkloadSdkResolver.cs @@ -1,13 +1,13 @@ // Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. - using Microsoft.Build.Framework; using System; using System.Collections.Generic; using System.IO; using System.Linq; using Microsoft.NET.Sdk.WorkloadManifestReader; +using Microsoft.DotNet.Configurer; using Microsoft.DotNet.NativeWrapper; using System.Collections.Immutable; @@ -66,7 +66,8 @@ public override SdkResult Resolve(SdkReference sdkReference, SdkResolverContext resolverContext.State = cachedState; } - var result = cachedState.WorkloadResolver.Resolve(sdkReference.Name, cachedState.DotnetRootPath, cachedState.SdkVersion); + string userProfileDir = CliFolderPathCalculatorCore.GetDotnetUserProfileFolderPath(); + var result = cachedState.WorkloadResolver.Resolve(sdkReference.Name, cachedState.DotnetRootPath, cachedState.SdkVersion, userProfileDir); return result.ToSdkResult(sdkReference, factory); diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj index 0ef41b919d84..654f06a1ce33 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj @@ -17,12 +17,8 @@ - - - - diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs index e33c66876a61..7310b1c9aab2 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs @@ -6,7 +6,6 @@ using System.IO; using System.Linq; using Microsoft.DotNet.Cli; -using Microsoft.DotNet.Configurer; using Microsoft.NET.Sdk.Localization; namespace Microsoft.NET.Sdk.WorkloadManifestReader @@ -20,13 +19,13 @@ public class SdkDirectoryWorkloadManifestProvider : IWorkloadManifestProvider "microsoft.net.workload.maccatalyst", "microsoft.net.workload.macos", "microsoft.net.workload.tvos" }; private readonly HashSet? _knownManifestIds; - public SdkDirectoryWorkloadManifestProvider(string sdkRootPath, string sdkVersion) - : this(sdkRootPath, sdkVersion, Environment.GetEnvironmentVariable) + public SdkDirectoryWorkloadManifestProvider(string sdkRootPath, string sdkVersion, string? userProfileDir) + : this(sdkRootPath, sdkVersion, Environment.GetEnvironmentVariable, userProfileDir) { } - internal SdkDirectoryWorkloadManifestProvider(string sdkRootPath, string sdkVersion, Func getEnvironmentVariable, string userProfileDir = null!) + internal SdkDirectoryWorkloadManifestProvider(string sdkRootPath, string sdkVersion, Func getEnvironmentVariable, string? userProfileDir) { if (string.IsNullOrWhiteSpace(sdkVersion)) { @@ -61,10 +60,9 @@ static int Last2DigitsTo0(int versionBuild) _knownManifestIds = File.ReadAllLines(knownManifestIdsFilePath).Where(l => !string.IsNullOrEmpty(l)).ToHashSet(); } - userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; - string userManifestsDir = Path.Combine(userProfileDir, "sdk-manifests", _sdkVersionBand); + string? userManifestsDir = userProfileDir is null ? null : Path.Combine(userProfileDir, "sdk-manifests", _sdkVersionBand); string dotnetManifestDir = Path.Combine(_sdkRootPath, "sdk-manifests", _sdkVersionBand); - if (WorkloadInstall.IsUserLocal(_sdkRootPath, sdkVersion) && Directory.Exists(userManifestsDir)) + if (userManifestsDir != null && WorkloadInstall.IsUserLocal(_sdkRootPath, sdkVersion) && Directory.Exists(userManifestsDir)) { _manifestDirectories = new[] { userManifestsDir, dotnetManifestDir }; } diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs index 666caaefe281..4db0024b128c 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs @@ -6,7 +6,6 @@ using System.IO; using System.Linq; using Microsoft.DotNet.Cli; -using Microsoft.DotNet.Configurer; using Microsoft.NET.Sdk.Localization; using FXVersion = Microsoft.DotNet.MSBuildSdkResolver.FXVersion; @@ -28,16 +27,15 @@ public class WorkloadResolver : IWorkloadResolver private Func? _fileExistOverride; private Func? _directoryExistOverride; - public static WorkloadResolver Create(IWorkloadManifestProvider manifestProvider, string dotnetRootPath, string sdkVersion, string userProfileDir = null!) + public static WorkloadResolver Create(IWorkloadManifestProvider manifestProvider, string dotnetRootPath, string sdkVersion, string? userProfileDir) { string runtimeIdentifierChainPath = Path.Combine(dotnetRootPath, "sdk", sdkVersion, "NETCoreSdkRuntimeIdentifierChain.txt"); string[] currentRuntimeIdentifiers = File.Exists(runtimeIdentifierChainPath) ? File.ReadAllLines(runtimeIdentifierChainPath).Where(l => !string.IsNullOrEmpty(l)).ToArray() : new string[] { }; - userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath; string[] workloadRootPaths; - if (WorkloadInstall.IsUserLocal(dotnetRootPath, sdkVersion) && Directory.Exists(userProfileDir)) + if (userProfileDir != null && WorkloadInstall.IsUserLocal(dotnetRootPath, sdkVersion) && Directory.Exists(userProfileDir)) { workloadRootPaths = new[] { userProfileDir, dotnetRootPath }; } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj b/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj index dbd4ab91abdf..2544f576330e 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj +++ b/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj @@ -80,16 +80,13 @@ - - - + - diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs index e9983091c602..74a6ce261ac3 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs @@ -646,10 +646,10 @@ IEnumerable GetPackFolders() if (!string.IsNullOrEmpty(NetCoreRoot) && !string.IsNullOrEmpty(NETCoreSdkVersion)) { - if (WorkloadInstall.IsUserLocal(NetCoreRoot, NETCoreSdkVersion)) + if (WorkloadInstall.IsUserLocal(NetCoreRoot, NETCoreSdkVersion) && + CliFolderPathCalculatorCore.GetDotnetUserProfileFolderPath() is { } userProfileDir) { - // TODO: should DotnetUserProfileFolderPath come from a property? - yield return Path.Combine(CliFolderPathCalculator.DotnetUserProfileFolderPath, "packs"); + yield return Path.Combine(userProfileDir, "packs"); } } @@ -683,8 +683,9 @@ private string GetResolvedPackVersion(string packID, string packVersion) if (_workloadManifestProvider == null) { - _workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(NetCoreRoot, NETCoreSdkVersion); - _workloadResolver = WorkloadResolver.Create(_workloadManifestProvider, NetCoreRoot, NETCoreSdkVersion); + string userProfileDir = CliFolderPathCalculatorCore.GetDotnetUserProfileFolderPath(); + _workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(NetCoreRoot, NETCoreSdkVersion, userProfileDir); + _workloadResolver = WorkloadResolver.Create(_workloadManifestProvider, NetCoreRoot, NETCoreSdkVersion, userProfileDir); } var packInfo = _workloadResolver.TryGetPackInfo(new WorkloadPackId(packID)); diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ShowMissingWorkloads.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ShowMissingWorkloads.cs index 950046e1307d..fcc6a4ec9202 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ShowMissingWorkloads.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ShowMissingWorkloads.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; +using Microsoft.DotNet.Configurer; using Microsoft.NET.Sdk.WorkloadManifestReader; using static Microsoft.NET.Sdk.WorkloadManifestReader.WorkloadResolver; @@ -37,8 +38,9 @@ protected override void ExecuteCore() { if (MissingWorkloadPacks.Any()) { - var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(NetCoreRoot, NETCoreSdkVersion); - var workloadResolver = WorkloadResolver.Create(workloadManifestProvider, NetCoreRoot, NETCoreSdkVersion); + string? userProfileDir = CliFolderPathCalculatorCore.GetDotnetUserProfileFolderPath(); + var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(NetCoreRoot, NETCoreSdkVersion, userProfileDir); + var workloadResolver = WorkloadResolver.Create(workloadManifestProvider, NetCoreRoot, NETCoreSdkVersion, userProfileDir); var suggestedWorkloads = workloadResolver.GetWorkloadSuggestionForMissingPacks( MissingWorkloadPacks.Select(item => new WorkloadPackId (item.ItemSpec)).ToList(), diff --git a/src/Tests/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs b/src/Tests/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs index 23cf8faa4b42..c78c9bca72d6 100644 --- a/src/Tests/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs +++ b/src/Tests/Microsoft.DotNet.Configurer.UnitTests/GivenAPathCalculator.cs @@ -2,7 +2,6 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; -using System.IO; using System.Collections.Generic; using Microsoft.DotNet.Cli.Utils; using Microsoft.DotNet.Tools.Test.Utilities; @@ -18,7 +17,7 @@ public void It_does_not_return_same_path_for_tools_package_and_tool_shim() { // shim name will conflict with the folder that is PackageId, if commandName and packageId are the same. CliFolderPathCalculator.ToolsPackagePath.Should().NotBe(CliFolderPathCalculator.ToolsShimPath); - CliFolderPathCalculator.ToolsPackagePath.Should().NotBe($"{CliFolderPathCalculator.DotnetHomePath}/{Path.Combine(CliFolderPathCalculator.DotnetProfileDirectoryName, CliFolderPathCalculator.ToolsShimFolderName)}"); + CliFolderPathCalculator.ToolsPackagePath.Should().NotBe(CliFolderPathCalculator.ToolsShimPathInUnix.Path); } } } diff --git a/src/Tests/Microsoft.DotNet.TemplateLocator.Tests/GivenAnTemplateLocator.cs b/src/Tests/Microsoft.DotNet.TemplateLocator.Tests/GivenAnTemplateLocator.cs index 260fa23c4173..e4b6ada9de64 100644 --- a/src/Tests/Microsoft.DotNet.TemplateLocator.Tests/GivenAnTemplateLocator.cs +++ b/src/Tests/Microsoft.DotNet.TemplateLocator.Tests/GivenAnTemplateLocator.cs @@ -47,7 +47,7 @@ public void ItShouldReturnListOfTemplates() string templateNupkgPath = Path.Combine(templatePacksDirectory, "xamarin.android.templates.1.0.3.nupkg"); File.WriteAllText(templateNupkgPath, ""); - var result = _resolver.GetDotnetSdkTemplatePackages("5.0.102", _fakeDotnetRootDirectory); + var result = _resolver.GetDotnetSdkTemplatePackages("5.0.102", _fakeDotnetRootDirectory, userProfileDir: ""); result.First().Path.Should().Be(templateNupkgPath); result.First().TemplatePackageId.Should().Be("Xamarin.Android.Templates"); @@ -63,7 +63,7 @@ public void GivenNoSdkToBondItShouldReturnEmpty() File.Copy(Path.Combine("Manifests", "AndroidWorkloadManifest.json"), Path.Combine(_manifestDirectory, "Android", "WorkloadManifest.json")); - var result = _resolver.GetDotnetSdkTemplatePackages("5.1.100", _fakeDotnetRootDirectory); + var result = _resolver.GetDotnetSdkTemplatePackages("5.1.100", _fakeDotnetRootDirectory, userProfileDir: ""); result.Should().BeEmpty(); } @@ -72,7 +72,7 @@ public void GivenNoManifestDirectoryItShouldReturnEmpty() { var fakeDotnetRootDirectory = Path.Combine(TestContext.Current.TestExecutionDirectory, Path.GetRandomFileName()); - var result = _resolver.GetDotnetSdkTemplatePackages("5.0.102", fakeDotnetRootDirectory); + var result = _resolver.GetDotnetSdkTemplatePackages("5.0.102", fakeDotnetRootDirectory, userProfileDir: ""); result.Should().BeEmpty(); } } diff --git a/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/SdkDirectoryWorkloadManifestProviderTests.cs b/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/SdkDirectoryWorkloadManifestProviderTests.cs index 31eda221580e..2c13309d153f 100644 --- a/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/SdkDirectoryWorkloadManifestProviderTests.cs +++ b/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/SdkDirectoryWorkloadManifestProviderTests.cs @@ -51,7 +51,7 @@ public void ItShouldReturnListOfManifestFiles() File.WriteAllText(Path.Combine(_manifestDirectory, "iOS", "WorkloadManifest.json"), iosManifestFileContent); var sdkDirectoryWorkloadManifestProvider - = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.100"); + = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.100", userProfileDir: null); GetManifestContents(sdkDirectoryWorkloadManifestProvider) .Should() @@ -68,7 +68,7 @@ public void GivenSDKVersionItShouldReturnListOfManifestFilesForThisVersionBand() File.WriteAllText(Path.Combine(_manifestDirectory, "Android", "WorkloadManifest.json"), androidManifestFileContent); var sdkDirectoryWorkloadManifestProvider - = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.105"); + = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.100", userProfileDir: null); GetManifestContents(sdkDirectoryWorkloadManifestProvider) .Should() @@ -81,7 +81,7 @@ public void GivenNoManifestDirectoryItShouldReturnEmpty() Initialize(); var sdkDirectoryWorkloadManifestProvider - = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.105"); + = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.100", userProfileDir: null); sdkDirectoryWorkloadManifestProvider.GetManifests().Should().BeEmpty(); } @@ -93,7 +93,7 @@ public void GivenNoManifestJsonFileInDirectoryItShouldThrow() Directory.CreateDirectory(Path.Combine(_manifestDirectory, "Android")); var sdkDirectoryWorkloadManifestProvider - = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.105"); + = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.100", userProfileDir: null); Action a = () => sdkDirectoryWorkloadManifestProvider.GetManifests().Select(m => { using (m.openManifestStream()) { } @@ -126,7 +126,7 @@ public void ItShouldReturnManifestsFromTestHook() var sdkDirectoryWorkloadManifestProvider - = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: sdkVersion, environmentMock.GetEnvironmentVariable); + = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: sdkVersion, environmentMock.GetEnvironmentVariable, userProfileDir: null); GetManifestContents(sdkDirectoryWorkloadManifestProvider) .Should() @@ -155,7 +155,7 @@ public void ManifestFromTestHookShouldOverrideDefault() File.WriteAllText(Path.Combine(_manifestDirectory, "Android", "WorkloadManifest.json"), "OverriddenAndroidContent"); var sdkDirectoryWorkloadManifestProvider - = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: sdkVersion, environmentMock.GetEnvironmentVariable); + = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: sdkVersion, environmentMock.GetEnvironmentVariable, userProfileDir: null); GetManifestContents(sdkDirectoryWorkloadManifestProvider) .Should() @@ -198,7 +198,7 @@ public void ItSupportsMultipleTestHookFolders() File.WriteAllText(Path.Combine(additionalManifestDirectory2, sdkVersion, "Test", "WorkloadManifest.json"), "TestContent2"); var sdkDirectoryWorkloadManifestProvider - = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: sdkVersion, environmentMock.GetEnvironmentVariable); + = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: sdkVersion, environmentMock.GetEnvironmentVariable, userProfileDir: null); GetManifestContents(sdkDirectoryWorkloadManifestProvider) .Should() @@ -221,7 +221,7 @@ public void IfTestHookFolderDoesNotExistItShouldBeIgnored() File.WriteAllText(Path.Combine(_manifestDirectory, "Android", "WorkloadManifest.json"), "AndroidContent"); var sdkDirectoryWorkloadManifestProvider - = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.100", environmentMock.GetEnvironmentVariable); + = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.100", environmentMock.GetEnvironmentVariable, userProfileDir: null); GetManifestContents(sdkDirectoryWorkloadManifestProvider) .Should() @@ -240,7 +240,7 @@ public void ItShouldIgnoreOutdatedManifestIds() File.WriteAllText(Path.Combine(_manifestDirectory, "Microsoft.NET.Workload.Android", "WorkloadManifest.json"), "iOSContent"); var sdkDirectoryWorkloadManifestProvider - = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.100"); + = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: _fakeDotnetRootDirectory, sdkVersion: "5.0.100", userProfileDir: null); GetManifestContents(sdkDirectoryWorkloadManifestProvider) .Should() @@ -286,7 +286,7 @@ public void ItShouldFallbackWhenFeatureBandHasNoManifests() File.WriteAllText(knownWorkloadsFilePath, "Android\niOS"); var sdkDirectoryWorkloadManifestProvider - = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: fakeDotnetRootDirectory, sdkVersion: "6.0.100"); + = new SdkDirectoryWorkloadManifestProvider(sdkRootPath: fakeDotnetRootDirectory, sdkVersion: "6.0.100", userProfileDir: null); GetManifestContents(sdkDirectoryWorkloadManifestProvider) .Should() diff --git a/src/Tests/dotnet-workload-install.Tests/GivenNetSdkManagedWorkloadInstall.cs b/src/Tests/dotnet-workload-install.Tests/GivenNetSdkManagedWorkloadInstall.cs index 35e72fa80b20..5ca3f0a36b6e 100644 --- a/src/Tests/dotnet-workload-install.Tests/GivenNetSdkManagedWorkloadInstall.cs +++ b/src/Tests/dotnet-workload-install.Tests/GivenNetSdkManagedWorkloadInstall.cs @@ -433,7 +433,7 @@ public void GivenManagedInstallItCanErrorsWhenMissingOfflineCache() INuGetPackageDownloader nugetInstaller = failingInstaller ? new FailingNuGetPackageDownloader(testDirectory) : new MockNuGetPackageDownloader(dotnetRoot, manifestDownload); var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); var sdkFeatureBand = new SdkFeatureBand("6.0.100"); - return (dotnetRoot, new NetSdkManagedInstaller(_reporter, sdkFeatureBand, workloadResolver, nugetInstaller, dotnetRoot, packageSourceLocation: packageSourceLocation), nugetInstaller); + return (dotnetRoot, new NetSdkManagedInstaller(_reporter, sdkFeatureBand, workloadResolver, userProfileDir: testDirectory, nugetInstaller, dotnetRoot, packageSourceLocation: packageSourceLocation), nugetInstaller); } } } diff --git a/src/Tests/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs b/src/Tests/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs index 1a83583eaafe..ce6ef6e3141c 100644 --- a/src/Tests/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs +++ b/src/Tests/dotnet.Tests/GivenThatTheUserIsRunningDotNetForTheFirstTime.cs @@ -208,7 +208,7 @@ public void ItCreatesTheProfileFileOnLinuxWhenInvokedFromNativeInstaller() File.Exists(profiled).Should().BeTrue(); File.ReadAllText(profiled).Should().Be( - $"export PATH=\"$PATH:$HOME/{CliFolderPathCalculator.DotnetProfileDirectoryName}/{CliFolderPathCalculator.ToolsShimFolderName}\""); + $"export PATH=\"$PATH:{CliFolderPathCalculator.ToolsShimPathInUnix.PathWithDollar}\""); } [MacOsOnlyFact] @@ -223,7 +223,7 @@ public void ItCreatesThePathDFileOnMacOSWhenInvokedFromNativeInstaller() command.Execute("internal-reportinstallsuccess", "test").Should().Pass(); File.Exists(pathsd).Should().BeTrue(); - File.ReadAllText(pathsd).Should().Be($"~/{CliFolderPathCalculator.DotnetProfileDirectoryName}/{CliFolderPathCalculator.ToolsShimFolderName}"); + File.ReadAllText(pathsd).Should().Be(CliFolderPathCalculator.ToolsShimPathInUnix.PathWithTilde); } private string GetDotnetVersion() diff --git a/src/Tests/dotnet.Tests/dotnet.Tests.csproj b/src/Tests/dotnet.Tests/dotnet.Tests.csproj index b561f4605c7f..84bde802e7c4 100644 --- a/src/Tests/dotnet.Tests/dotnet.Tests.csproj +++ b/src/Tests/dotnet.Tests/dotnet.Tests.csproj @@ -14,9 +14,6 @@ on a valid layout. --> $(ArtifactsBinDir)redist\$(Configuration) false - - - $(NoWarn);0436 @@ -54,9 +51,6 @@ - - - PreserveNewest @@ -165,8 +159,4 @@ - - - - From a0566984e6d95cf0a42ce5e5262f9f9c6a5a68da Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Thu, 2 Sep 2021 16:49:15 +0200 Subject: [PATCH 17/32] revert restore-toolset.sh changes --- eng/restore-toolset.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/eng/restore-toolset.sh b/eng/restore-toolset.sh index 77a6f32111ff..c5e939fb808f 100644 --- a/eng/restore-toolset.sh +++ b/eng/restore-toolset.sh @@ -20,10 +20,10 @@ function InitializeCustomSDKToolset { fi InitializeDotNetCli true - # if [[ "$DISTRO" != "ubuntu" || "$MAJOR_VERSION" -le 16 ]]; then - # InstallDotNetSharedFramework "1.0.5" - # InstallDotNetSharedFramework "1.1.2" - # fi + if [[ "$DISTRO" != "ubuntu" || "$MAJOR_VERSION" -le 16 ]]; then + InstallDotNetSharedFramework "1.0.5" + InstallDotNetSharedFramework "1.1.2" + fi InstallDotNetSharedFramework "2.1.0" InstallDotNetSharedFramework "2.2.8" InstallDotNetSharedFramework "3.1.0" From 7fa8e3c6e58d15acd26d58ffb23aa60730c89a93 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Thu, 2 Sep 2021 18:02:15 +0200 Subject: [PATCH 18/32] Fix optional arg order --- src/Cli/dotnet/commands/RestoringCommand.cs | 2 +- .../dotnet-workload/install/WorkloadInstallCommand.cs | 4 ++-- .../commands/dotnet-workload/list/WorkloadListCommand.cs | 4 ++-- .../commands/dotnet-workload/repair/WorkloadRepairCommand.cs | 4 ++-- .../commands/dotnet-workload/search/WorkloadSearchCommand.cs | 4 ++-- .../dotnet-workload/uninstall/WorkloadUninstallCommand.cs | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Cli/dotnet/commands/RestoringCommand.cs b/src/Cli/dotnet/commands/RestoringCommand.cs index f5860fe07311..9a69bddaa707 100644 --- a/src/Cli/dotnet/commands/RestoringCommand.cs +++ b/src/Cli/dotnet/commands/RestoringCommand.cs @@ -23,7 +23,7 @@ public RestoringCommand( string userProfileDir = null) : base(GetCommandArguments(msbuildArgs, noRestore), msbuildPath) { - userProfileDir = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath; + userProfileDir = CliFolderPathCalculator.DotnetUserProfileFolderPath; Task.Run(() => WorkloadManifestUpdater.BackgroundUpdateAdvertisingManifestsAsync(userProfileDir)); SeparateRestoreCommand = GetSeparateRestoreCommand(msbuildArgs, noRestore, msbuildPath); } diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs index 6276c60ec1f1..3c86d3b9f444 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs @@ -54,10 +54,10 @@ public WorkloadInstallCommand( INuGetPackageDownloader nugetPackageDownloader = null, IWorkloadManifestUpdater workloadManifestUpdater = null, string dotnetDir = null, - string userProfileDir = null, string tempDirPath = null, string version = null, - IReadOnlyCollection workloadIds = null) + IReadOnlyCollection workloadIds = null, + string userProfileDir = null) : base(parseResult) { _reporter = reporter ?? Reporter.Output; diff --git a/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs index 109a49d1a7c7..37f92021c756 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs @@ -42,11 +42,11 @@ public WorkloadListCommand( IWorkloadInstallationRecordRepository workloadRecordRepo = null, string currentSdkVersion = null, string dotnetDir = null, - string userProfileDir = null, string tempDirPath = null, INuGetPackageDownloader nugetPackageDownloader = null, IWorkloadManifestUpdater workloadManifestUpdater = null, - IWorkloadResolver workloadResolver = null + IWorkloadResolver workloadResolver = null, + string userProfileDir = null ) : base(result) { _reporter = reporter ?? Reporter.Output; diff --git a/src/Cli/dotnet/commands/dotnet-workload/repair/WorkloadRepairCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/repair/WorkloadRepairCommand.cs index b3a6b2323f10..f6d90a13d902 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/repair/WorkloadRepairCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/repair/WorkloadRepairCommand.cs @@ -37,8 +37,8 @@ public WorkloadRepairCommand( INuGetPackageDownloader nugetPackageDownloader = null, string dotnetDir = null, string tempDirPath = null, - string userProfileDir = null, - string version = null) + string version = null, + string userProfileDir = null) : base(parseResult) { _reporter = reporter ?? Reporter.Output; diff --git a/src/Cli/dotnet/commands/dotnet-workload/search/WorkloadSearchCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/search/WorkloadSearchCommand.cs index ffe2a1a5fe0c..05b160e123cc 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/search/WorkloadSearchCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/search/WorkloadSearchCommand.cs @@ -27,8 +27,8 @@ public WorkloadSearchCommand( ParseResult result, IReporter reporter = null, IWorkloadResolver workloadResolver = null, - string userProfileDir = null, - string version = null) : base(result) + string version = null, + string userProfileDir = null) : base(result) { _reporter = reporter ?? Reporter.Output; _verbosity = result.ValueForOption(WorkloadSearchCommandParser.VerbosityOption); diff --git a/src/Cli/dotnet/commands/dotnet-workload/uninstall/WorkloadUninstallCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/uninstall/WorkloadUninstallCommand.cs index ea42950ba53d..7c978970fd1c 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/uninstall/WorkloadUninstallCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/uninstall/WorkloadUninstallCommand.cs @@ -33,8 +33,8 @@ public WorkloadUninstallCommand( IWorkloadResolver workloadResolver = null, INuGetPackageDownloader nugetPackageDownloader = null, string dotnetDir = null, - string userProfileDir = null, - string version = null) + string version = null, + string userProfileDir = null) : base(parseResult) { _reporter = reporter ?? Reporter.Output; From 8c648e62e8d62839aaf0bf3860d8d735d123e63a Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Fri, 3 Sep 2021 06:32:15 +0200 Subject: [PATCH 19/32] cleanup --- src/Cli/dotnet/Program.cs | 4 ++-- .../dotnet-workload/install/NetSdkManagedInstaller.cs | 4 ++-- .../dotnet-workload/install/WorkloadInstallCommand.cs | 4 ++-- .../dotnet-workload/install/WorkloadInstallerFactory.cs | 1 - .../commands/dotnet-workload/list/WorkloadListCommand.cs | 4 ++-- src/Microsoft.DotNet.TemplateLocator/TemplateLocator.cs | 2 +- .../GivenAnTemplateLocator.cs | 6 +++--- 7 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/Cli/dotnet/Program.cs b/src/Cli/dotnet/Program.cs index fdefbce77649..c3be733b4a56 100644 --- a/src/Cli/dotnet/Program.cs +++ b/src/Cli/dotnet/Program.cs @@ -70,7 +70,7 @@ public static int Main(string[] args) Reporter.Output.WriteLine(e.Message); return 0; } - catch (Exception e) when (ExceptionExtensions.ShouldBeDisplayedAsError(e)) + catch (Exception e) when (e.ShouldBeDisplayedAsError()) { Reporter.Error.WriteLine(CommandContext.IsVerbose() ? e.ToString().Red().Bold() @@ -84,7 +84,7 @@ public static int Main(string[] args) return 1; } - catch (Exception e) when (!ExceptionExtensions.ShouldBeDisplayedAsError(e)) + catch (Exception e) when (!e.ShouldBeDisplayedAsError()) { // If telemetry object has not been initialized yet. It cannot be collected TelemetryEventEntry.SendFiltered(e); diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs index 2af04c45879c..8f7419e23bea 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs @@ -184,7 +184,7 @@ public void RepairWorkloadPack(PackInfo packInfo, SdkFeatureBand sdkFeatureBand, public void RollBackWorkloadPackInstall(PackInfo packInfo, SdkFeatureBand sdkFeatureBand, DirectoryPath? offlineCache = null) { DeletePackInstallationRecord(packInfo, sdkFeatureBand); - if (!PackHasInstallRecords(packInfo, sdkFeatureBand)) + if (!PackHasInstallRecords(packInfo)) { DeletePack(packInfo); } @@ -469,7 +469,7 @@ private void DeletePackInstallationRecord(PackInfo packInfo, SdkFeatureBand feat } } - private bool PackHasInstallRecords(PackInfo packInfo, SdkFeatureBand sdkFeatureBand) + private bool PackHasInstallRecords(PackInfo packInfo) { var packInstallRecordDir = Path.Combine(_workloadMetadataDir, InstalledPacksDir, "v1", packInfo.Id, packInfo.Version); return Directory.Exists(packInstallRecordDir) && Directory.GetFiles(packInstallRecordDir).Any(); diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs index 3c86d3b9f444..6276c60ec1f1 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs @@ -54,10 +54,10 @@ public WorkloadInstallCommand( INuGetPackageDownloader nugetPackageDownloader = null, IWorkloadManifestUpdater workloadManifestUpdater = null, string dotnetDir = null, + string userProfileDir = null, string tempDirPath = null, string version = null, - IReadOnlyCollection workloadIds = null, - string userProfileDir = null) + IReadOnlyCollection workloadIds = null) : base(parseResult) { _reporter = reporter ?? Reporter.Output; diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs index e5fbe26e77d6..7dd3d41d5e6e 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs @@ -68,7 +68,6 @@ public static IInstaller GetWorkloadInstaller( /// The associated with the SDK. public static InstallType GetWorkloadInstallType(SdkFeatureBand sdkFeatureBand, string dotnetDir) { - // TODO: does this file come with the SDK under dotnetDir? Or can it be under the userProfileDir for local installs? string installerTypePath = Path.Combine(dotnetDir, "metadata", "workloads", $"{sdkFeatureBand}", "installertype"); diff --git a/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs index 37f92021c756..109a49d1a7c7 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs @@ -42,11 +42,11 @@ public WorkloadListCommand( IWorkloadInstallationRecordRepository workloadRecordRepo = null, string currentSdkVersion = null, string dotnetDir = null, + string userProfileDir = null, string tempDirPath = null, INuGetPackageDownloader nugetPackageDownloader = null, IWorkloadManifestUpdater workloadManifestUpdater = null, - IWorkloadResolver workloadResolver = null, - string userProfileDir = null + IWorkloadResolver workloadResolver = null ) : base(result) { _reporter = reporter ?? Reporter.Output; diff --git a/src/Microsoft.DotNet.TemplateLocator/TemplateLocator.cs b/src/Microsoft.DotNet.TemplateLocator/TemplateLocator.cs index 4151a5afe418..b0a32fa649db 100644 --- a/src/Microsoft.DotNet.TemplateLocator/TemplateLocator.cs +++ b/src/Microsoft.DotNet.TemplateLocator/TemplateLocator.cs @@ -41,7 +41,7 @@ public TemplateLocator(Func getEnvironmentVariable, VSSettings v public IReadOnlyCollection GetDotnetSdkTemplatePackages( string sdkVersion, string dotnetRootPath, - string userProfileDir) + string? userProfileDir) { if (string.IsNullOrWhiteSpace(sdkVersion)) { diff --git a/src/Tests/Microsoft.DotNet.TemplateLocator.Tests/GivenAnTemplateLocator.cs b/src/Tests/Microsoft.DotNet.TemplateLocator.Tests/GivenAnTemplateLocator.cs index e4b6ada9de64..6ddb438444dc 100644 --- a/src/Tests/Microsoft.DotNet.TemplateLocator.Tests/GivenAnTemplateLocator.cs +++ b/src/Tests/Microsoft.DotNet.TemplateLocator.Tests/GivenAnTemplateLocator.cs @@ -47,7 +47,7 @@ public void ItShouldReturnListOfTemplates() string templateNupkgPath = Path.Combine(templatePacksDirectory, "xamarin.android.templates.1.0.3.nupkg"); File.WriteAllText(templateNupkgPath, ""); - var result = _resolver.GetDotnetSdkTemplatePackages("5.0.102", _fakeDotnetRootDirectory, userProfileDir: ""); + var result = _resolver.GetDotnetSdkTemplatePackages("5.0.102", _fakeDotnetRootDirectory, userProfileDir: null); result.First().Path.Should().Be(templateNupkgPath); result.First().TemplatePackageId.Should().Be("Xamarin.Android.Templates"); @@ -63,7 +63,7 @@ public void GivenNoSdkToBondItShouldReturnEmpty() File.Copy(Path.Combine("Manifests", "AndroidWorkloadManifest.json"), Path.Combine(_manifestDirectory, "Android", "WorkloadManifest.json")); - var result = _resolver.GetDotnetSdkTemplatePackages("5.1.100", _fakeDotnetRootDirectory, userProfileDir: ""); + var result = _resolver.GetDotnetSdkTemplatePackages("5.1.100", _fakeDotnetRootDirectory, userProfileDir: null); result.Should().BeEmpty(); } @@ -72,7 +72,7 @@ public void GivenNoManifestDirectoryItShouldReturnEmpty() { var fakeDotnetRootDirectory = Path.Combine(TestContext.Current.TestExecutionDirectory, Path.GetRandomFileName()); - var result = _resolver.GetDotnetSdkTemplatePackages("5.0.102", fakeDotnetRootDirectory, userProfileDir: ""); + var result = _resolver.GetDotnetSdkTemplatePackages("5.0.102", fakeDotnetRootDirectory, userProfileDir: null); result.Should().BeEmpty(); } } From a5ed1590f99f7590827361015430a97a4aed33d4 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Fri, 3 Sep 2021 06:57:40 +0200 Subject: [PATCH 20/32] Fix GivenMultiplePackRoots_ItUsesTheLastOneIfThePackDoesntExist --- .../WorkloadResolver.cs | 36 +++++++++++-------- .../ManifestReaderFunctionalTests.cs | 8 ++--- .../ManifestTests.cs | 14 ++++---- .../WorkloadSuggestionFinderTests.cs | 6 ++-- .../GivenDotnetWorkloadInstall.cs | 12 ++++--- .../GivenNetSdkManagedWorkloadInstall.cs | 2 +- .../GivenWorkloadManifestUpdater.cs | 12 +++---- .../GivenDotnetWorkloadList.cs | 4 +-- .../GivenDotnetWorkloadRepair.cs | 6 ++-- .../GivenDotnetWorkloadUninstall.cs | 4 +-- .../GivenDotnetWorkloadUpdate.cs | 8 ++--- 11 files changed, 60 insertions(+), 52 deletions(-) diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs index 4db0024b128c..772ddd154df2 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs @@ -22,7 +22,7 @@ public class WorkloadResolver : IWorkloadResolver private readonly Dictionary _packs = new(); private IWorkloadManifestProvider? _manifestProvider; private string[] _currentRuntimeIdentifiers; - private readonly string[] _dotnetRootPaths; + private readonly (string path, bool installable)[] _dotnetRootPaths; private Func? _fileExistOverride; private Func? _directoryExistOverride; @@ -34,26 +34,29 @@ public static WorkloadResolver Create(IWorkloadManifestProvider manifestProvider File.ReadAllLines(runtimeIdentifierChainPath).Where(l => !string.IsNullOrEmpty(l)).ToArray() : new string[] { }; - string[] workloadRootPaths; + (string path, bool installable)[] workloadRootPaths; if (userProfileDir != null && WorkloadInstall.IsUserLocal(dotnetRootPath, sdkVersion) && Directory.Exists(userProfileDir)) { - workloadRootPaths = new[] { userProfileDir, dotnetRootPath }; + workloadRootPaths = new[] { (userProfileDir, true), (dotnetRootPath, true) }; } else { - workloadRootPaths = new[] { dotnetRootPath }; + workloadRootPaths = new[] { (dotnetRootPath, true) }; } var packRootEnvironmentVariable = Environment.GetEnvironmentVariable(EnvironmentVariableNames.WORKLOAD_PACK_ROOTS); if (!string.IsNullOrEmpty(packRootEnvironmentVariable)) { - workloadRootPaths = packRootEnvironmentVariable.Split(Path.PathSeparator).Concat(workloadRootPaths).ToArray(); + workloadRootPaths = packRootEnvironmentVariable.Split(Path.PathSeparator).Select(path => (path, false)).Concat(workloadRootPaths).ToArray(); } return new WorkloadResolver(manifestProvider, workloadRootPaths, currentRuntimeIdentifiers); } - public static WorkloadResolver CreateForTests(IWorkloadManifestProvider manifestProvider, string[] dotNetRootPaths, string[]? currentRuntimeIdentifiers = null) + public static WorkloadResolver CreateForTests(IWorkloadManifestProvider manifestProvider, string dotNetRoot, string[]? currentRuntimeIdentifiers = null) + => CreateForTests(manifestProvider, new (string, bool)[] { (dotNetRoot, true) }, currentRuntimeIdentifiers); + + public static WorkloadResolver CreateForTests(IWorkloadManifestProvider manifestProvider, (string path, bool installable)[] dotNetRootPaths, string[]? currentRuntimeIdentifiers = null) { if (currentRuntimeIdentifiers == null) { @@ -65,7 +68,7 @@ public static WorkloadResolver CreateForTests(IWorkloadManifestProvider manifest /// /// Creates a resolver by composing all the manifests from the provider. /// - private WorkloadResolver(IWorkloadManifestProvider manifestProvider, string[] dotnetRootPaths, string[] currentRuntimeIdentifiers) + private WorkloadResolver(IWorkloadManifestProvider manifestProvider, (string path, bool installable)[] dotnetRootPaths, string[] currentRuntimeIdentifiers) : this(dotnetRootPaths, currentRuntimeIdentifiers) { _manifestProvider = manifestProvider; @@ -77,7 +80,7 @@ private WorkloadResolver(IWorkloadManifestProvider manifestProvider, string[] do /// /// Creates a resolver with no manifests. /// A - private WorkloadResolver(string[] dotnetRootPaths, string[] currentRuntimeIdentifiers) + private WorkloadResolver((string path, bool installable)[] dotnetRootPaths, string[] currentRuntimeIdentifiers) { _dotnetRootPaths = dotnetRootPaths; _currentRuntimeIdentifiers = currentRuntimeIdentifiers; @@ -287,7 +290,7 @@ internal void ReplaceFilesystemChecksForTest(Func fileExists, Func string GetPackPath(WorkloadPackId resolvedPackageId, string packageVersion, WorkloadPackKind kind, out bool isInstalled) { isInstalled = false; - string? firstPackPath = null; + string? firstInstallablePackPath = null; string? installedPackPath = null; foreach (var rootPath in _dotnetRootPaths) { @@ -297,26 +300,29 @@ string GetPackPath(WorkloadPackId resolvedPackageId, string packageVersion, Work { case WorkloadPackKind.Framework: case WorkloadPackKind.Sdk: - packPath = Path.Combine(rootPath, "packs", resolvedPackageId.ToString(), packageVersion); + packPath = Path.Combine(rootPath.path, "packs", resolvedPackageId.ToString(), packageVersion); isFile = false; break; case WorkloadPackKind.Template: - packPath = Path.Combine(rootPath, "template-packs", resolvedPackageId.GetNuGetCanonicalId() + "." + packageVersion.ToLowerInvariant() + ".nupkg"); + packPath = Path.Combine(rootPath.path, "template-packs", resolvedPackageId.GetNuGetCanonicalId() + "." + packageVersion.ToLowerInvariant() + ".nupkg"); isFile = true; break; case WorkloadPackKind.Library: - packPath = Path.Combine(rootPath, "library-packs", resolvedPackageId.GetNuGetCanonicalId() + "." + packageVersion.ToLowerInvariant() + ".nupkg"); + packPath = Path.Combine(rootPath.path, "library-packs", resolvedPackageId.GetNuGetCanonicalId() + "." + packageVersion.ToLowerInvariant() + ".nupkg"); isFile = true; break; case WorkloadPackKind.Tool: - packPath = Path.Combine(rootPath, "tool-packs", resolvedPackageId.ToString(), packageVersion); + packPath = Path.Combine(rootPath.path, "tool-packs", resolvedPackageId.ToString(), packageVersion); isFile = false; break; default: throw new ArgumentException($"The package kind '{kind}' is not known", nameof(kind)); } - firstPackPath ??= packPath; + if (rootPath.installable && firstInstallablePackPath is null) + { + firstInstallablePackPath = packPath; + } //can we do a more robust check than directory.exists? isInstalled = isFile ? @@ -329,7 +335,7 @@ string GetPackPath(WorkloadPackId resolvedPackageId, string packageVersion, Work break; } } - return installedPackPath ?? firstPackPath ?? ""; + return installedPackPath ?? firstInstallablePackPath ?? ""; } } diff --git a/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestReaderFunctionalTests.cs b/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestReaderFunctionalTests.cs index ce7da0d9bc87..1c12e9055aec 100644 --- a/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestReaderFunctionalTests.cs +++ b/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestReaderFunctionalTests.cs @@ -60,7 +60,7 @@ private WorkloadResolver SetUp() { var workloadResolver = WorkloadResolver.CreateForTests(new FakeManifestProvider(new[] { ManifestPath }), - new[] { "fakepath" }); + "fakepath"); workloadResolver.ReplaceFilesystemChecksForTest(fileExists: (_) => true, directoryExists: (_) => true); return workloadResolver; @@ -71,7 +71,7 @@ public void GivenTemplateNupkgDoesNotExistOnDiskItShouldReturnEmpty() { var workloadResolver = WorkloadResolver.CreateForTests(new FakeManifestProvider(new[] { ManifestPath }), - new[] { "fakepath" }); + "fakepath"); workloadResolver.ReplaceFilesystemChecksForTest(fileExists: (_) => false, directoryExists: (_) => true); var result = workloadResolver.GetInstalledWorkloadPacksOfKind(WorkloadPackKind.Template); result.Should().HaveCount(0); @@ -82,7 +82,7 @@ public void GivenWorkloadSDKsDirectoryNotExistOnDiskItShouldReturnEmpty() { var workloadResolver = WorkloadResolver.CreateForTests(new FakeManifestProvider(new[] { ManifestPath }), - new[] { "fakepath" }); + "fakepath"); workloadResolver.ReplaceFilesystemChecksForTest(fileExists: (_) => true, directoryExists: (_) => false); var result = workloadResolver.GetInstalledWorkloadPacksOfKind(WorkloadPackKind.Sdk); result.Should().HaveCount(0); @@ -99,7 +99,7 @@ public void ItCanReadIntegerVersion() }"); var workloadResolver = - WorkloadResolver.CreateForTests(new FakeManifestProvider(manifestPath), new[] { "fakepath" }); + WorkloadResolver.CreateForTests(new FakeManifestProvider(manifestPath), "fakepath"); workloadResolver.ReplaceFilesystemChecksForTest(fileExists: (_) => true, directoryExists: (_) => true); diff --git a/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestTests.cs b/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestTests.cs index 62c0be9a9060..4fb20e573190 100644 --- a/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestTests.cs +++ b/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestTests.cs @@ -51,7 +51,7 @@ public void ItCanDeserialize() public void AliasedPackPath() { var manifestProvider = new FakeManifestProvider(ManifestPath); - var resolver = WorkloadResolver.CreateForTests(manifestProvider, new[] { fakeRootPath }); + var resolver = WorkloadResolver.CreateForTests(manifestProvider, fakeRootPath); resolver.ReplaceFilesystemChecksForTest(_ => true, _ => true); @@ -67,7 +67,7 @@ public void AliasedPackPath() public void UnresolvedAliasedPackPath() { var manifestProvider = new FakeManifestProvider(ManifestPath); - var resolver = WorkloadResolver.CreateForTests(manifestProvider, new[] { fakeRootPath }, new[] { "fake-platform" }); + var resolver = WorkloadResolver.CreateForTests(manifestProvider, fakeRootPath, new[] { "fake-platform" }); resolver.ReplaceFilesystemChecksForTest(_ => true, _ => true); @@ -121,7 +121,7 @@ void TestMultiplePackRoots(bool defaultExists, bool additionalExists) } var manifestProvider = new FakeManifestProvider(ManifestPath); - var resolver = WorkloadResolver.CreateForTests(manifestProvider, new[] { additionalRoot, dotnetRoot }); + var resolver = WorkloadResolver.CreateForTests(manifestProvider, new[] { (additionalRoot, false), (dotnetRoot, true), ("other", true) }); var pack = resolver.TryGetPackInfo(new WorkloadPackId("Xamarin.Android.Sdk")); pack.Should().NotBeNull(); @@ -143,7 +143,7 @@ public void GivenNonExistentPackRoot_ItIgnoresIt() Directory.CreateDirectory(defaultPackPath); var manifestProvider = new FakeManifestProvider(ManifestPath); - var resolver = WorkloadResolver.CreateForTests(manifestProvider, new[] { additionalRoot, dotnetRoot }); + var resolver = WorkloadResolver.CreateForTests(manifestProvider, new[] { (additionalRoot, false), (dotnetRoot, true) }); var pack = resolver.TryGetPackInfo(new WorkloadPackId("Xamarin.Android.Sdk")); pack.Should().NotBeNull(); @@ -183,14 +183,14 @@ string MakeManifest(string version, params (string id, string version)[] depends { "DDD", MakeManifest("25.0.0") }, }; - WorkloadResolver.CreateForTests(goodManifestProvider, new[] { fakeRootPath }); + WorkloadResolver.CreateForTests(goodManifestProvider, fakeRootPath); var missingManifestProvider = new InMemoryFakeManifestProvider { { "AAA", MakeManifest("20.0.0", ("BBB", "5.0.0"), ("CCC", "63.0.0"), ("DDD", "25.0.0")) } }; - var missingManifestEx = Assert.Throws(() => WorkloadResolver.CreateForTests(missingManifestProvider, new[] { fakeRootPath })); + var missingManifestEx = Assert.Throws(() => WorkloadResolver.CreateForTests(missingManifestProvider, fakeRootPath)); Assert.StartsWith("Did not find workload manifest dependency 'BBB' required by manifest 'AAA'", missingManifestEx.Message); var inconsistentManifestProvider = new InMemoryFakeManifestProvider @@ -201,7 +201,7 @@ string MakeManifest(string version, params (string id, string version)[] depends { "DDD", MakeManifest("30.0.0") }, }; - var inconsistentManifestEx = Assert.Throws(() => WorkloadResolver.CreateForTests(inconsistentManifestProvider, new[] { fakeRootPath })); + var inconsistentManifestEx = Assert.Throws(() => WorkloadResolver.CreateForTests(inconsistentManifestProvider, fakeRootPath)); Assert.StartsWith("Workload manifest dependency 'DDD' version '39.0.0' is lower than version '30.0.0' required by manifest 'BBB'", inconsistentManifestEx.Message); } diff --git a/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/WorkloadSuggestionFinderTests.cs b/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/WorkloadSuggestionFinderTests.cs index 2952c04c98ae..6a5821813101 100644 --- a/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/WorkloadSuggestionFinderTests.cs +++ b/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/WorkloadSuggestionFinderTests.cs @@ -30,7 +30,7 @@ public WorkloadSuggestionFinderTests(ITestOutputHelper log) : base(log) public void CanSuggestSimpleWorkload() { var manifestProvider = new FakeManifestProvider(ManifestPath); - var resolver = WorkloadResolver.CreateForTests(manifestProvider, new[] { fakeRootPath }); + var resolver = WorkloadResolver.CreateForTests(manifestProvider, fakeRootPath); FakeFileSystemChecksSoThesePackagesAppearInstalled(resolver, "Xamarin.Android.Sdk", "Xamarin.Android.BuildTools"); @@ -48,7 +48,7 @@ public void CanSuggestSimpleWorkload() public void CanSuggestTwoWorkloadsToFulfilTwoRequirements() { var manifestProvider = new FakeManifestProvider(ManifestPath); - var resolver = WorkloadResolver.CreateForTests(manifestProvider, new[] { fakeRootPath }); + var resolver = WorkloadResolver.CreateForTests(manifestProvider, fakeRootPath); FakeFileSystemChecksSoThesePackagesAppearInstalled(resolver, //xamarin-android-build is fully installed @@ -73,7 +73,7 @@ public void CanSuggestTwoWorkloadsToFulfilTwoRequirements() public void CanSuggestWorkloadThatFulfillsTwoRequirements() { var manifestProvider = new FakeManifestProvider(ManifestPath); - var resolver = WorkloadResolver.CreateForTests(manifestProvider, new[] { fakeRootPath }); + var resolver = WorkloadResolver.CreateForTests(manifestProvider, fakeRootPath); FakeFileSystemChecksSoThesePackagesAppearInstalled(resolver, //xamarin-android-build is fully installed diff --git a/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs b/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs index 36a9d785301f..882392aa79ab 100644 --- a/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs +++ b/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs @@ -93,7 +93,7 @@ public void GivenWorkloadInstallOnFailingRollbackItDisplaysTopLevelError() var testDirectory = _testAssetsManager.CreateTestDirectory().Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); var installer = new MockPackWorkloadInstaller(failingWorkload: "xamarin-android-build", failingRollback: true); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "xamarin-android-build", "--skip-manifest-update" }); var installManager = new WorkloadInstallCommand(parseResult, reporter: _reporter, workloadResolver: workloadResolver, workloadInstaller: installer, version: "6.0.100"); @@ -123,7 +123,7 @@ public void GivenWorkloadInstallItWarnsOnGarbageCollectionFailure() var testDirectory = _testAssetsManager.CreateTestDirectory().Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); var installer = new MockPackWorkloadInstaller(failingGarbageCollection: true); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "xamarin-android-build", "--skip-manifest-update" }); var installManager = new WorkloadInstallCommand(parseResult, reporter: _reporter, workloadResolver: workloadResolver, workloadInstaller: installer, version: "6.0.100"); @@ -237,7 +237,7 @@ public void GivenWorkloadInstallItErrorsOnUnsupportedPlatform() var testDirectory = _testAssetsManager.CreateTestDirectory().Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); var installer = new MockPackWorkloadInstaller(); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { manifestPath }), dotnetRoot); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(); var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", mockWorkloadId }); @@ -255,7 +255,9 @@ public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback() var userProfileDir = Path.Combine(testDirectory, "user-profile"); var tmpDir = Path.Combine(testDirectory, "tmp"); var manifestPath = Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleManifest"), "MockWorkloadsSample.json"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { manifestPath }), _userLocal ? new string[] { userProfileDir, dotnetRoot } : new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests( + new MockManifestProvider(new[] { manifestPath }), _userLocal ? new [] { (userProfileDir, true), (dotnetRoot, true) } : + new [] { (dotnetRoot, true) }); var nugetDownloader = new FailingNuGetPackageDownloader(tmpDir); var manifestUpdater = new MockWorkloadManifestUpdater(); var sdkFeatureVersion = "6.0.100"; @@ -302,7 +304,7 @@ public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback() var testDirectory = _testAssetsManager.CreateTestDirectory(testName: testName).Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); var installer = new MockPackWorkloadInstaller(failingWorkload); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(manifestUpdates, tempDirManifestPath); string sdkVersion = "6.0.100"; diff --git a/src/Tests/dotnet-workload-install.Tests/GivenNetSdkManagedWorkloadInstall.cs b/src/Tests/dotnet-workload-install.Tests/GivenNetSdkManagedWorkloadInstall.cs index 5ca3f0a36b6e..8a31d1b3b201 100644 --- a/src/Tests/dotnet-workload-install.Tests/GivenNetSdkManagedWorkloadInstall.cs +++ b/src/Tests/dotnet-workload-install.Tests/GivenNetSdkManagedWorkloadInstall.cs @@ -431,7 +431,7 @@ public void GivenManagedInstallItCanErrorsWhenMissingOfflineCache() var testDirectory = _testAssetsManager.CreateTestDirectory(testName, identifier: identifier).Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); INuGetPackageDownloader nugetInstaller = failingInstaller ? new FailingNuGetPackageDownloader(testDirectory) : new MockNuGetPackageDownloader(dotnetRoot, manifestDownload); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var sdkFeatureBand = new SdkFeatureBand("6.0.100"); return (dotnetRoot, new NetSdkManagedInstaller(_reporter, sdkFeatureBand, workloadResolver, userProfileDir: testDirectory, nugetInstaller, dotnetRoot, packageSourceLocation: packageSourceLocation), nugetInstaller); } diff --git a/src/Tests/dotnet-workload-install.Tests/GivenWorkloadManifestUpdater.cs b/src/Tests/dotnet-workload-install.Tests/GivenWorkloadManifestUpdater.cs index 73214ed2da94..f6bb23a1563a 100644 --- a/src/Tests/dotnet-workload-install.Tests/GivenWorkloadManifestUpdater.cs +++ b/src/Tests/dotnet-workload-install.Tests/GivenWorkloadManifestUpdater.cs @@ -140,7 +140,7 @@ public void GivenWorkloadManifestUpdateItCanCalculateUpdates() .ToArray(); var workloadManifestProvider = new MockManifestProvider(manifestDirs); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); - var workloadResolver = WorkloadResolver.CreateForTests(workloadManifestProvider, new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(workloadManifestProvider, dotnetRoot); var installationRepo = new MockInstallationRecordRepository(); var manifestUpdater = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, userProfileDir: Path.Combine(testDir, ".dotnet"), testDir, installationRepo); @@ -178,7 +178,7 @@ public void GivenWorkloadManifestRollbackItCanCalculateUpdates() .ToArray(); var workloadManifestProvider = new MockManifestProvider(manifestDirs); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); - var workloadResolver = WorkloadResolver.CreateForTests(workloadManifestProvider, new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(workloadManifestProvider, dotnetRoot); var installationRepo = new MockInstallationRecordRepository(); var manifestUpdater = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, testDir, testDir, installationRepo); @@ -221,7 +221,7 @@ public void GivenFromRollbackDefinitionItErrorsOnInstalledExtraneousManifestId() .ToArray(); var workloadManifestProvider = new MockManifestProvider(manifestDirs); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(Array.Empty()), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(Array.Empty()), dotnetRoot); var installationRepo = new MockInstallationRecordRepository(); var manifestUpdater = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, testDir, testDir, installationRepo); @@ -263,7 +263,7 @@ public void GivenFromRollbackDefinitionItErrorsOnExtraneousManifestIdInRollbackD .ToArray(); var workloadManifestProvider = new MockManifestProvider(manifestDirs); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(Array.Empty()), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(Array.Empty()), dotnetRoot); var installationRepo = new MockInstallationRecordRepository(); var manifestUpdater = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, testDir, testDir, installationRepo); @@ -294,7 +294,7 @@ public void GivenWorkloadManifestUpdateItChoosesHighestManifestVersionInCache() var workloadManifestProvider = new MockManifestProvider(new string[] { Path.Combine(installedManifestDir, manifestId, _manifestFileName) }); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); - var workloadResolver = WorkloadResolver.CreateForTests(workloadManifestProvider, new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(workloadManifestProvider, dotnetRoot); var installationRepo = new MockInstallationRecordRepository(); var manifestUpdater = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, testDir, testDir, installationRepo); manifestUpdater.UpdateAdvertisingManifestsAsync(false, new DirectoryPath(offlineCache)).Wait(); @@ -351,7 +351,7 @@ public void GivenWorkloadsAreOutOfDateUpdatesAreAdvertisedOnRestoringCommands(st .Select(manifest => Path.Combine(installedManifestDir, manifest.ToString(), _manifestFileName)) .ToArray(); var workloadManifestProvider = new MockManifestProvider(manifestDirs); - var workloadResolver = WorkloadResolver.CreateForTests(workloadManifestProvider, new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(workloadManifestProvider, dotnetRoot); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot, manifestDownload: true); var installationRepo = new MockInstallationRecordRepository(); var manifestUpdater = new WorkloadManifestUpdater(_reporter, workloadResolver, nugetDownloader, testDir, testDir, installationRepo, getEnvironmentVariable: getEnvironmentVariable); diff --git a/src/Tests/dotnet-workload-list.Tests/GivenDotnetWorkloadList.cs b/src/Tests/dotnet-workload-list.Tests/GivenDotnetWorkloadList.cs index 2c4f81da1cd2..c02c63c735fa 100644 --- a/src/Tests/dotnet-workload-list.Tests/GivenDotnetWorkloadList.cs +++ b/src/Tests/dotnet-workload-list.Tests/GivenDotnetWorkloadList.cs @@ -64,7 +64,7 @@ public void GivenNoWorkloadsAreInstalledListIsNotEmpty() _reporter.Clear(); var expectedWorkloads = new List() { new WorkloadId("mock-workload-1"), new WorkloadId("mock-workload-2"), new WorkloadId("mock-workload-3") }; var workloadInstaller = new MockWorkloadRecordRepo(expectedWorkloads); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { Directory.GetCurrentDirectory() }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), Directory.GetCurrentDirectory()); var command = new WorkloadListCommand(_parseResult, _reporter, workloadInstaller, "6.0.100", workloadResolver: workloadResolver); command.Execute(); @@ -93,7 +93,7 @@ public void GivenWorkloadsAreOutOfDateUpdatesAreAdvertised() var testDirectory = _testAssetsManager.CreateTestDirectory().Path; var expectedWorkloads = new List() { new WorkloadId("mock-workload-1"), new WorkloadId("mock-workload-2"), new WorkloadId("mock-workload-3") }; var workloadInstaller = new MockWorkloadRecordRepo(expectedWorkloads); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { testDirectory }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), testDirectory); // Lay out fake advertising manifests with pack version update for pack A (in workloads 1 and 3) var userProfileDir = Path.Combine(testDirectory, "user-profile"); diff --git a/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs b/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs index ef0e1ff55e8b..123b0d0af4c3 100644 --- a/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs +++ b/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs @@ -39,7 +39,7 @@ public void GivenNoWorkloadsAreInstalledRepairIsNoOp() var testDirectory = _testAssetsManager.CreateTestDirectory().Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var sdkFeatureVersion = "6.0.100"; var repairCommand = new WorkloadRepairCommand(_parseResult, reporter: _reporter, workloadResolver: workloadResolver, @@ -54,7 +54,7 @@ public void GivenExtraPacksInstalledRepairGarbageCollects() { var testDirectory = _testAssetsManager.CreateTestDirectory().Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(); var sdkFeatureVersion = "6.0.100"; @@ -92,7 +92,7 @@ public void GivenMissingPacksRepairFixesInstall() { var testDirectory = _testAssetsManager.CreateTestDirectory().Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(); var sdkFeatureVersion = "6.0.100"; diff --git a/src/Tests/dotnet-workload-uninstall.Tests/GivenDotnetWorkloadUninstall.cs b/src/Tests/dotnet-workload-uninstall.Tests/GivenDotnetWorkloadUninstall.cs index c7ebbeb1c908..499764a93b99 100644 --- a/src/Tests/dotnet-workload-uninstall.Tests/GivenDotnetWorkloadUninstall.cs +++ b/src/Tests/dotnet-workload-uninstall.Tests/GivenDotnetWorkloadUninstall.cs @@ -145,7 +145,7 @@ public void GivenWorkloadUninstallItCanUninstallOnlySpecifiedFeatureBand() private void InstallWorkload(string installingWorkload, string testDirectory, string sdkFeatureVersion) { var dotnetRoot = Path.Combine(testDirectory, "dotnet"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(); var installParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", installingWorkload }); @@ -157,7 +157,7 @@ private void InstallWorkload(string installingWorkload, string testDirectory, st private void UninstallWorkload(string uninstallingWorkload, string testDirectory, string sdkFeatureVersion) { var dotnetRoot = Path.Combine(testDirectory, "dotnet"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var uninstallParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "uninstall", uninstallingWorkload }); var uninstallCommand = new WorkloadUninstallCommand(uninstallParseResult, reporter: _reporter, workloadResolver, nugetDownloader, diff --git a/src/Tests/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs b/src/Tests/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs index 7810d9271242..8059ef61ad0d 100644 --- a/src/Tests/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs +++ b/src/Tests/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs @@ -42,7 +42,7 @@ public void GivenWorkloadUpdateItRemovesOldPacksAfterInstall() { var testDirectory = _testAssetsManager.CreateTestDirectory().Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(); var sdkFeatureVersion = "6.0.100"; @@ -80,7 +80,7 @@ public void GivenWorkloadUpdateItRemovesOldPacksAfterInstall() // Mock updating the manifest workloadResolver = WorkloadResolver.CreateForTests( new MockManifestProvider(new[] { Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleUpdatedManifest"), "Sample.json") }), - new string[] { dotnetRoot }); + dotnetRoot); // Update workload var updateParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update" }); @@ -118,7 +118,7 @@ public void GivenWorkloadUpdateAcrossFeatureBandsItUpdatesPacks() var testDirectory = _testAssetsManager.CreateTestDirectory().Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); var manifestPath = Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleManifest"), "BasicSample.json"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { manifestPath }), dotnetRoot); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(); var sdkFeatureVersion = "6.0.100"; @@ -318,7 +318,7 @@ public void GivenPrintRollbackDefinitionItIncludesAllInstalledManifests() var installer = includeInstalledPacks ? new MockPackWorkloadInstaller(failingWorkload, failingPack, installedWorkloads: installedWorkloads, installedPacks: installedPacks) : new MockPackWorkloadInstaller(failingWorkload, failingPack, installedWorkloads: installedWorkloads); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(manifestUpdates, _manifestPath); var installManager = new WorkloadUpdateCommand( From 0a5105cff076220781ea6eb54ba72388d6c80657 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Fri, 3 Sep 2021 07:14:29 +0200 Subject: [PATCH 21/32] Fix ItCreatesAnAspNetCertificateSentinelFileUnderTheDotDotNetFolder --- src/Cli/Microsoft.DotNet.Configurer/CliFolderPathCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Cli/Microsoft.DotNet.Configurer/CliFolderPathCalculator.cs b/src/Cli/Microsoft.DotNet.Configurer/CliFolderPathCalculator.cs index 8b1258c18b35..f667113ec253 100644 --- a/src/Cli/Microsoft.DotNet.Configurer/CliFolderPathCalculator.cs +++ b/src/Cli/Microsoft.DotNet.Configurer/CliFolderPathCalculator.cs @@ -51,7 +51,7 @@ public static string DotnetHomePath { get { - return CliFolderPathCalculatorCore.GetDotnetUserProfileFolderPath() + return CliFolderPathCalculatorCore.GetDotnetHomePath() ?? throw new ConfigurationException( string.Format( LocalizableStrings.FailedToDetermineUserHomeDirectory, From 8c44c72ae50ce81ff3c5cd122628c599ed7f1916 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Fri, 3 Sep 2021 08:47:01 +0200 Subject: [PATCH 22/32] Fix project test failures due to random folder names. --- .../Microsoft.NET.TestFramework/TestAssetsManager.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Tests/Microsoft.NET.TestFramework/TestAssetsManager.cs b/src/Tests/Microsoft.NET.TestFramework/TestAssetsManager.cs index 3ef099f00e02..3747643af9cd 100644 --- a/src/Tests/Microsoft.NET.TestFramework/TestAssetsManager.cs +++ b/src/Tests/Microsoft.NET.TestFramework/TestAssetsManager.cs @@ -90,7 +90,7 @@ public TestAsset CreateTestProject( public TestDirectory CreateTestDirectory([CallerMemberName] string testName = null, string identifier = null) { - string dir = GetTestDestinationDirectoryPath(testName, testName, identifier ?? string.Empty); + string dir = GetTestDestinationDirectoryPath(testName, testName, identifier ?? string.Empty, unique: true); return new TestDirectory(dir, TestContext.Current.SdkVersion); } @@ -114,7 +114,8 @@ public static string GetTestDestinationDirectoryPath( string testProjectName, string callingMethodAndFileName, string identifier, - bool allowCopyIfPresent = false) + bool allowCopyIfPresent = false, + bool unique = false) { string baseDirectory = TestContext.Current.TestExecutionDirectory; var directoryName = new StringBuilder(callingMethodAndFileName).Append(identifier); @@ -124,8 +125,11 @@ public static string GetTestDestinationDirectoryPath( directoryName = directoryName.Append(testProjectName); } - // avoid collisions between derived test classes using same base method concurrently - directoryName = directoryName.Append(Guid.NewGuid().ToString("N").Substring(0, 8)); + if (unique) + { + // avoid collisions between derived test classes using same base method concurrently + directoryName = directoryName.Append(Guid.NewGuid().ToString("N").Substring(0, 8)); + } // We need to ensure the directory name isn't over 24 characters in length if (directoryName.Length > 24) From 50cc06b21cc094b0e2e2037a64636d45c70fc919 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Fri, 3 Sep 2021 10:43:31 +0200 Subject: [PATCH 23/32] Fix TestPreviewFeatures --- .../GivenThatWeWantToControlGeneratedAssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToControlGeneratedAssemblyInfo.cs b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToControlGeneratedAssemblyInfo.cs index c196f3339024..0358bd0f1cf2 100644 --- a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToControlGeneratedAssemblyInfo.cs +++ b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToControlGeneratedAssemblyInfo.cs @@ -386,7 +386,7 @@ private static string LatestTargetFramework .WithWorkingDirectory(path) .Execute("new", "console"); - string projectFile = Path.Combine(path, "LatestTargetFramework.csproj"); + string projectFile = Path.Combine(path, $"{Path.GetFileName(path)}.csproj"); XDocument projectXml = XDocument.Load(projectFile); XNamespace ns = projectXml.Root.Name.Namespace; _cachedLatestTargetFramework = projectXml.Root.Element(ns + "PropertyGroup").Element(ns + "TargetFramework").Value; From 75975f6db3ac16c44710c86174cb538b92f875c2 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Fri, 3 Sep 2021 11:51:12 +0200 Subject: [PATCH 24/32] Microsoft.NET.Sdk.Razor.Tool: use CliFolderPathCalculatorCore --- src/RazorSdk/Tool/Microsoft.NET.Sdk.Razor.Tool.csproj | 4 ++++ src/RazorSdk/Tool/ServerCommand.cs | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/RazorSdk/Tool/Microsoft.NET.Sdk.Razor.Tool.csproj b/src/RazorSdk/Tool/Microsoft.NET.Sdk.Razor.Tool.csproj index feb59557bc48..047441bc3447 100644 --- a/src/RazorSdk/Tool/Microsoft.NET.Sdk.Razor.Tool.csproj +++ b/src/RazorSdk/Tool/Microsoft.NET.Sdk.Razor.Tool.csproj @@ -36,6 +36,10 @@ SkipGetTargetFrameworkProperties="true"/> + + + + diff --git a/src/RazorSdk/Tool/ServerCommand.cs b/src/RazorSdk/Tool/ServerCommand.cs index ebb0783b909e..98e3bbe28af7 100644 --- a/src/RazorSdk/Tool/ServerCommand.cs +++ b/src/RazorSdk/Tool/ServerCommand.cs @@ -9,6 +9,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.DotNet.Configurer; using Microsoft.NET.Sdk.Razor.Tool.CommandLineUtils; namespace Microsoft.NET.Sdk.Razor.Tool @@ -172,9 +173,8 @@ internal virtual string GetPidFilePath(Func getEnvironmentVariab var path = getEnvironmentVariable("DOTNET_BUILD_PIDFILE_DIRECTORY"); if (string.IsNullOrEmpty(path)) { - var homeEnvVariable = PlatformInformation.IsWindows ? "USERPROFILE" : "HOME"; - var homePath = getEnvironmentVariable(homeEnvVariable); - if (string.IsNullOrEmpty(homePath)) + var homePath = CliFolderPathCalculatorCore.GetDotnetHomePath(); + if (homePath is null) { // Couldn't locate the user profile directory. Bail. return null; From 0553a706f4f68fe559b2f100d2a3ddd2f547d515 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Fri, 3 Sep 2021 13:24:47 +0200 Subject: [PATCH 25/32] Fix GetPidFilePath_ReturnsCorrectDefaultPath --- src/Common/CliFolderPathCalculatorCore.cs | 8 +++++--- src/RazorSdk/Tool/ServerCommand.cs | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Common/CliFolderPathCalculatorCore.cs b/src/Common/CliFolderPathCalculatorCore.cs index 02c7c0d9451b..674dfb2a31df 100644 --- a/src/Common/CliFolderPathCalculatorCore.cs +++ b/src/Common/CliFolderPathCalculatorCore.cs @@ -28,12 +28,14 @@ static class CliFolderPathCalculatorCore return Path.Combine(homePath, DotnetProfileDirectoryName); } - public static string? GetDotnetHomePath() + public static string? GetDotnetHomePath(Func? getEnvironmentVariable = null) { - var home = Environment.GetEnvironmentVariable(DotnetHomeVariableName); + getEnvironmentVariable ??= key => Environment.GetEnvironmentVariable(key); + + var home = getEnvironmentVariable(DotnetHomeVariableName); if (string.IsNullOrEmpty(home)) { - home = Environment.GetEnvironmentVariable(PlatformHomeVariableName); + home = getEnvironmentVariable(PlatformHomeVariableName); if (string.IsNullOrEmpty(home)) { return null; diff --git a/src/RazorSdk/Tool/ServerCommand.cs b/src/RazorSdk/Tool/ServerCommand.cs index 98e3bbe28af7..5e8512a36794 100644 --- a/src/RazorSdk/Tool/ServerCommand.cs +++ b/src/RazorSdk/Tool/ServerCommand.cs @@ -173,7 +173,7 @@ internal virtual string GetPidFilePath(Func getEnvironmentVariab var path = getEnvironmentVariable("DOTNET_BUILD_PIDFILE_DIRECTORY"); if (string.IsNullOrEmpty(path)) { - var homePath = CliFolderPathCalculatorCore.GetDotnetHomePath(); + var homePath = CliFolderPathCalculatorCore.GetDotnetHomePath(getEnvironmentVariable); if (homePath is null) { // Couldn't locate the user profile directory. Bail. From 86621e499ff1245c6ea6d1da5bcc0c4cbaa5d8bc Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 6 Sep 2021 09:15:06 +0200 Subject: [PATCH 26/32] Rename GivenMultiplePackRoots_ItUsesTheLastOneIfThePackDoesntExist to ItUsesTheFirstInstallableIfThePackDoesntExist --- .../ManifestTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestTests.cs b/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestTests.cs index 4fb20e573190..5fa9b3d2b16c 100644 --- a/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestTests.cs +++ b/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestTests.cs @@ -77,7 +77,7 @@ public void UnresolvedAliasedPackPath() } [Fact] - public void GivenMultiplePackRoots_ItUsesTheLastOneIfThePackDoesntExist() + public void GivenMultiplePackRoots_ItUsesTheFirstInstallableIfThePackDoesntExist() { TestMultiplePackRoots(false, false); } From 287f025cc534e02b07ad89ae4fe4565d98a57d26 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 6 Sep 2021 09:29:30 +0200 Subject: [PATCH 27/32] Rename WorkloadInstall to Microsoft.DotNet.Workloads.Workload.WorkloadFileBasedInstall. --- .../install/NetSdkManagedInstaller.cs | 4 ++-- .../install/WorkloadInstallerFactory.cs | 2 +- src/Cli/dotnet/dotnet.csproj | 2 +- src/Common/WorkloadFileBasedInstall.cs | 17 +++++++++++++++++ src/Common/WorkloadInstall.cs | 14 -------------- .../Microsoft.DotNet.TemplateLocator.csproj | 2 +- .../Microsoft.DotNet.MSBuildSdkResolver.csproj | 2 +- ...ft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj | 2 +- ...rosoft.NET.Sdk.WorkloadManifestReader.csproj | 2 +- .../SdkDirectoryWorkloadManifestProvider.cs | 3 ++- .../WorkloadResolver.cs | 3 ++- .../Microsoft.NET.Build.Tasks.csproj | 2 +- .../ProcessFrameworkReferences.cs | 3 ++- .../GivenDotnetWorkloadInstall.cs | 3 ++- 14 files changed, 34 insertions(+), 27 deletions(-) create mode 100644 src/Common/WorkloadFileBasedInstall.cs delete mode 100644 src/Common/WorkloadInstall.cs diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs index 8f7419e23bea..30dd78018ee4 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/NetSdkManagedInstaller.cs @@ -57,7 +57,7 @@ public NetSdkManagedInstaller(IReporter reporter, new NuGetPackageDownloader(_tempPackagesDir, filePermissionSetter: null, new FirstPartyNuGetPackageSigningVerifier(_tempPackagesDir), logger, restoreActionConfig: _restoreActionConfig); - bool userLocal = WorkloadInstall.IsUserLocal(_dotnetDir, sdkFeatureBand.ToString()); + bool userLocal = WorkloadFileBasedInstall.IsUserLocal(_dotnetDir, sdkFeatureBand.ToString()); _workloadMetadataDir = Path.Combine(userLocal ? _userProfileDir : _dotnetDir, "metadata", "workloads"); _reporter = reporter; _sdkFeatureBand = sdkFeatureBand; @@ -195,7 +195,7 @@ public void InstallWorkloadManifest(ManifestId manifestId, ManifestVersion manif string packagePath = null; string tempExtractionDir = null; string tempBackupDir = null; - string rootInstallDir = WorkloadInstall.IsUserLocal(_dotnetDir, sdkFeatureBand.ToString()) ? _userProfileDir : _dotnetDir; + string rootInstallDir = WorkloadFileBasedInstall.IsUserLocal(_dotnetDir, sdkFeatureBand.ToString()) ? _userProfileDir : _dotnetDir; var manifestPath = Path.Combine(rootInstallDir, "sdk-manifests", sdkFeatureBand.ToString(), manifestId.ToString()); _reporter.WriteLine(string.Format(LocalizableStrings.InstallingWorkloadManifest, manifestId, manifestVersion)); diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs index 7dd3d41d5e6e..a0557684ee16 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallerFactory.cs @@ -42,7 +42,7 @@ public static IInstaller GetWorkloadInstaller( nugetPackageDownloader, verbosity, packageSourceLocation, reporter, tempDirPath); } - if (elevationRequired && !WorkloadInstall.IsUserLocal(dotnetDir, sdkFeatureBand.ToString()) && !CanWriteToDotnetRoot(dotnetDir)) + if (elevationRequired && !WorkloadFileBasedInstall.IsUserLocal(dotnetDir, sdkFeatureBand.ToString()) && !CanWriteToDotnetRoot(dotnetDir)) { throw new GracefulException(LocalizableStrings.InadequatePermissions, isUserError: false); } diff --git a/src/Cli/dotnet/dotnet.csproj b/src/Cli/dotnet/dotnet.csproj index 4859fa4afb01..b27862fb9dcc 100644 --- a/src/Cli/dotnet/dotnet.csproj +++ b/src/Cli/dotnet/dotnet.csproj @@ -18,7 +18,7 @@ - + diff --git a/src/Common/WorkloadFileBasedInstall.cs b/src/Common/WorkloadFileBasedInstall.cs new file mode 100644 index 000000000000..c35c89165436 --- /dev/null +++ b/src/Common/WorkloadFileBasedInstall.cs @@ -0,0 +1,17 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.IO; + +namespace Microsoft.DotNet.Workloads.Workload +{ + static class WorkloadFileBasedInstall + { + public static bool IsUserLocal(string dotnetDir, string sdkFeatureBand) + { + string userlocalPath = Path.Combine(dotnetDir, "metadata", "workloads", sdkFeatureBand, "userlocal"); + + return File.Exists(userlocalPath); + } + } +} \ No newline at end of file diff --git a/src/Common/WorkloadInstall.cs b/src/Common/WorkloadInstall.cs deleted file mode 100644 index 5247ec314fa8..000000000000 --- a/src/Common/WorkloadInstall.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.IO; - -static class WorkloadInstall -{ - public static bool IsUserLocal(string dotnetDir, string sdkFeatureBand) - { - string userlocalPath = Path.Combine(dotnetDir, "metadata", "workloads", sdkFeatureBand, "userlocal"); - - return File.Exists(userlocalPath); - } -} \ No newline at end of file diff --git a/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj b/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj index 815b1f6aa32c..baf558cdec8a 100644 --- a/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj +++ b/src/Microsoft.DotNet.TemplateLocator/Microsoft.DotNet.TemplateLocator.csproj @@ -50,7 +50,7 @@ - + diff --git a/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj b/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj index 66b83c7c4a25..de9c3d5cd291 100644 --- a/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj +++ b/src/Resolvers/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj @@ -71,7 +71,7 @@ - + diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj b/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj index 00308587df35..1e3c98d93e88 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver/Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.csproj @@ -24,7 +24,7 @@ Exclude="..\..\Cli\dotnet\commands\dotnet-workload\install\WorkloadInstallRecords\RegistryWorkloadInstallationRecordRepository.cs" LinkBase="WorkloadInstallRecords" /> - + diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj index 654f06a1ce33..0fad2f04f1d4 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/Microsoft.NET.Sdk.WorkloadManifestReader.csproj @@ -19,7 +19,7 @@ - + diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs index 7310b1c9aab2..80157b0f724b 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using Microsoft.DotNet.Cli; +using Microsoft.DotNet.Workloads.Workload; using Microsoft.NET.Sdk.Localization; namespace Microsoft.NET.Sdk.WorkloadManifestReader @@ -62,7 +63,7 @@ static int Last2DigitsTo0(int versionBuild) string? userManifestsDir = userProfileDir is null ? null : Path.Combine(userProfileDir, "sdk-manifests", _sdkVersionBand); string dotnetManifestDir = Path.Combine(_sdkRootPath, "sdk-manifests", _sdkVersionBand); - if (userManifestsDir != null && WorkloadInstall.IsUserLocal(_sdkRootPath, sdkVersion) && Directory.Exists(userManifestsDir)) + if (userManifestsDir != null && WorkloadFileBasedInstall.IsUserLocal(_sdkRootPath, sdkVersion) && Directory.Exists(userManifestsDir)) { _manifestDirectories = new[] { userManifestsDir, dotnetManifestDir }; } diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs index 772ddd154df2..06642c5b0fb8 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using Microsoft.DotNet.Cli; +using Microsoft.DotNet.Workloads.Workload; using Microsoft.NET.Sdk.Localization; using FXVersion = Microsoft.DotNet.MSBuildSdkResolver.FXVersion; @@ -35,7 +36,7 @@ public static WorkloadResolver Create(IWorkloadManifestProvider manifestProvider new string[] { }; (string path, bool installable)[] workloadRootPaths; - if (userProfileDir != null && WorkloadInstall.IsUserLocal(dotnetRootPath, sdkVersion) && Directory.Exists(userProfileDir)) + if (userProfileDir != null && WorkloadFileBasedInstall.IsUserLocal(dotnetRootPath, sdkVersion) && Directory.Exists(userProfileDir)) { workloadRootPaths = new[] { (userProfileDir, true), (dotnetRootPath, true) }; } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj b/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj index 2544f576330e..3032bc666003 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj +++ b/src/Tasks/Microsoft.NET.Build.Tasks/Microsoft.NET.Build.Tasks.csproj @@ -81,7 +81,7 @@ - + diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs index 74a6ce261ac3..ca87e30899ac 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs @@ -11,6 +11,7 @@ using Microsoft.Build.Utilities; using Microsoft.DotNet.Cli; using Microsoft.DotNet.Configurer; +using Microsoft.DotNet.Workloads.Workload; using Microsoft.NET.Sdk.WorkloadManifestReader; using Newtonsoft.Json; using NuGet.Frameworks; @@ -646,7 +647,7 @@ IEnumerable GetPackFolders() if (!string.IsNullOrEmpty(NetCoreRoot) && !string.IsNullOrEmpty(NETCoreSdkVersion)) { - if (WorkloadInstall.IsUserLocal(NetCoreRoot, NETCoreSdkVersion) && + if (WorkloadFileBasedInstall.IsUserLocal(NetCoreRoot, NETCoreSdkVersion) && CliFolderPathCalculatorCore.GetDotnetUserProfileFolderPath() is { } userProfileDir) { yield return Path.Combine(userProfileDir, "packs"); diff --git a/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs b/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs index 882392aa79ab..6ccccc95879c 100644 --- a/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs +++ b/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs @@ -10,6 +10,7 @@ using FluentAssertions; using ManifestReaderTests; using Microsoft.DotNet.Cli.NuGetPackageDownloader; +using Microsoft.DotNet.Workloads.Workload; using Microsoft.DotNet.Workloads.Workload.Install; using Microsoft.NET.Sdk.WorkloadManifestReader; using Microsoft.NET.TestFramework; @@ -333,7 +334,7 @@ private void SetUserLocal(string dotnetDir, string sdkFeatureBand) Directory.CreateDirectory(workloadMetadataDir); File.WriteAllText(Path.Combine(workloadMetadataDir, "userlocal"), ""); - Assert.True(WorkloadInstall.IsUserLocal(dotnetDir, sdkFeatureBand)); + Assert.True(WorkloadFileBasedInstall.IsUserLocal(dotnetDir, sdkFeatureBand)); } } From c6bbb676b869534e21bb7ee7e67fca245fba879b Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 6 Sep 2021 11:24:58 +0200 Subject: [PATCH 28/32] Refactor GivenDotnetWorkloadInstall --- .../TestAssetsManager.cs | 11 +- .../GivenDotnetWorkloadInstall.cs | 111 ++++++++++-------- 2 files changed, 65 insertions(+), 57 deletions(-) diff --git a/src/Tests/Microsoft.NET.TestFramework/TestAssetsManager.cs b/src/Tests/Microsoft.NET.TestFramework/TestAssetsManager.cs index 3747643af9cd..ea4d572c4d91 100644 --- a/src/Tests/Microsoft.NET.TestFramework/TestAssetsManager.cs +++ b/src/Tests/Microsoft.NET.TestFramework/TestAssetsManager.cs @@ -90,7 +90,7 @@ public TestAsset CreateTestProject( public TestDirectory CreateTestDirectory([CallerMemberName] string testName = null, string identifier = null) { - string dir = GetTestDestinationDirectoryPath(testName, testName, identifier ?? string.Empty, unique: true); + string dir = GetTestDestinationDirectoryPath(testName, testName, identifier ?? string.Empty); return new TestDirectory(dir, TestContext.Current.SdkVersion); } @@ -114,8 +114,7 @@ public static string GetTestDestinationDirectoryPath( string testProjectName, string callingMethodAndFileName, string identifier, - bool allowCopyIfPresent = false, - bool unique = false) + bool allowCopyIfPresent = false) { string baseDirectory = TestContext.Current.TestExecutionDirectory; var directoryName = new StringBuilder(callingMethodAndFileName).Append(identifier); @@ -125,12 +124,6 @@ public static string GetTestDestinationDirectoryPath( directoryName = directoryName.Append(testProjectName); } - if (unique) - { - // avoid collisions between derived test classes using same base method concurrently - directoryName = directoryName.Append(Guid.NewGuid().ToString("N").Substring(0, 8)); - } - // We need to ensure the directory name isn't over 24 characters in length if (directoryName.Length > 24) { diff --git a/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs b/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs index 6ccccc95879c..05e6d10187c8 100644 --- a/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs +++ b/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs @@ -26,15 +26,13 @@ namespace Microsoft.DotNet.Cli.Workload.Install.Tests { - public abstract class GivenDotnetWorkloadInstallBase : SdkTest + public class GivenDotnetWorkloadInstall : SdkTest { private readonly BufferedReporter _reporter; private readonly string _manifestPath; - private readonly bool _userLocal; - protected GivenDotnetWorkloadInstallBase(ITestOutputHelper log, bool userLocal) : base(log) + public GivenDotnetWorkloadInstall(ITestOutputHelper log) : base(log) { - _userLocal = userLocal; _reporter = new BufferedReporter(); _manifestPath = Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleManifest"), "Sample.json"); } @@ -53,12 +51,14 @@ public void GivenWorkloadInstallItErrorsOnFakeWorkloadName() .HaveStdErrContaining(String.Format(Workloads.Workload.Install.LocalizableStrings.WorkloadNotRecognized, "fake")); } - [Fact] - public void GivenWorkloadInstallItCanInstallPacks() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadInstallItCanInstallPacks(bool userLocal) { var mockWorkloadIds = new WorkloadId[] { new WorkloadId("xamarin-android") }; var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "--skip-manifest-update" }); - (_, var installManager, var installer, _, _, _) = GetTestInstallers(parseResult); + (_, var installManager, var installer, _, _, _) = GetTestInstallers(parseResult, userLocal); installManager.InstallWorkloads(mockWorkloadIds, true); @@ -69,12 +69,14 @@ public void GivenWorkloadInstallItCanInstallPacks() installer.InstalledPacks.Where(pack => pack.Id.ToString().Contains("Android")).Count().Should().Be(8); } - [Fact] - public void GivenWorkloadInstallItCanRollBackPackInstallation() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadInstallItCanRollBackPackInstallation(bool userLocal) { var mockWorkloadIds = new WorkloadId[] { new WorkloadId("xamarin-android"), new WorkloadId("xamarin-android-build") }; var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "xamarin-android-build", "--skip-manifest-update" }); - (_, var installManager, var installer, var workloadResolver, _, _) = GetTestInstallers(parseResult, failingWorkload: "xamarin-android-build"); + (_, var installManager, var installer, var workloadResolver, _, _) = GetTestInstallers(parseResult, userLocal, failingWorkload: "xamarin-android-build"); var exceptionThrown = Assert.Throws(() => installManager.InstallWorkloads(mockWorkloadIds, true)); exceptionThrown.Message.Should().Be("Failing workload: xamarin-android-build"); @@ -103,11 +105,13 @@ public void GivenWorkloadInstallOnFailingRollbackItDisplaysTopLevelError() string.Join(" ", _reporter.Lines).Should().Contain("Rollback failure"); } - [Fact] - public void GivenWorkloadInstallItCanUpdateAdvertisingManifests() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadInstallItCanUpdateAdvertisingManifests(bool userLocal) { var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android" }); - (_, var installManager, var installer, _, var manifestUpdater, _) = GetTestInstallers(parseResult); + (_, var installManager, var installer, _, var manifestUpdater, _) = GetTestInstallers(parseResult, userLocal); installManager.InstallWorkloads(new List(), false); // Don't actually do any installs, just update manifests @@ -132,8 +136,10 @@ public void GivenWorkloadInstallItWarnsOnGarbageCollectionFailure() string.Join(" ", _reporter.Lines).Should().Contain("Failing garbage collection"); } - [Fact] - public void GivenWorkloadInstallItCanUpdateInstalledManifests() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadInstallItCanUpdateInstalledManifests(bool userLocal) { var parseResult = Parser.Instance.Parse(new string[] {"dotnet", "workload", "install", "xamarin-android"}); @@ -145,7 +151,7 @@ public void GivenWorkloadInstallItCanUpdateInstalledManifests() null), }; (_, var installManager, var installer, _, _, _) = - GetTestInstallers(parseResult, manifestUpdates: manifestsToUpdate); + GetTestInstallers(parseResult, userLocal, manifestUpdates: manifestsToUpdate); installManager.InstallWorkloads(new List(), false); // Don't actually do any installs, just update manifests @@ -155,8 +161,10 @@ public void GivenWorkloadInstallItCanUpdateInstalledManifests() installer.InstalledManifests[0].offlineCache.Should().Be(null); } - [Fact] - public void GivenWorkloadInstallFromCacheItInstallsCachedManifest() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadInstallFromCacheItInstallsCachedManifest(bool userLocal) { var manifestsToUpdate = new (ManifestId, ManifestVersion, ManifestVersion, Dictionary @@ -165,13 +173,13 @@ public void GivenWorkloadInstallFromCacheItInstallsCachedManifest() (new ManifestId("mock-manifest"), new ManifestVersion("1.0.0"), new ManifestVersion("2.0.0"), null) }; - var cachePath = Path.Combine(_testAssetsManager.CreateTestDirectory(identifier: "mockCache").Path, + var cachePath = Path.Combine(_testAssetsManager.CreateTestDirectory(identifier: AppendForUserLocal("mockCache_", userLocal)).Path, "mockCachePath"); var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "--from-cache", cachePath }); - (_, var installManager, var installer, _, _, _) = GetTestInstallers(parseResult, + (_, var installManager, var installer, _, _, _) = GetTestInstallers(parseResult, userLocal, tempDirManifestPath: _manifestPath, manifestUpdates: manifestsToUpdate); installManager.Execute(); @@ -182,12 +190,14 @@ public void GivenWorkloadInstallFromCacheItInstallsCachedManifest() installer.InstalledManifests[0].offlineCache.Should().Be(new DirectoryPath(cachePath)); } - [Fact] - public void GivenWorkloadInstallItCanDownloadToOfflineCache() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadInstallItCanDownloadToOfflineCache(bool userLocal) { - var cachePath = Path.Combine(_testAssetsManager.CreateTestDirectory(identifier: "mockCache").Path, "mockCachePath"); + var cachePath = Path.Combine(_testAssetsManager.CreateTestDirectory(identifier: AppendForUserLocal("mockCache_", userLocal)).Path, "mockCachePath"); var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "--download-to-cache", cachePath }); - (_, var installManager, var installer, _, var manifestUpdater, _) = GetTestInstallers(parseResult, tempDirManifestPath: _manifestPath); + (_, var installManager, var installer, _, var manifestUpdater, _) = GetTestInstallers(parseResult, userLocal, tempDirManifestPath: _manifestPath); installManager.Execute(); @@ -199,13 +209,15 @@ public void GivenWorkloadInstallItCanDownloadToOfflineCache() installer.CachePath.Should().Be(cachePath); } - [Fact] - public void GivenWorkloadInstallItCanInstallFromOfflineCache() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadInstallItCanInstallFromOfflineCache(bool userLocal) { var mockWorkloadIds = new WorkloadId[] { new WorkloadId("xamarin-android") }; var cachePath = "mockCachePath"; var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "--from-cache", cachePath }); - (_, var installManager, var installer, _, _, var nugetDownloader) = GetTestInstallers(parseResult); + (_, var installManager, var installer, _, _, var nugetDownloader) = GetTestInstallers(parseResult, userLocal); installManager.Execute(); @@ -217,11 +229,13 @@ public void GivenWorkloadInstallItCanInstallFromOfflineCache() nugetDownloader.DownloadCallParams.Count().Should().Be(0); } - [Fact] - public void GivenWorkloadInstallItPrintsDownloadUrls() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadInstallItPrintsDownloadUrls(bool userLocal) { var parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", "xamarin-android", "--print-download-link-only" }); - (_, var installManager, _, _, _, _) = GetTestInstallers(parseResult, tempDirManifestPath: _manifestPath); + (_, var installManager, _, _, _, _) = GetTestInstallers(parseResult, userLocal, tempDirManifestPath: _manifestPath); installManager.Execute(); @@ -248,23 +262,25 @@ public void GivenWorkloadInstallItErrorsOnUnsupportedPlatform() exceptionThrown.Message.Should().Be(String.Format(Workloads.Workload.Install.LocalizableStrings.WorkloadNotSupportedOnPlatform, mockWorkloadId)); } - [Fact] - public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback(bool userLocal) { - var testDirectory = _testAssetsManager.CreateTestDirectory().Path; + var testDirectory = _testAssetsManager.CreateTestDirectory(identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); var userProfileDir = Path.Combine(testDirectory, "user-profile"); var tmpDir = Path.Combine(testDirectory, "tmp"); var manifestPath = Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleManifest"), "MockWorkloadsSample.json"); var workloadResolver = WorkloadResolver.CreateForTests( - new MockManifestProvider(new[] { manifestPath }), _userLocal ? new [] { (userProfileDir, true), (dotnetRoot, true) } : + new MockManifestProvider(new[] { manifestPath }), userLocal ? new [] { (userProfileDir, true), (dotnetRoot, true) } : new [] { (dotnetRoot, true) }); var nugetDownloader = new FailingNuGetPackageDownloader(tmpDir); var manifestUpdater = new MockWorkloadManifestUpdater(); var sdkFeatureVersion = "6.0.100"; var existingWorkload = "mock-1"; var installingWorkload = "mock-2"; - if (_userLocal) + if (userLocal) { SetUserLocal(dotnetRoot, sdkFeatureVersion); } @@ -283,7 +299,7 @@ public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback() exceptionThrown.Message.Should().Contain("Test Failure"); // Existing installation is still present - string installRoot = _userLocal ? userProfileDir : dotnetRoot; + string installRoot = userLocal ? userProfileDir : dotnetRoot; var installRecordPath = Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads"); Directory.GetFiles(installRecordPath).Count().Should().Be(1); File.Exists(Path.Combine(installRecordPath, existingWorkload)) @@ -296,20 +312,21 @@ public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback() private (string, WorkloadInstallCommand, MockPackWorkloadInstaller, IWorkloadResolver, MockWorkloadManifestUpdater, MockNuGetPackageDownloader) GetTestInstallers( ParseResult parseResult, + bool userLocal, [CallerMemberName] string testName = "", string failingWorkload = null, IEnumerable<(ManifestId, ManifestVersion, ManifestVersion, Dictionary Workloads)> manifestUpdates = null, string tempDirManifestPath = null) { _reporter.Clear(); - var testDirectory = _testAssetsManager.CreateTestDirectory(testName: testName).Path; + var testDirectory = _testAssetsManager.CreateTestDirectory(testName: testName, identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); var installer = new MockPackWorkloadInstaller(failingWorkload); var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(manifestUpdates, tempDirManifestPath); string sdkVersion = "6.0.100"; - if (_userLocal) + if (userLocal) { SetUserLocal(dotnetRoot, sdkVersion); } @@ -336,17 +353,15 @@ private void SetUserLocal(string dotnetDir, string sdkFeatureBand) Assert.True(WorkloadFileBasedInstall.IsUserLocal(dotnetDir, sdkFeatureBand)); } - } - public class UserLocalGivenDotnetWorkloadInstall : GivenDotnetWorkloadInstallBase - { - public UserLocalGivenDotnetWorkloadInstall(ITestOutputHelper log) : base(log, userLocal: true) - { } - } + private string AppendForUserLocal(string identifier, bool userLocal) + { + if (!userLocal) + { + return identifier; + } - public class DotnetWorkloadInstall : GivenDotnetWorkloadInstallBase - { - public DotnetWorkloadInstall(ITestOutputHelper log) : base(log, userLocal: false) - { } + return $"{identifier}_userlocal"; + } } } From e4f79a557f5a089dded60e2e29c9ceb2a0388b6b Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 6 Sep 2021 16:14:54 +0200 Subject: [PATCH 29/32] Run more GivenDotnetWorkload tests against userlocal install. --- src/Common/WorkloadFileBasedInstall.cs | 11 +- .../WorkloadResolver.cs | 13 +- .../GivenDotnetWorkloadInstall.cs | 19 +-- .../GivenDotnetWorkloadRepair.cs | 71 +++++++--- .../GivenDotnetWorkloadUninstall.cs | 105 ++++++++++----- .../GivenDotnetWorkloadUpdate.cs | 127 ++++++++++++------ 6 files changed, 225 insertions(+), 121 deletions(-) diff --git a/src/Common/WorkloadFileBasedInstall.cs b/src/Common/WorkloadFileBasedInstall.cs index c35c89165436..c3fdd7e5f078 100644 --- a/src/Common/WorkloadFileBasedInstall.cs +++ b/src/Common/WorkloadFileBasedInstall.cs @@ -8,10 +8,17 @@ namespace Microsoft.DotNet.Workloads.Workload static class WorkloadFileBasedInstall { public static bool IsUserLocal(string dotnetDir, string sdkFeatureBand) + => File.Exists(GetUserInstallFilePath(dotnetDir, sdkFeatureBand)); + + internal static void SetUserLocal(string dotnetDir, string sdkFeatureBand) { - string userlocalPath = Path.Combine(dotnetDir, "metadata", "workloads", sdkFeatureBand, "userlocal"); + string filePath = GetUserInstallFilePath(dotnetDir, sdkFeatureBand); - return File.Exists(userlocalPath); + Directory.CreateDirectory(Path.GetDirectoryName(filePath)!); + File.WriteAllText(filePath, ""); } + + private static string GetUserInstallFilePath(string dotnetDir, string sdkFeatureBand) + => Path.Combine(dotnetDir, "metadata", "workloads", sdkFeatureBand, "userlocal"); } } \ No newline at end of file diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs index 06642c5b0fb8..d6213de41f59 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/WorkloadResolver.cs @@ -54,8 +54,17 @@ public static WorkloadResolver Create(IWorkloadManifestProvider manifestProvider return new WorkloadResolver(manifestProvider, workloadRootPaths, currentRuntimeIdentifiers); } - public static WorkloadResolver CreateForTests(IWorkloadManifestProvider manifestProvider, string dotNetRoot, string[]? currentRuntimeIdentifiers = null) - => CreateForTests(manifestProvider, new (string, bool)[] { (dotNetRoot, true) }, currentRuntimeIdentifiers); + public static WorkloadResolver CreateForTests(IWorkloadManifestProvider manifestProvider, string dotNetRoot, bool userLocal = false, string? userProfileDir = null, string[]? currentRuntimeIdentifiers = null) + { + if (userLocal && userProfileDir is null) + { + throw new ArgumentNullException(nameof(userProfileDir)); + } + (string path, bool installable)[] dotNetRootPaths = userLocal + ? new[] { (userProfileDir!, true), (dotNetRoot, true) } + : new[] { (dotNetRoot, true) }; + return CreateForTests(manifestProvider, dotNetRootPaths, currentRuntimeIdentifiers); + } public static WorkloadResolver CreateForTests(IWorkloadManifestProvider manifestProvider, (string path, bool installable)[] dotNetRootPaths, string[]? currentRuntimeIdentifiers = null) { diff --git a/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs b/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs index 05e6d10187c8..19732a445daa 100644 --- a/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs +++ b/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs @@ -272,17 +272,16 @@ public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback(bool userLo var userProfileDir = Path.Combine(testDirectory, "user-profile"); var tmpDir = Path.Combine(testDirectory, "tmp"); var manifestPath = Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleManifest"), "MockWorkloadsSample.json"); - var workloadResolver = WorkloadResolver.CreateForTests( - new MockManifestProvider(new[] { manifestPath }), userLocal ? new [] { (userProfileDir, true), (dotnetRoot, true) } : - new [] { (dotnetRoot, true) }); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { manifestPath }), dotnetRoot, userLocal, userProfileDir); var nugetDownloader = new FailingNuGetPackageDownloader(tmpDir); var manifestUpdater = new MockWorkloadManifestUpdater(); var sdkFeatureVersion = "6.0.100"; var existingWorkload = "mock-1"; var installingWorkload = "mock-2"; + if (userLocal) { - SetUserLocal(dotnetRoot, sdkFeatureVersion); + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, sdkFeatureVersion); } // Successfully install a workload @@ -328,7 +327,7 @@ public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback(bool userLo string sdkVersion = "6.0.100"; if (userLocal) { - SetUserLocal(dotnetRoot, sdkVersion); + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, sdkVersion); } var installManager = new WorkloadInstallCommand( parseResult, @@ -344,16 +343,6 @@ public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback(bool userLo return (testDirectory, installManager, installer, workloadResolver, manifestUpdater, nugetDownloader); } - private void SetUserLocal(string dotnetDir, string sdkFeatureBand) - { - // Add the userlocal marker file. - string workloadMetadataDir = Path.Combine(dotnetDir, "metadata", "workloads", sdkFeatureBand); - Directory.CreateDirectory(workloadMetadataDir); - File.WriteAllText(Path.Combine(workloadMetadataDir, "userlocal"), ""); - - Assert.True(WorkloadFileBasedInstall.IsUserLocal(dotnetDir, sdkFeatureBand)); - } - private string AppendForUserLocal(string identifier, bool userLocal) { if (!userLocal) diff --git a/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs b/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs index 123b0d0af4c3..0eec02d74d68 100644 --- a/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs +++ b/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs @@ -9,6 +9,7 @@ using System.CommandLine.Parsing; using Microsoft.NET.TestFramework.Utilities; using Microsoft.NET.Sdk.WorkloadManifestReader; +using Microsoft.DotNet.Workloads.Workload; using Microsoft.DotNet.Workloads.Workload.Repair; using System.IO; using ManifestReaderTests; @@ -32,16 +33,24 @@ public GivenDotnetWorkloadRepair(ITestOutputHelper log) : base(log) _manifestPath = Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleManifest"), "Sample.json"); } - [Fact] - public void GivenNoWorkloadsAreInstalledRepairIsNoOp() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenNoWorkloadsAreInstalledRepairIsNoOp(bool userLocal) { _reporter.Clear(); - var testDirectory = _testAssetsManager.CreateTestDirectory().Path; + var testDirectory = _testAssetsManager.CreateTestDirectory(identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot, userLocal, userProfileDir); var sdkFeatureVersion = "6.0.100"; + if (userLocal) + { + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, sdkFeatureVersion); + } + var repairCommand = new WorkloadRepairCommand(_parseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, version: sdkFeatureVersion, dotnetDir: dotnetRoot); repairCommand.Execute(); @@ -49,28 +58,37 @@ public void GivenNoWorkloadsAreInstalledRepairIsNoOp() _reporter.Lines.Should().Contain(LocalizableStrings.NoWorkloadsToRepair); } - [Fact] - public void GivenExtraPacksInstalledRepairGarbageCollects() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenExtraPacksInstalledRepairGarbageCollects(bool userLocal) { - var testDirectory = _testAssetsManager.CreateTestDirectory().Path; + var testDirectory = _testAssetsManager.CreateTestDirectory(identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot, userLocal, userProfileDir); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(); var sdkFeatureVersion = "6.0.100"; var installingWorkload = "xamarin-android"; + string installRoot = userLocal ? userProfileDir : dotnetRoot; + if (userLocal) + { + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, sdkFeatureVersion); + } + // Install a workload var installParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", installingWorkload }); var installCommand = new WorkloadInstallCommand(installParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: userProfileDir, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); installCommand.Execute(); // Add extra pack dirs and records - var extraPackRecordPath = Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1", "Test.Pack.A", "1.0.0", sdkFeatureVersion); + var extraPackRecordPath = Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1", "Test.Pack.A", "1.0.0", sdkFeatureVersion); Directory.CreateDirectory(Path.GetDirectoryName(extraPackRecordPath)); File.WriteAllText(extraPackRecordPath, string.Empty); - var extraPackPath = Path.Combine(dotnetRoot, "packs", "Test.Pack.A", "1.0.0"); + var extraPackPath = Path.Combine(installRoot, "packs", "Test.Pack.A", "1.0.0"); Directory.CreateDirectory(extraPackPath); var repairCommand = new WorkloadRepairCommand(_parseResult, reporter: _reporter, workloadResolver: workloadResolver, @@ -83,31 +101,40 @@ public void GivenExtraPacksInstalledRepairGarbageCollects() Directory.Exists(extraPackPath).Should().BeFalse(); // Expected packs are still present - Directory.GetDirectories(Path.Combine(dotnetRoot, "packs")).Length.Should().Be(7); - Directory.GetDirectories(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1")).Length.Should().Be(8); + Directory.GetDirectories(Path.Combine(installRoot, "packs")).Length.Should().Be(7); + Directory.GetDirectories(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1")).Length.Should().Be(8); } - [Fact] - public void GivenMissingPacksRepairFixesInstall() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenMissingPacksRepairFixesInstall(bool userLocal) { - var testDirectory = _testAssetsManager.CreateTestDirectory().Path; + var testDirectory = _testAssetsManager.CreateTestDirectory(identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot, userLocal, userProfileDir); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(); var sdkFeatureVersion = "6.0.100"; var installingWorkload = "xamarin-android"; + string installRoot = userLocal ? userProfileDir : dotnetRoot; + if (userLocal) + { + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, sdkFeatureVersion); + } + // Install a workload var installParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", installingWorkload }); var installCommand = new WorkloadInstallCommand(installParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: userProfileDir, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); installCommand.Execute(); // Delete pack dirs/ records - var deletedPackRecordPath = Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1", "Xamarin.Android.Sdk", "8.4.7", sdkFeatureVersion); + var deletedPackRecordPath = Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1", "Xamarin.Android.Sdk", "8.4.7", sdkFeatureVersion); File.Delete(deletedPackRecordPath); - var deletedPackPath = Path.Combine(dotnetRoot, "packs", "Xamarin.Android.Sdk"); + var deletedPackPath = Path.Combine(installRoot, "packs", "Xamarin.Android.Sdk"); Directory.Delete(deletedPackPath, true); var repairCommand = new WorkloadRepairCommand(_parseResult, reporter: _reporter, workloadResolver: workloadResolver, @@ -119,8 +146,8 @@ public void GivenMissingPacksRepairFixesInstall() Directory.Exists(deletedPackPath).Should().BeTrue(); // All expected packs are still present - Directory.GetDirectories(Path.Combine(dotnetRoot, "packs")).Length.Should().Be(7); - Directory.GetDirectories(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1")).Length.Should().Be(8); + Directory.GetDirectories(Path.Combine(installRoot, "packs")).Length.Should().Be(7); + Directory.GetDirectories(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1")).Length.Should().Be(8); } } } diff --git a/src/Tests/dotnet-workload-uninstall.Tests/GivenDotnetWorkloadUninstall.cs b/src/Tests/dotnet-workload-uninstall.Tests/GivenDotnetWorkloadUninstall.cs index 499764a93b99..b4fbe4ab059a 100644 --- a/src/Tests/dotnet-workload-uninstall.Tests/GivenDotnetWorkloadUninstall.cs +++ b/src/Tests/dotnet-workload-uninstall.Tests/GivenDotnetWorkloadUninstall.cs @@ -7,6 +7,7 @@ using FluentAssertions; using ManifestReaderTests; using Microsoft.DotNet.Cli.NuGetPackageDownloader; +using Microsoft.DotNet.Workloads.Workload; using Microsoft.DotNet.Workloads.Workload.Install; using Microsoft.NET.Sdk.WorkloadManifestReader; using Microsoft.NET.TestFramework; @@ -39,92 +40,120 @@ public void GivenWorkloadUninstallItErrorsWhenWorkloadIsNotInstalled() exceptionThrown.Message.Should().Contain("mock-1"); } - [Fact] - public void GivenWorkloadUninstallItCanUninstallWorkload() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadUninstallItCanUninstallWorkload(bool userLocal) { - var testDirectory = _testAssetsManager.CreateTestDirectory().Path; + var testDirectory = _testAssetsManager.CreateTestDirectory(identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); var sdkFeatureVersion = "6.0.100"; var installingWorkload = "mock-1"; + string installRoot = userLocal ? userProfileDir : dotnetRoot; + if (userLocal) + { + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, sdkFeatureVersion); + } + InstallWorkload(installingWorkload, testDirectory, sdkFeatureVersion); // Assert install was successful - var installPacks = Directory.GetDirectories(Path.Combine(dotnetRoot, "packs")); + var installPacks = Directory.GetDirectories(Path.Combine(installRoot, "packs")); installPacks.Count().Should().Be(2); - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)) .Should().BeTrue(); - var packRecordDirs = Directory.GetDirectories(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1")); + var packRecordDirs = Directory.GetDirectories(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1")); packRecordDirs.Count().Should().Be(3); UninstallWorkload(installingWorkload, testDirectory, sdkFeatureVersion); // Assert uninstall was successful - installPacks = Directory.GetDirectories(Path.Combine(dotnetRoot, "packs")); + installPacks = Directory.GetDirectories(Path.Combine(installRoot, "packs")); installPacks.Count().Should().Be(0); - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)) .Should().BeFalse(); - packRecordDirs = Directory.GetDirectories(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1")); + packRecordDirs = Directory.GetDirectories(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1")); packRecordDirs.Count().Should().Be(0); } - [Fact] - public void GivenWorkloadUninstallItCanUninstallOnlySpecifiedWorkload() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadUninstallItCanUninstallOnlySpecifiedWorkload(bool userLocal) { - var testDirectory = _testAssetsManager.CreateTestDirectory().Path; + var testDirectory = _testAssetsManager.CreateTestDirectory(identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); var sdkFeatureVersion = "6.0.100"; var installedWorkload = "mock-1"; var uninstallingWorkload = "mock-2"; + string installRoot = userLocal ? userProfileDir : dotnetRoot; + if (userLocal) + { + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, sdkFeatureVersion); + } + InstallWorkload(installedWorkload, testDirectory, sdkFeatureVersion); InstallWorkload(uninstallingWorkload, testDirectory, sdkFeatureVersion); // Assert installs were successful - var installPacks = Directory.GetDirectories(Path.Combine(dotnetRoot, "packs")); + var installPacks = Directory.GetDirectories(Path.Combine(installRoot, "packs")); installPacks.Count().Should().Be(3); - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installedWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installedWorkload)) .Should().BeTrue(); - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", uninstallingWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", uninstallingWorkload)) .Should().BeTrue(); - var packRecordDirs = Directory.GetDirectories(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1")); + var packRecordDirs = Directory.GetDirectories(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1")); packRecordDirs.Count().Should().Be(4); UninstallWorkload(uninstallingWorkload, testDirectory, sdkFeatureVersion); // Assert uninstall was successful, other workload is still installed - installPacks = Directory.GetDirectories(Path.Combine(dotnetRoot, "packs")); + installPacks = Directory.GetDirectories(Path.Combine(installRoot, "packs")); installPacks.Count().Should().Be(2); - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", uninstallingWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", uninstallingWorkload)) .Should().BeFalse(); - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installedWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installedWorkload)) .Should().BeTrue(); - packRecordDirs = Directory.GetDirectories(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1")); + packRecordDirs = Directory.GetDirectories(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1")); packRecordDirs.Count().Should().Be(3); } - [Fact] - public void GivenWorkloadUninstallItCanUninstallOnlySpecifiedFeatureBand() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadUninstallItCanUninstallOnlySpecifiedFeatureBand(bool userLocal) { - var testDirectory = _testAssetsManager.CreateTestDirectory().Path; + var testDirectory = _testAssetsManager.CreateTestDirectory(identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); var prevSdkFeatureVersion = "5.0.100"; var sdkFeatureVersion = "6.0.100"; var uninstallingWorkload = "mock-1"; + string installRoot = userLocal ? userProfileDir : dotnetRoot; + if (userLocal) + { + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, sdkFeatureVersion); + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, prevSdkFeatureVersion); + } + InstallWorkload(uninstallingWorkload, testDirectory, prevSdkFeatureVersion); InstallWorkload(uninstallingWorkload, testDirectory, sdkFeatureVersion); // Assert installs were successful - var installPacks = Directory.GetDirectories(Path.Combine(dotnetRoot, "packs")); + var installPacks = Directory.GetDirectories(Path.Combine(installRoot, "packs")); installPacks.Count().Should().Be(2); - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", prevSdkFeatureVersion, "InstalledWorkloads", uninstallingWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", prevSdkFeatureVersion, "InstalledWorkloads", uninstallingWorkload)) .Should().BeTrue(); - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", uninstallingWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", uninstallingWorkload)) .Should().BeTrue(); - var packRecordDirs = Directory.GetDirectories(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1")); + var packRecordDirs = Directory.GetDirectories(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1")); packRecordDirs.Count().Should().Be(3); - var featureBandMarkerFiles = Directory.GetDirectories(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1")) + var featureBandMarkerFiles = Directory.GetDirectories(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1")) .SelectMany(packIdDirs => Directory.GetDirectories(packIdDirs)) .SelectMany(packVersionDirs => Directory.GetFiles(packVersionDirs)); featureBandMarkerFiles.Count().Should().Be(6); // 3 packs x 2 feature bands @@ -132,36 +161,40 @@ public void GivenWorkloadUninstallItCanUninstallOnlySpecifiedFeatureBand() UninstallWorkload(uninstallingWorkload, testDirectory, sdkFeatureVersion); // Assert uninstall was successful, other workload is still installed - installPacks = Directory.GetDirectories(Path.Combine(dotnetRoot, "packs")); + installPacks = Directory.GetDirectories(Path.Combine(installRoot, "packs")); installPacks.Count().Should().Be(2); - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", uninstallingWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", uninstallingWorkload)) .Should().BeFalse(); - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", prevSdkFeatureVersion, "InstalledWorkloads", uninstallingWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", prevSdkFeatureVersion, "InstalledWorkloads", uninstallingWorkload)) .Should().BeTrue(); - packRecordDirs = Directory.GetDirectories(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1")); + packRecordDirs = Directory.GetDirectories(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1")); packRecordDirs.Count().Should().Be(3); } private void InstallWorkload(string installingWorkload, string testDirectory, string sdkFeatureVersion) { var dotnetRoot = Path.Combine(testDirectory, "dotnet"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); + bool userLocal = WorkloadFileBasedInstall.IsUserLocal(dotnetRoot, sdkFeatureVersion); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot, userLocal, userProfileDir); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(); var installParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", installingWorkload }); var installCommand = new WorkloadInstallCommand(installParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: userProfileDir, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); installCommand.Execute(); } private void UninstallWorkload(string uninstallingWorkload, string testDirectory, string sdkFeatureVersion) { var dotnetRoot = Path.Combine(testDirectory, "dotnet"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); + bool userLocal = WorkloadFileBasedInstall.IsUserLocal(dotnetRoot, sdkFeatureVersion); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot, userLocal, userProfileDir); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var uninstallParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "uninstall", uninstallingWorkload }); var uninstallCommand = new WorkloadUninstallCommand(uninstallParseResult, reporter: _reporter, workloadResolver, nugetDownloader, - dotnetDir: dotnetRoot, version: sdkFeatureVersion); + dotnetDir: dotnetRoot, version: sdkFeatureVersion, userProfileDir: userProfileDir); uninstallCommand.Execute(); } } diff --git a/src/Tests/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs b/src/Tests/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs index 8059ef61ad0d..edd4834c8985 100644 --- a/src/Tests/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs +++ b/src/Tests/dotnet-workload-update.Tests/GivenDotnetWorkloadUpdate.cs @@ -9,6 +9,7 @@ using FluentAssertions; using ManifestReaderTests; using Microsoft.DotNet.Cli.NuGetPackageDownloader; +using Microsoft.DotNet.Workloads.Workload; using Microsoft.DotNet.Workloads.Workload.Install; using Microsoft.NET.Sdk.WorkloadManifestReader; using Microsoft.NET.TestFramework; @@ -37,38 +38,47 @@ public GivenDotnetWorkloadUpdate(ITestOutputHelper log) : base(log) _parseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update" }); } - [Fact] - public void GivenWorkloadUpdateItRemovesOldPacksAfterInstall() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadUpdateItRemovesOldPacksAfterInstall(bool userLocal) { - var testDirectory = _testAssetsManager.CreateTestDirectory().Path; + var testDirectory = _testAssetsManager.CreateTestDirectory(identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot, userLocal, userProfileDir); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(); var sdkFeatureVersion = "6.0.100"; var installingWorkload = "xamarin-android"; + string installRoot = userLocal ? userProfileDir : dotnetRoot; + if (userLocal) + { + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, sdkFeatureVersion); + } + // Install a workload var installParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "install", installingWorkload }); var installCommand = new WorkloadInstallCommand(installParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: userProfileDir, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); installCommand.Execute(); // 7 packs in packs dir, 1 template pack - var installPacks = Directory.GetDirectories(Path.Combine(dotnetRoot, "packs")); + var installPacks = Directory.GetDirectories(Path.Combine(installRoot, "packs")); installPacks.Count().Should().Be(7); foreach (var packDir in installPacks) { Directory.GetDirectories(packDir).Count().Should().Be(1); // 1 version of each pack installed } - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1", "Xamarin.Android.Sdk", "8.4.7", "6.0.100")) // Original pack version is installed + File.Exists(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1", "Xamarin.Android.Sdk", "8.4.7", "6.0.100")) // Original pack version is installed .Should().BeTrue(); - File.Exists(Path.Combine(dotnetRoot, "template-packs", "xamarin.android.templates.1.0.3.nupkg")) + File.Exists(Path.Combine(installRoot, "template-packs", "xamarin.android.templates.1.0.3.nupkg")) .Should().BeTrue(); // Install records are correct - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)) .Should().BeTrue(); - var packRecordDirs = Directory.GetDirectories(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1")); + var packRecordDirs = Directory.GetDirectories(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1")); packRecordDirs.Count().Should().Be(8); foreach (var packRecordDir in packRecordDirs) { @@ -80,29 +90,29 @@ public void GivenWorkloadUpdateItRemovesOldPacksAfterInstall() // Mock updating the manifest workloadResolver = WorkloadResolver.CreateForTests( new MockManifestProvider(new[] { Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleUpdatedManifest"), "Sample.json") }), - dotnetRoot); + dotnetRoot, userLocal, userProfileDir); // Update workload var updateParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update" }); var updateCommand = new WorkloadUpdateCommand(updateParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: userProfileDir, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); updateCommand.Execute(); // 6 packs in packs dir, 1 template pack - var updatePacks = Directory.GetDirectories(Path.Combine(dotnetRoot, "packs")); + var updatePacks = Directory.GetDirectories(Path.Combine(installRoot, "packs")); updatePacks.Count().Should().Be(6); foreach (var packDir in updatePacks) { Directory.GetDirectories(packDir).Count().Should().Be(1); // 1 version of each pack installed } - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1", "Xamarin.Android.Sdk", "8.5.7", "6.0.100")) // New pack version is installed + File.Exists(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1", "Xamarin.Android.Sdk", "8.5.7", "6.0.100")) // New pack version is installed .Should().BeTrue(); - File.Exists(Path.Combine(dotnetRoot, "template-packs", "xamarin.android.templates.2.1.3.nupkg")) + File.Exists(Path.Combine(installRoot, "template-packs", "xamarin.android.templates.2.1.3.nupkg")) .Should().BeTrue(); // Install records are correct - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)) .Should().BeTrue(); - packRecordDirs = Directory.GetDirectories(Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1")); + packRecordDirs = Directory.GetDirectories(Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1")); packRecordDirs.Count().Should().Be(7); foreach (var packRecordDir in packRecordDirs) { @@ -112,50 +122,60 @@ public void GivenWorkloadUpdateItRemovesOldPacksAfterInstall() } } - [Fact] - public void GivenWorkloadUpdateAcrossFeatureBandsItUpdatesPacks() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadUpdateAcrossFeatureBandsItUpdatesPacks(bool userLocal) { - var testDirectory = _testAssetsManager.CreateTestDirectory().Path; + var testDirectory = _testAssetsManager.CreateTestDirectory(identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); var manifestPath = Path.Combine(_testAssetsManager.GetAndValidateTestProjectDirectory("SampleManifest"), "BasicSample.json"); - var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { manifestPath }), dotnetRoot); + var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { manifestPath }), dotnetRoot, userLocal, userProfileDir); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); var manifestUpdater = new MockWorkloadManifestUpdater(); var sdkFeatureVersion = "6.0.100"; var installingWorkload = "simple-workload"; + + string installRoot = userLocal ? userProfileDir : dotnetRoot; + if (userLocal) + { + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, sdkFeatureVersion); + } + var workloadPacks = new List() { - CreatePackInfo("mock-pack-1", "1.0.0", WorkloadPackKind.Framework, Path.Combine(dotnetRoot, "packs", "mock-pack-1", "1.0.0"), "mock-pack-1"), - CreatePackInfo("mock-pack-2", "2.0.0", WorkloadPackKind.Framework, Path.Combine(dotnetRoot, "packs", "mock-pack-2", "2.0.0"), "mock-pack-2") + CreatePackInfo("mock-pack-1", "1.0.0", WorkloadPackKind.Framework, Path.Combine(installRoot, "packs", "mock-pack-1", "1.0.0"), "mock-pack-1"), + CreatePackInfo("mock-pack-2", "2.0.0", WorkloadPackKind.Framework, Path.Combine(installRoot, "packs", "mock-pack-2", "2.0.0"), "mock-pack-2") }; // Lay out workload installs for a previous feature band var oldFeatureBand = "5.0.100"; - var packRecordDir = Path.Combine(dotnetRoot, "metadata", "workloads", "InstalledPacks", "v1"); + var packRecordDir = Path.Combine(installRoot, "metadata", "workloads", "InstalledPacks", "v1"); foreach (var pack in workloadPacks) { Directory.CreateDirectory(Path.Combine(packRecordDir, pack.Id, pack.Version)); File.Create(Path.Combine(packRecordDir, pack.Id, pack.Version, oldFeatureBand)); } - Directory.CreateDirectory(Path.Combine(dotnetRoot, "metadata", "workloads", oldFeatureBand, "InstalledWorkloads")); - Directory.CreateDirectory(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads")); - File.Create(Path.Combine(dotnetRoot, "metadata", "workloads", oldFeatureBand, "InstalledWorkloads", installingWorkload)); - File.Create(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)); + Directory.CreateDirectory(Path.Combine(installRoot, "metadata", "workloads", oldFeatureBand, "InstalledWorkloads")); + Directory.CreateDirectory(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads")); + File.Create(Path.Combine(installRoot, "metadata", "workloads", oldFeatureBand, "InstalledWorkloads", installingWorkload)); + File.Create(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)); // Update workload (without installing any workloads to this feature band) var updateParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--from-previous-sdk" }); var updateCommand = new WorkloadUpdateCommand(updateParseResult, reporter: _reporter, workloadResolver: workloadResolver, nugetPackageDownloader: nugetDownloader, - workloadManifestUpdater: manifestUpdater, userProfileDir: testDirectory, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); + workloadManifestUpdater: manifestUpdater, userProfileDir: userProfileDir, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); updateCommand.Execute(); foreach (var pack in workloadPacks) { - Directory.Exists(pack.Path).Should().BeTrue(because: "Pack should be installed"); + Directory.Exists(pack.Path).Should().BeTrue(because: $"Pack should be installed {testDirectory}"); File.Exists(Path.Combine(packRecordDir, pack.Id, pack.Version, oldFeatureBand)) .Should().BeTrue(because: "Pack install record should still be present for old feature band"); } - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", oldFeatureBand, "InstalledWorkloads", installingWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", oldFeatureBand, "InstalledWorkloads", installingWorkload)) .Should().BeTrue(because: "Workload install record should still be present for old feature band"); - File.Exists(Path.Combine(dotnetRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)) + File.Exists(Path.Combine(installRoot, "metadata", "workloads", sdkFeatureVersion, "InstalledWorkloads", installingWorkload)) .Should().BeTrue(because: "Workload install record should be present for current feature band"); } @@ -244,27 +264,46 @@ public void GivenWorkloadUpdateItPrintsDownloadUrls() string.Join(" ", _reporter.Lines).Should().Contain("mock-manifest-url"); } - [Fact] - public void GivenWorkloadUpdateAcrossFeatureBandsItErrorsWhenManifestsDoNotExist() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadUpdateAcrossFeatureBandsItErrorsWhenManifestsDoNotExist(bool userLocal) { - var testDirectory = _testAssetsManager.CreateTestDirectory().Path; + var testDirectory = _testAssetsManager.CreateTestDirectory(identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); - var updateParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--sdk-version", "7.0.100" }); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); + var sdkFeatureVersion = "7.0.100"; + var updateParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--sdk-version", sdkFeatureVersion }); + + if (userLocal) + { + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, sdkFeatureVersion); + } - var exceptionThrown = Assert.Throws(() => new WorkloadUpdateCommand(updateParseResult, reporter: _reporter, dotnetDir: dotnetRoot)); + var exceptionThrown = Assert.Throws(() => new WorkloadUpdateCommand(updateParseResult, reporter: _reporter, dotnetDir: dotnetRoot, userProfileDir: userProfileDir)); exceptionThrown.Message.Should().Contain("No manifests exist"); } - [Fact] - public void GivenWorkloadUpdateAcrossFeatureBandsItErrorsWhenUnableToReadManifest() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GivenWorkloadUpdateAcrossFeatureBandsItErrorsWhenUnableToReadManifest(bool userLocal) { - var testDirectory = _testAssetsManager.CreateTestDirectory().Path; + var testDirectory = _testAssetsManager.CreateTestDirectory(identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); - var updateParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--sdk-version", "7.0.100" }); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); + var sdkFeatureVersion = "7.0.100"; + var updateParseResult = Parser.Instance.Parse(new string[] { "dotnet", "workload", "update", "--sdk-version", sdkFeatureVersion }); + + string installRoot = userLocal ? userProfileDir : dotnetRoot; + if (userLocal) + { + WorkloadFileBasedInstall.SetUserLocal(dotnetRoot, sdkFeatureVersion); + } // Write manifest of "new" format that we don't recognize - Directory.CreateDirectory(Path.Combine(dotnetRoot, "sdk-manifests", "7.0.100", "mock.workload")); - File.WriteAllText(Path.Combine(dotnetRoot, "sdk-manifests", "7.0.100", "mock.workload", "WorkloadManifest.json"), @"{ + Directory.CreateDirectory(Path.Combine(installRoot, "sdk-manifests", "7.0.100", "mock.workload")); + File.WriteAllText(Path.Combine(installRoot, "sdk-manifests", "7.0.100", "mock.workload", "WorkloadManifest.json"), @"{ ""version"": 1, ""workloads"": { ""mock.workload"": { @@ -274,7 +313,7 @@ public void GivenWorkloadUpdateAcrossFeatureBandsItErrorsWhenUnableToReadManifes } "); - var exceptionThrown = Assert.Throws(() => new WorkloadUpdateCommand(updateParseResult, reporter: _reporter, dotnetDir: dotnetRoot)); + var exceptionThrown = Assert.Throws(() => new WorkloadUpdateCommand(updateParseResult, reporter: _reporter, dotnetDir: dotnetRoot, userProfileDir: userProfileDir)); exceptionThrown.Message.Should().Contain(string.Format(Workloads.Workload.Install.LocalizableStrings.IncompatibleManifests, "7.0.100")); } From f7ce05f0dcf72ee86a4acb27975846875f843251 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 6 Sep 2021 17:01:40 +0200 Subject: [PATCH 30/32] GivenDotnetWorkload*: pass userProfileDir into Command ctors. --- .../GivenDotnetWorkloadInstall.cs | 3 ++- .../GivenDotnetWorkloadRepair.cs | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs b/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs index 19732a445daa..50790e432aa9 100644 --- a/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs +++ b/src/Tests/dotnet-workload-install.Tests/GivenDotnetWorkloadInstall.cs @@ -320,6 +320,7 @@ public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback(bool userLo _reporter.Clear(); var testDirectory = _testAssetsManager.CreateTestDirectory(testName: testName, identifier: userLocal ? "userlocal" : "default").Path; var dotnetRoot = Path.Combine(testDirectory, "dotnet"); + var userProfileDir = Path.Combine(testDirectory, "user-profile"); var installer = new MockPackWorkloadInstaller(failingWorkload); var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot); var nugetDownloader = new MockNuGetPackageDownloader(dotnetRoot); @@ -336,7 +337,7 @@ public void GivenWorkloadInstallItDoesNotRemoveOldInstallsOnRollback(bool userLo workloadInstaller: installer, nugetPackageDownloader: nugetDownloader, workloadManifestUpdater: manifestUpdater, - userProfileDir: testDirectory, + userProfileDir: userProfileDir, dotnetDir: dotnetRoot, version: "6.0.100"); diff --git a/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs b/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs index 0eec02d74d68..6d23e38386b2 100644 --- a/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs +++ b/src/Tests/dotnet-workload-repair.Tests/GivenDotnetWorkloadRepair.cs @@ -52,7 +52,7 @@ public void GivenNoWorkloadsAreInstalledRepairIsNoOp(bool userLocal) } var repairCommand = new WorkloadRepairCommand(_parseResult, reporter: _reporter, workloadResolver: workloadResolver, - nugetPackageDownloader: nugetDownloader, version: sdkFeatureVersion, dotnetDir: dotnetRoot); + nugetPackageDownloader: nugetDownloader, version: sdkFeatureVersion, dotnetDir: dotnetRoot, userProfileDir: userProfileDir); repairCommand.Execute(); _reporter.Lines.Should().Contain(LocalizableStrings.NoWorkloadsToRepair); @@ -91,7 +91,7 @@ public void GivenExtraPacksInstalledRepairGarbageCollects(bool userLocal) var extraPackPath = Path.Combine(installRoot, "packs", "Test.Pack.A", "1.0.0"); Directory.CreateDirectory(extraPackPath); - var repairCommand = new WorkloadRepairCommand(_parseResult, reporter: _reporter, workloadResolver: workloadResolver, + var repairCommand = new WorkloadRepairCommand(_parseResult, reporter: _reporter, workloadResolver: workloadResolver, userProfileDir: userProfileDir, nugetPackageDownloader: nugetDownloader, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); repairCommand.Execute(); @@ -137,7 +137,7 @@ public void GivenMissingPacksRepairFixesInstall(bool userLocal) var deletedPackPath = Path.Combine(installRoot, "packs", "Xamarin.Android.Sdk"); Directory.Delete(deletedPackPath, true); - var repairCommand = new WorkloadRepairCommand(_parseResult, reporter: _reporter, workloadResolver: workloadResolver, + var repairCommand = new WorkloadRepairCommand(_parseResult, reporter: _reporter, workloadResolver: workloadResolver, userProfileDir: userProfileDir, nugetPackageDownloader: nugetDownloader, version: sdkFeatureVersion, dotnetDir: dotnetRoot, tempDirPath: testDirectory); repairCommand.Execute(); From 9f1a39b8a2eaf3b3880fc3e6b5f25e6c298f8a41 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 6 Sep 2021 18:40:15 +0200 Subject: [PATCH 31/32] Fix compilation --- .../ManifestTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestTests.cs b/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestTests.cs index 5fa9b3d2b16c..6dc893e114b2 100644 --- a/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestTests.cs +++ b/src/Tests/Microsoft.NET.Sdk.WorkloadManifestReader.Tests/ManifestTests.cs @@ -67,7 +67,7 @@ public void AliasedPackPath() public void UnresolvedAliasedPackPath() { var manifestProvider = new FakeManifestProvider(ManifestPath); - var resolver = WorkloadResolver.CreateForTests(manifestProvider, fakeRootPath, new[] { "fake-platform" }); + var resolver = WorkloadResolver.CreateForTests(manifestProvider, fakeRootPath, currentRuntimeIdentifiers: new[] { "fake-platform" }); resolver.ReplaceFilesystemChecksForTest(_ => true, _ => true); From 25fcd8f30559b29a846fff5bd48375085c6cdc6e Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Tue, 7 Sep 2021 11:33:15 +0200 Subject: [PATCH 32/32] Always use sdk feature band for user local detection. --- src/Common/WorkloadFileBasedInstall.cs | 21 ++++++++++++++++++- .../SdkDirectoryWorkloadManifestProvider.cs | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/Common/WorkloadFileBasedInstall.cs b/src/Common/WorkloadFileBasedInstall.cs index c3fdd7e5f078..f0d82c1fa9a5 100644 --- a/src/Common/WorkloadFileBasedInstall.cs +++ b/src/Common/WorkloadFileBasedInstall.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. +using System; using System.IO; namespace Microsoft.DotNet.Workloads.Workload @@ -19,6 +20,24 @@ internal static void SetUserLocal(string dotnetDir, string sdkFeatureBand) } private static string GetUserInstallFilePath(string dotnetDir, string sdkFeatureBand) - => Path.Combine(dotnetDir, "metadata", "workloads", sdkFeatureBand, "userlocal"); + { + if (sdkFeatureBand.Contains("-")) + { + // The user passed in the sdk version. Derive the feature band version. + if (!Version.TryParse(sdkFeatureBand.Split('-')[0], out var sdkVersionParsed)) + { + throw new FormatException($"'{nameof(sdkFeatureBand)}' should be a version, but get {sdkFeatureBand}"); + } + + static int Last2DigitsTo0(int versionBuild) + { + return (versionBuild / 100) * 100; + } + + sdkFeatureBand = $"{sdkVersionParsed.Major}.{sdkVersionParsed.Minor}.{Last2DigitsTo0(sdkVersionParsed.Build)}"; + } + + return Path.Combine(dotnetDir, "metadata", "workloads", sdkFeatureBand, "userlocal"); + } } } \ No newline at end of file diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs index 80157b0f724b..3265bf2e0e6d 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/SdkDirectoryWorkloadManifestProvider.cs @@ -63,7 +63,7 @@ static int Last2DigitsTo0(int versionBuild) string? userManifestsDir = userProfileDir is null ? null : Path.Combine(userProfileDir, "sdk-manifests", _sdkVersionBand); string dotnetManifestDir = Path.Combine(_sdkRootPath, "sdk-manifests", _sdkVersionBand); - if (userManifestsDir != null && WorkloadFileBasedInstall.IsUserLocal(_sdkRootPath, sdkVersion) && Directory.Exists(userManifestsDir)) + if (userManifestsDir != null && WorkloadFileBasedInstall.IsUserLocal(_sdkRootPath, _sdkVersionBand) && Directory.Exists(userManifestsDir)) { _manifestDirectories = new[] { userManifestsDir, dotnetManifestDir }; }