diff --git a/src/Cli/dotnet/commands/InstallingWorkloadCommand.cs b/src/Cli/dotnet/commands/InstallingWorkloadCommand.cs index 966e7301993d..d8df4fb955aa 100644 --- a/src/Cli/dotnet/commands/InstallingWorkloadCommand.cs +++ b/src/Cli/dotnet/commands/InstallingWorkloadCommand.cs @@ -37,6 +37,7 @@ internal abstract class InstallingWorkloadCommand : WorkloadCommandBase protected readonly string _userProfileDir; protected readonly bool _checkIfManifestExist; protected readonly ReleaseVersion _sdkVersion; + protected readonly ReleaseVersion _installedSdkVersion; protected readonly SdkFeatureBand _sdkFeatureBand; protected readonly SdkFeatureBand _installedFeatureBand; protected readonly string _fromRollbackDefinition; @@ -70,8 +71,8 @@ public InstallingWorkloadCommand( _checkIfManifestExist = !(_printDownloadLinkOnly); // don't check for manifest existence when print download link is passed _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.GetValueForOption(InstallingWorkloadCommandParser.VersionOption), version, _dotnetPath, _userProfileDir, _checkIfManifestExist); _sdkFeatureBand = new SdkFeatureBand(_sdkVersion); - - _installedFeatureBand = installedFeatureBand == null ? new SdkFeatureBand(Product.Version) : new SdkFeatureBand(installedFeatureBand); + _installedSdkVersion = new ReleaseVersion(version ?? Product.Version); + _installedFeatureBand = new SdkFeatureBand(installedFeatureBand ?? Product.Version); _fromRollbackDefinition = parseResult.GetValueForOption(InstallingWorkloadCommandParser.FromRollbackFileOption); var configOption = parseResult.GetValueForOption(InstallingWorkloadCommandParser.ConfigOption); @@ -79,8 +80,8 @@ public InstallingWorkloadCommand( _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(), userProfileDir); - _workloadResolver = workloadResolver ?? WorkloadResolver.Create(sdkWorkloadManifestProvider, _dotnetPath, _sdkVersion.ToString(), _userProfileDir); + var sdkWorkloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(_dotnetPath, _installedSdkVersion.ToString(), userProfileDir); + _workloadResolver = workloadResolver ?? WorkloadResolver.Create(sdkWorkloadManifestProvider, _dotnetPath, _installedSdkVersion.ToString(), _userProfileDir); _workloadInstallerFromConstructor = workloadInstaller; _workloadManifestUpdaterFromConstructor = workloadManifestUpdater; @@ -109,7 +110,7 @@ protected async Task> GetDownloads(IEnumerable> GetDownloads(IEnumerable Workloads IEnumerable CalculateManifestRollbacks(string rollbackDefinitionFilePath); - Task> GetManifestPackageDownloadsAsync(bool includePreviews); + Task> GetManifestPackageDownloadsAsync(bool includePreviews, SdkFeatureBand providedSdkFeatureBand, SdkFeatureBand installedSdkFeatureBand); IEnumerable GetUpdatableWorkloadsToAdvertise(IEnumerable installedWorkloads); diff --git a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs index d54859fd240b..5a86a6959356 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/install/WorkloadManifestUpdater.cs @@ -46,14 +46,15 @@ public WorkloadManifestUpdater(IReporter reporter, IWorkloadManifestInstaller workloadManifestInstaller, PackageSourceLocation packageSourceLocation = null, Func getEnvironmentVariable = null, - bool displayManifestUpdates = true) + bool displayManifestUpdates = true, + SdkFeatureBand? sdkFeatureBand = null) { _reporter = reporter; _workloadResolver = workloadResolver; _userProfileDir = userProfileDir; _tempDirPath = tempDirPath; _nugetPackageDownloader = nugetPackageDownloader; - _sdkFeatureBand = new SdkFeatureBand(_workloadResolver.GetSdkFeatureBand()); + _sdkFeatureBand = sdkFeatureBand ?? new SdkFeatureBand(_workloadResolver.GetSdkFeatureBand()); _packageSourceLocation = packageSourceLocation; _getEnvironmentVariable = getEnvironmentVariable ?? Environment.GetEnvironmentVariable; _workloadRecordRepo = workloadRecordRepo; @@ -239,29 +240,26 @@ public IEnumerable CalculateManifestRollbacks(string roll } - public async Task> GetManifestPackageDownloadsAsync(bool includePreviews) + public async Task> GetManifestPackageDownloadsAsync(bool includePreviews, SdkFeatureBand providedSdkFeatureBand, SdkFeatureBand installedSdkFeatureBand) { - var packageIds = GetInstalledManifestIds() - .Select(manifestId => _workloadManifestInstaller.GetManifestPackageId(manifestId, _sdkFeatureBand)); - var downloads = new List(); foreach (var manifest in _workloadResolver.GetInstalledManifests()) { try { - - var packageId = _workloadManifestInstaller.GetManifestPackageId(new ManifestId(manifest.Id), _sdkFeatureBand); + var packageId = _workloadManifestInstaller.GetManifestPackageId(new ManifestId(manifest.Id), providedSdkFeatureBand); bool success; + // After checking the --sdk-version, check the current sdk band, and then the manifest band in that order (success, var latestVersion) = await GetPackageVersion(packageId, packageSourceLocation: _packageSourceLocation, includePreview: includePreviews); if (success) { downloads.Add(new WorkloadDownload(manifest.Id, packageId.ToString(), latestVersion.ToString())); } - if (!success) + + if (!success && !installedSdkFeatureBand.Equals(providedSdkFeatureBand)) { - var newFeatureBand = new SdkFeatureBand(manifest.ManifestFeatureBand); - var newPackageId = _workloadManifestInstaller.GetManifestPackageId(new ManifestId(manifest.Id), newFeatureBand); + var newPackageId = _workloadManifestInstaller.GetManifestPackageId(new ManifestId(manifest.Id), installedSdkFeatureBand); (success, latestVersion) = await GetPackageVersion(newPackageId, packageSourceLocation: _packageSourceLocation, includePreview: includePreviews); @@ -270,6 +268,18 @@ public async Task> GetManifestPackageDownloadsAsyn downloads.Add(new WorkloadDownload(manifest.Id, newPackageId.ToString(), latestVersion.ToString())); } } + var fallbackFeatureBand = new SdkFeatureBand(manifest.ManifestFeatureBand); + if (!success && !fallbackFeatureBand.Equals(installedSdkFeatureBand)) + { + var newPackageId = _workloadManifestInstaller.GetManifestPackageId(new ManifestId(manifest.Id), fallbackFeatureBand); + + (success, latestVersion) = await GetPackageVersion(newPackageId, packageSourceLocation: _packageSourceLocation, includePreview: includePreviews); + + if (success) + { + downloads.Add(new WorkloadDownload(manifest.Id, newPackageId.ToString(), latestVersion.ToString())); + } + } if (!success) { _reporter.WriteLine(string.Format(LocalizableStrings.ManifestPackageUrlNotResolved, packageId)); diff --git a/src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs b/src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs index 8cc2e0955f18..8dc4c083834c 100644 --- a/src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs +++ b/src/Cli/dotnet/commands/dotnet-workload/update/WorkloadUpdateCommand.cs @@ -57,7 +57,7 @@ public WorkloadUpdateCommand( elevationRequired: !_printDownloadLinkOnly && !_printRollbackDefinitionOnly && string.IsNullOrWhiteSpace(_downloadToCacheOption)); _workloadManifestUpdater = _workloadManifestUpdaterFromConstructor ?? new WorkloadManifestUpdater(Reporter, workloadResolver ?? _workloadResolver, PackageDownloader, _userProfileDir, TempDirectoryPath, - _workloadInstaller.GetWorkloadInstallationRecordRepository(), _workloadInstaller, _packageSourceLocation); + _workloadInstaller.GetWorkloadInstallationRecordRepository(), _workloadInstaller, _packageSourceLocation, sdkFeatureBand: _sdkFeatureBand); } diff --git a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/TempDirectoryWorkloadManifestProvider.cs b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/TempDirectoryWorkloadManifestProvider.cs index d645988b9c7d..6ae5e948fb6c 100644 --- a/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/TempDirectoryWorkloadManifestProvider.cs +++ b/src/Resolvers/Microsoft.NET.Sdk.WorkloadManifestReader/TempDirectoryWorkloadManifestProvider.cs @@ -13,10 +13,10 @@ public class TempDirectoryWorkloadManifestProvider : IWorkloadManifestProvider private readonly string _manifestsPath; private readonly string _sdkVersionBand; - public TempDirectoryWorkloadManifestProvider(string manifestsPath, string sdkVersion) + public TempDirectoryWorkloadManifestProvider(string manifestsPath, string sdkFeatureBand) { _manifestsPath = manifestsPath; - _sdkVersionBand = sdkVersion; + _sdkVersionBand = sdkFeatureBand; } public IEnumerable diff --git a/src/Tests/dotnet-workload-install.Tests/MockWorkloadManifestUpdater.cs b/src/Tests/dotnet-workload-install.Tests/MockWorkloadManifestUpdater.cs index 226fab2d1a66..72eb7c2c8b97 100644 --- a/src/Tests/dotnet-workload-install.Tests/MockWorkloadManifestUpdater.cs +++ b/src/Tests/dotnet-workload-install.Tests/MockWorkloadManifestUpdater.cs @@ -43,7 +43,7 @@ public Task UpdateAdvertisingManifestsAsync(bool includePreview, DirectoryPath? return _manifestUpdates; } - public Task> GetManifestPackageDownloadsAsync(bool includePreviews) + public Task> GetManifestPackageDownloadsAsync(bool includePreviews, SdkFeatureBand providedSdkFeatureBand, SdkFeatureBand installedSdkFeatureBand) { GetManifestPackageDownloadsCallCount++; return Task.FromResult>(new List()