Skip to content

Commit dfaa9c5

Browse files
authored
Add "not installed" and other messages for workloads (#43472)
2 parents 0e33d06 + b7dcdeb commit dfaa9c5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+351
-101
lines changed

src/Cli/dotnet/Installer/Windows/InstallMessageDispatcher.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ public InstallResponseMessage SendGetGlobalJsonWorkloadSetVersionsRequest(SdkFea
224224
{
225225
return Send(new InstallRequestMessage
226226
{
227-
RequestType = InstallRequestType.RecordWorkloadSetInGlobalJson,
227+
RequestType = InstallRequestType.GetGlobalJsonWorkloadSetVersions,
228228
SdkFeatureBand = sdkFeatureBand.ToString(),
229229
});
230230
}

src/Cli/dotnet/commands/dotnet-workload/WorkloadCommandParser.cs

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ internal static string GetWorkloadsVersion(WorkloadInfoHelper workloadInfoHelper
4545
{
4646
workloadInfoHelper ??= new WorkloadInfoHelper(false);
4747

48-
return workloadInfoHelper.ManifestProvider.GetWorkloadVersion();
48+
var versionInfo = workloadInfoHelper.ManifestProvider.GetWorkloadVersion();
49+
50+
// The explicit space here is intentional, as it's easy to miss in localization and crucial for parsing
51+
return versionInfo.Version + (versionInfo.VersionNotInstalledMessage is not null ? ' ' + Workloads.Workload.List.LocalizableStrings.WorkloadVersionNotInstalledShort : string.Empty);
4952
}
5053

5154
internal static void ShowWorkloadsInfo(ParseResult parseResult = null, WorkloadInfoHelper workloadInfoHelper = null, IReporter reporter = null, string dotnetDir = null, bool showVersion = true)
@@ -56,46 +59,68 @@ internal static void ShowWorkloadsInfo(ParseResult parseResult = null, WorkloadI
5659
reporter ??= Utils.Reporter.Output;
5760
string dotnetPath = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath);
5861

62+
63+
64+
var versionInfo = workloadInfoHelper.ManifestProvider.GetWorkloadVersion();
65+
66+
void WriteUpdateModeAndAnyError(string indent = "")
67+
{
68+
var useWorkloadSets = InstallStateContents.FromPath(Path.Combine(WorkloadInstallType.GetInstallStateFolder(workloadInfoHelper._currentSdkFeatureBand, workloadInfoHelper.UserLocalPath), "default.json")).UseWorkloadSets;
69+
var workloadSetsString = useWorkloadSets == true ? "workload sets" : "loose manifests";
70+
reporter.WriteLine(indent + string.Format(CommonStrings.WorkloadManifestInstallationConfiguration, workloadSetsString));
71+
72+
var additionalMessage = versionInfo.VersionNotInstalledMessage ?? versionInfo.UpdateModeMessage;
73+
if (additionalMessage != null)
74+
{
75+
reporter.WriteLine(indent + additionalMessage);
76+
}
77+
}
78+
5979
if (showVersion)
6080
{
61-
reporter.WriteLine($" Workload version: {workloadInfoHelper.ManifestProvider.GetWorkloadVersion()}");
81+
reporter.WriteLine($" Workload version: {GetWorkloadsVersion()}");
82+
83+
WriteUpdateModeAndAnyError(indent: " ");
84+
reporter.WriteLine();
6285
}
6386

64-
var useWorkloadSets = InstallStateContents.FromPath(Path.Combine(WorkloadInstallType.GetInstallStateFolder(workloadInfoHelper._currentSdkFeatureBand, workloadInfoHelper.UserLocalPath), "default.json")).UseWorkloadSets;
65-
var workloadSetsString = useWorkloadSets == true ? "workload sets" : "loose manifests";
66-
reporter.WriteLine(string.Format(CommonStrings.WorkloadManifestInstallationConfiguration, workloadSetsString));
67-
6887
if (installedWorkloads.Count == 0)
6988
{
7089
reporter.WriteLine(CommonStrings.NoWorkloadsInstalledInfoWarning);
71-
return;
7290
}
91+
else
92+
{
93+
var manifestInfoDict = workloadInfoHelper.WorkloadResolver.GetInstalledManifests().ToDictionary(info => info.Id, StringComparer.OrdinalIgnoreCase);
7394

74-
var manifestInfoDict = workloadInfoHelper.WorkloadResolver.GetInstalledManifests().ToDictionary(info => info.Id, StringComparer.OrdinalIgnoreCase);
95+
foreach (var workload in installedWorkloads.AsEnumerable())
96+
{
97+
var workloadManifest = workloadInfoHelper.WorkloadResolver.GetManifestFromWorkload(new WorkloadId(workload.Key));
98+
var workloadFeatureBand = manifestInfoDict[workloadManifest.Id].ManifestFeatureBand;
7599

76-
foreach (var workload in installedWorkloads.AsEnumerable())
77-
{
78-
var workloadManifest = workloadInfoHelper.WorkloadResolver.GetManifestFromWorkload(new WorkloadId(workload.Key));
79-
var workloadFeatureBand = manifestInfoDict[workloadManifest.Id].ManifestFeatureBand;
100+
const int align = 10;
101+
const string separator = " ";
80102

81-
const int align = 10;
82-
const string separator = " ";
103+
reporter.WriteLine($" [{workload.Key}]");
83104

84-
reporter.WriteLine($" [{workload.Key}]");
105+
reporter.Write($"{separator}{CommonStrings.WorkloadSourceColumn}:");
106+
reporter.WriteLine($" {workload.Value,align}");
85107

86-
reporter.Write($"{separator}{CommonStrings.WorkloadSourceColumn}:");
87-
reporter.WriteLine($" {workload.Value,align}");
108+
reporter.Write($"{separator}{CommonStrings.WorkloadManifestVersionColumn}:");
109+
reporter.WriteLine($" {workloadManifest.Version + '/' + workloadFeatureBand,align}");
88110

89-
reporter.Write($"{separator}{CommonStrings.WorkloadManifestVersionColumn}:");
90-
reporter.WriteLine($" {workloadManifest.Version + '/' + workloadFeatureBand,align}");
111+
reporter.Write($"{separator}{CommonStrings.WorkloadManifestPathColumn}:");
112+
reporter.WriteLine($" {workloadManifest.ManifestPath,align}");
91113

92-
reporter.Write($"{separator}{CommonStrings.WorkloadManifestPathColumn}:");
93-
reporter.WriteLine($" {workloadManifest.ManifestPath,align}");
114+
reporter.Write($"{separator}{CommonStrings.WorkloadInstallTypeColumn}:");
115+
reporter.WriteLine($" {WorkloadInstallType.GetWorkloadInstallType(new SdkFeatureBand(Utils.Product.Version), dotnetPath).ToString(),align}"
116+
);
117+
reporter.WriteLine("");
118+
}
119+
}
94120

95-
reporter.Write($"{separator}{CommonStrings.WorkloadInstallTypeColumn}:");
96-
reporter.WriteLine($" {WorkloadInstallType.GetWorkloadInstallType(new SdkFeatureBand(Utils.Product.Version), dotnetPath).ToString(),align}"
97-
);
98-
reporter.WriteLine("");
121+
if (!showVersion)
122+
{
123+
WriteUpdateModeAndAnyError();
99124
}
100125
}
101126

src/Cli/dotnet/commands/dotnet-workload/WorkloadHistoryRecorder.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,17 @@ public void Run(Action workloadAction)
5454
private WorkloadHistoryState GetWorkloadState()
5555
{
5656
var resolver = _workloadResolverFunc();
57-
var currentWorkloadInfo = resolver.GetWorkloadVersion();
57+
var currentWorkloadVersion = resolver.GetWorkloadVersion().Version;
5858
return new WorkloadHistoryState()
5959
{
6060
ManifestVersions = resolver.GetInstalledManifests().ToDictionary(manifest => manifest.Id.ToString(), manifest => $"{manifest.Version}/{manifest.ManifestFeatureBand}"),
6161
InstalledWorkloads = _workloadInstaller.GetWorkloadInstallationRecordRepository()
6262
.GetInstalledWorkloads(new SdkFeatureBand(_workloadResolver.GetSdkFeatureBand()))
6363
.Select(id => id.ToString())
6464
.ToList(),
65-
WorkloadSetVersion = resolver.GetWorkloadVersion()
65+
WorkloadSetVersion = currentWorkloadVersion
6666
};
6767

6868
}
6969
}
70-
}
70+
}

