@@ -47,6 +47,7 @@ internal abstract class InstallingWorkloadCommand : WorkloadCommandBase
47
47
protected readonly IWorkloadManifestUpdater _workloadManifestUpdaterFromConstructor ;
48
48
protected IInstaller _workloadInstaller ;
49
49
protected IWorkloadManifestUpdater _workloadManifestUpdater ;
50
+ protected bool ? _shouldUseWorkloadSets ;
50
51
private WorkloadHistoryState _workloadHistoryRecord ;
51
52
52
53
protected bool UseRollback => ! string . IsNullOrWhiteSpace ( _fromRollbackDefinition ) ;
@@ -86,7 +87,8 @@ public InstallingWorkloadCommand(
86
87
IInstaller workloadInstaller ,
87
88
INuGetPackageDownloader nugetPackageDownloader ,
88
89
IWorkloadManifestUpdater workloadManifestUpdater ,
89
- string tempDirPath )
90
+ string tempDirPath ,
91
+ bool ? shouldUseWorkloadSetsFromGlobalJson = null )
90
92
: base ( parseResult , reporter : reporter , tempDirPath : tempDirPath , nugetPackageDownloader : nugetPackageDownloader )
91
93
{
92
94
_arguments = parseResult . GetArguments ( ) ;
@@ -132,7 +134,8 @@ public InstallingWorkloadCommand(
132
134
_workloadManifestUpdaterFromConstructor = workloadManifestUpdater ;
133
135
134
136
_globalJsonPath = SdkDirectoryWorkloadManifestProvider . GetGlobalJsonPath ( Environment . CurrentDirectory ) ;
135
- _workloadSetVersionFromGlobalJson = SdkDirectoryWorkloadManifestProvider . GlobalJsonReader . GetWorkloadVersionFromGlobalJson ( _globalJsonPath ) ;
137
+ _workloadSetVersionFromGlobalJson = SdkDirectoryWorkloadManifestProvider . GlobalJsonReader . GetWorkloadVersionFromGlobalJson ( _globalJsonPath , out _shouldUseWorkloadSets ) ;
138
+ _shouldUseWorkloadSets = shouldUseWorkloadSetsFromGlobalJson ?? _shouldUseWorkloadSets ;
136
139
137
140
if ( SpecifiedWorkloadSetVersionInGlobalJson && ( SpecifiedWorkloadSetVersionOnCommandLine || UseRollback || FromHistory ) )
138
141
{
@@ -150,6 +153,14 @@ public InstallingWorkloadCommand(
150
153
InstallingWorkloadCommandParser . WorkloadSetVersionOption . Name ,
151
154
WorkloadUpdateCommandParser . FromHistoryOption . Name ) , isUserError : true ) ;
152
155
}
156
+ else if ( _shouldUseWorkloadSets == true && ( UseRollback || ( FromHistory && _WorkloadHistoryRecord . WorkloadSetVersion is null ) ) )
157
+ {
158
+ throw new GracefulException ( Workloads . Workload . Update . LocalizableStrings . SpecifiedWorkloadVersionAndSpecificNonWorkloadVersion , isUserError : true ) ;
159
+ }
160
+ else if ( _shouldUseWorkloadSets == false && ( SpecifiedWorkloadSetVersionInGlobalJson || SpecifiedWorkloadSetVersionOnCommandLine || ( FromHistory && _WorkloadHistoryRecord . WorkloadSetVersion is not null ) ) )
161
+ {
162
+ throw new GracefulException ( Workloads . Workload . Update . LocalizableStrings . SpecifiedNoWorkloadVersionAndSpecificWorkloadVersion , isUserError : true ) ;
163
+ }
153
164
154
165
// At this point, at most one of SpecifiedWorkloadSetVersionOnCommandLine, UseRollback, FromHistory, and SpecifiedWorkloadSetVersionInGlobalJson is true
155
166
}
@@ -161,23 +172,19 @@ protected static Dictionary<string, string> GetInstallStateContents(IEnumerable<
161
172
162
173
InstallStateContents GetCurrentInstallState ( )
163
174
{
164
- return GetCurrentInstallState ( _sdkFeatureBand , _workloadRootDir ) ;
165
- }
166
-
167
- static InstallStateContents GetCurrentInstallState ( SdkFeatureBand sdkFeatureBand , string dotnetDir )
168
- {
169
- string path = Path . Combine ( WorkloadInstallType . GetInstallStateFolder ( sdkFeatureBand , dotnetDir ) , "default.json" ) ;
175
+ string path = Path . Combine ( WorkloadInstallType . GetInstallStateFolder ( _sdkFeatureBand , _workloadRootDir ) , "default.json" ) ;
170
176
return InstallStateContents . FromPath ( path ) ;
171
177
}
172
178
173
179
public static bool ShouldUseWorkloadSetMode ( SdkFeatureBand sdkFeatureBand , string dotnetDir )
174
180
{
175
- return GetCurrentInstallState ( sdkFeatureBand , dotnetDir ) . ShouldUseWorkloadSets ( ) ;
181
+ return WorkloadManifestUpdater . ShouldUseWorkloadSetMode ( sdkFeatureBand , dotnetDir ) ;
176
182
}
177
183
178
184
protected void UpdateWorkloadManifests ( WorkloadHistoryRecorder recorder , ITransactionContext context , DirectoryPath ? offlineCache )
179
185
{
180
- var updateToLatestWorkloadSet = ShouldUseWorkloadSetMode ( _sdkFeatureBand , _workloadRootDir ) && ! SpecifiedWorkloadSetVersionInGlobalJson ;
186
+ var shouldUseWorkloadSetsPerInstallState = ShouldUseWorkloadSetMode ( _sdkFeatureBand , _workloadRootDir ) ;
187
+ var updateToLatestWorkloadSet = _shouldUseWorkloadSets ?? shouldUseWorkloadSetsPerInstallState && ! SpecifiedWorkloadSetVersionInGlobalJson ;
181
188
if ( FromHistory && ! string . IsNullOrWhiteSpace ( _WorkloadHistoryRecord . WorkloadSetVersion ) )
182
189
{
183
190
// This is essentially the same as updating to a specific workload set version, and we're now past the error check,
@@ -192,6 +199,12 @@ protected void UpdateWorkloadManifests(WorkloadHistoryRecorder recorder, ITransa
192
199
updateToLatestWorkloadSet = false ;
193
200
}
194
201
202
+ string resolvedWorkloadSetVersion = _workloadSetVersionFromGlobalJson ;
203
+ if ( SpecifiedWorkloadSetVersionInGlobalJson && recorder is not null )
204
+ {
205
+ recorder . HistoryRecord . GlobalJsonVersion = _workloadSetVersionFromGlobalJson ;
206
+ }
207
+
195
208
if ( SpecifiedWorkloadSetVersionOnCommandLine )
196
209
{
197
210
updateToLatestWorkloadSet = false ;
@@ -204,45 +217,37 @@ protected void UpdateWorkloadManifests(WorkloadHistoryRecorder recorder, ITransa
204
217
_workloadInstaller . UpdateInstallMode ( _sdkFeatureBand , true ) ;
205
218
}
206
219
207
- if ( SpecifiedWorkloadSetVersionInGlobalJson && recorder is not null )
208
- {
209
- recorder . HistoryRecord . GlobalJsonVersion = _workloadSetVersionFromGlobalJson ;
210
- }
211
- }
212
-
213
- string resolvedWorkloadSetVersion = null ;
214
-
215
- if ( _workloadSetVersionFromCommandLine ? . Any ( v => v . Contains ( '@' ) ) == true )
216
- {
217
- var versions = WorkloadSearchVersionsCommand . FindBestWorkloadSetsFromComponents (
218
- _sdkFeatureBand ,
219
- _workloadInstaller is not NetSdkMsiInstallerClient ? _workloadInstaller : null ,
220
- _sdkFeatureBand . IsPrerelease ,
221
- PackageDownloader ,
222
- _workloadSetVersionFromCommandLine ,
223
- _workloadResolver ,
224
- numberOfWorkloadSetsToTake : 1 ) ;
225
-
226
- if ( versions is null )
220
+ if ( _workloadSetVersionFromCommandLine . Any ( v => v . Contains ( '@' ) ) )
227
221
{
228
- return ;
229
- }
230
- else if ( ! versions . Any ( ) )
231
- {
232
- Reporter . WriteLine ( Workloads . Workload . Update . LocalizableStrings . NoWorkloadUpdateFound ) ;
233
- return ;
222
+ var versions = WorkloadSearchVersionsCommand . FindBestWorkloadSetsFromComponents (
223
+ _sdkFeatureBand ,
224
+ _workloadInstaller is not NetSdkMsiInstallerClient ? _workloadInstaller : null ,
225
+ _sdkFeatureBand . IsPrerelease ,
226
+ PackageDownloader ,
227
+ _workloadSetVersionFromCommandLine ,
228
+ _workloadResolver ,
229
+ numberOfWorkloadSetsToTake : 1 ) ;
230
+
231
+ if ( versions is null )
232
+ {
233
+ return ;
234
+ }
235
+ else if ( ! versions . Any ( ) )
236
+ {
237
+ Reporter . WriteLine ( Workloads . Workload . Update . LocalizableStrings . NoWorkloadUpdateFound ) ;
238
+ return ;
239
+ }
240
+ else
241
+ {
242
+ resolvedWorkloadSetVersion = versions . Single ( ) ;
243
+ }
234
244
}
235
245
else
236
246
{
237
- resolvedWorkloadSetVersion = versions . Single ( ) ;
247
+ resolvedWorkloadSetVersion = _workloadSetVersionFromCommandLine . Single ( ) ;
238
248
}
239
249
}
240
- else if ( SpecifiedWorkloadSetVersionOnCommandLine )
241
- {
242
- resolvedWorkloadSetVersion = _workloadSetVersionFromCommandLine . Single ( ) ;
243
- }
244
250
245
- resolvedWorkloadSetVersion = _workloadSetVersionFromGlobalJson ?? resolvedWorkloadSetVersion ;
246
251
if ( string . IsNullOrWhiteSpace ( resolvedWorkloadSetVersion ) && ! UseRollback && ! FromHistory )
247
252
{
248
253
_workloadManifestUpdater . UpdateAdvertisingManifestsAsync ( _includePreviews , updateToLatestWorkloadSet , offlineCache ) . Wait ( ) ;
@@ -270,17 +275,11 @@ protected void UpdateWorkloadManifests(WorkloadHistoryRecorder recorder, ITransa
270
275
return ;
271
276
}
272
277
273
- IEnumerable < ManifestVersionUpdate > manifestsToUpdate ;
274
- if ( resolvedWorkloadSetVersion != null )
275
- {
276
- manifestsToUpdate = InstallWorkloadSet ( context , resolvedWorkloadSetVersion ) ;
277
- }
278
- else
279
- {
280
- manifestsToUpdate = UseRollback ? _workloadManifestUpdater . CalculateManifestRollbacks ( _fromRollbackDefinition , recorder ) :
281
- FromHistory ? _workloadManifestUpdater . CalculateManifestUpdatesFromHistory ( _WorkloadHistoryRecord ) :
282
- _workloadManifestUpdater . CalculateManifestUpdates ( ) . Select ( m => m . ManifestUpdate ) ;
283
- }
278
+ IEnumerable < ManifestVersionUpdate > manifestsToUpdate =
279
+ resolvedWorkloadSetVersion != null ? InstallWorkloadSet ( context , resolvedWorkloadSetVersion ) :
280
+ UseRollback ? _workloadManifestUpdater . CalculateManifestRollbacks ( _fromRollbackDefinition , recorder ) :
281
+ FromHistory ? _workloadManifestUpdater . CalculateManifestUpdatesFromHistory ( _WorkloadHistoryRecord ) :
282
+ _workloadManifestUpdater . CalculateManifestUpdates ( ) . Select ( m => m . ManifestUpdate ) ;
284
283
285
284
InstallStateContents oldInstallState = GetCurrentInstallState ( ) ;
286
285
0 commit comments