src/Cli/dotnet/commands/dotnet-workload/install/WorkloadInstallCommand.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ internal class WorkloadInstallCommand : InstallingWorkloadCommand
2020
{
2121
private bool _skipManifestUpdate;
2222
private readonly IReadOnlyCollection<string> _workloadIds;
23+
private readonly bool _shouldShutdownInstaller;
2324

2425
public bool IsRunningRestore { get; set; }
2526

@@ -45,6 +46,7 @@ public WorkloadInstallCommand(
4546
WorkloadInstallerFactory.GetWorkloadInstaller(resolvedReporter, _sdkFeatureBand,
4647
_workloadResolver, Verbosity, _userProfileDir, VerifySignatures, PackageDownloader, _dotnetPath, TempDirectoryPath,
4748
_packageSourceLocation, RestoreActionConfiguration, elevationRequired: !_printDownloadLinkOnly && string.IsNullOrWhiteSpace(_downloadToCacheOption));
49+
_shouldShutdownInstaller = _workloadInstallerFromConstructor != null;
4850

4951
_workloadManifestUpdater = _workloadManifestUpdaterFromConstructor ?? new WorkloadManifestUpdater(resolvedReporter, _workloadResolver, PackageDownloader, _userProfileDir,
5052
_workloadInstaller.GetWorkloadInstallationRecordRepository(), _workloadInstaller, _packageSourceLocation, displayManifestUpdates: Verbosity.IsDetailedOrDiagnostic());
@@ -120,7 +122,9 @@ public override int Execute()
120122
throw new GracefulException(string.Format(LocalizableStrings.CannotCombineSkipManifestAndVersion,
121123
WorkloadInstallCommandParser.SkipManifestUpdateOption.Name, InstallingWorkloadCommandParser.VersionOption.Name), isUserError: true);
122124
}
123-
else if (_skipManifestUpdate && SpecifiedWorkloadSetVersionInGlobalJson)
125+
else if ((_skipManifestUpdate && SpecifiedWorkloadSetVersionInGlobalJson) &&
126+
!IsRunningRestore) // When running restore, we first update workloads, then query the projects to figure out what workloads should be installed, then run the install command.
127+
// When we run the install command we set skipManifestUpdate to true as an optimization to avoid trying to update twice
124128
{
125129
throw new GracefulException(string.Format(LocalizableStrings.CannotUseSkipManifestWithGlobalJsonWorkloadVersion,
126130
WorkloadInstallCommandParser.SkipManifestUpdateOption.Name, _globalJsonPath), isUserError: true);
@@ -146,14 +150,21 @@ public override int Execute()
146150
}
147151
catch (Exception e)
148152
{
149-
_workloadInstaller.Shutdown();
153+
if (_shouldShutdownInstaller)
154+
{
155+
_workloadInstaller.Shutdown();
156+
}
150157

151158
// Don't show entire stack trace
152159
throw new GracefulException(string.Format(LocalizableStrings.WorkloadInstallationFailed, e.Message), e, isUserError: false);
153160
}
154161
}
155162

156-
_workloadInstaller.Shutdown();
163+
if (_shouldShutdownInstaller)
164+
{
165+
_workloadInstaller.Shutdown();
166+
}
167+
157168
return _workloadInstaller.ExitCode;
158169
}
159170

src/Cli/dotnet/commands/dotnet-workload/list/LocalizableStrings.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@
134134
<data name="WorkloadSetFromGlobalJsonInstalled" xml:space="preserve">
135135
<value>Found workload version {0} pinned in the global.json file at {1}.</value>
136136
</data>
137+
<data name="WorkloadVersionNotInstalledShort" xml:space="preserve">
138+
<value>(not installed)</value>
139+
</data>
137140
<data name="WorkloadSetFromGlobalJsonNotInstalled" xml:space="preserve">
138141
<value>Found workload version {0} pinned in the global.json file at {1}, but it was not installed. Running `dotnet workload install`, `dotnet workload update`, or `dotnet workload restore` may fix this.</value>
139142
</data>

src/Cli/dotnet/commands/dotnet-workload/list/WorkloadListCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public override int Execute()
9393
}
9494
else
9595
{
96-
Reporter.WriteLine(string.Format(LocalizableStrings.WorkloadSetVersion, _workloadListHelper.WorkloadResolver.GetWorkloadVersion() ?? "unknown"));
96+
Reporter.WriteLine(string.Format(LocalizableStrings.WorkloadSetVersion, _workloadListHelper.WorkloadResolver.GetWorkloadVersion().Version ?? "unknown"));
9797
}
9898

9999
Reporter.WriteLine();

src/Cli/dotnet/commands/dotnet-workload/list/xlf/LocalizableStrings.cs.xlf

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Cli/dotnet/commands/dotnet-workload/list/xlf/LocalizableStrings.de.xlf

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Cli/dotnet/commands/dotnet-workload/list/xlf/LocalizableStrings.es.xlf

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Cli/dotnet/commands/dotnet-workload/list/xlf/LocalizableStrings.fr.xlf

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)