Skip to content

Commit 2b9fa55

Browse files
committed
refactor workload version search command to make it easier to re-use version calculations
1 parent 89e26bc commit 2b9fa55

File tree

5 files changed

+107
-58
lines changed

5 files changed

+107
-58
lines changed

src/Cli/dotnet/commands/InstallingWorkloadCommand.cs

+7-3
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ protected void UpdateWorkloadManifests(WorkloadHistoryRecorder recorder, ITransa
214214
}
215215
}
216216

217-
string resolvedWorkloadSetVersion = _workloadSetVersionFromGlobalJson ??_workloadSetVersionFromCommandLine;
217+
string resolvedWorkloadSetVersion = _workloadSetVersionFromGlobalJson ?? _workloadSetVersionFromCommandLine;
218218
if (string.IsNullOrWhiteSpace(resolvedWorkloadSetVersion) && !UseRollback && !FromHistory)
219219
{
220220
_workloadManifestUpdater.UpdateAdvertisingManifestsAsync(_includePreviews, updateToLatestWorkloadSet, offlineCache).Wait();
@@ -423,10 +423,14 @@ protected IEnumerable<WorkloadId> WriteSDKInstallRecordsForVSWorkloads(IEnumerab
423423

424424
internal static class InstallingWorkloadCommandParser
425425
{
426-
public static readonly CliOption<string> WorkloadSetVersionOption = new("--version")
426+
public static readonly CliOption<string> WorkloadSetVersionOption = new CliOption<string>("--version")
427427
{
428428
Description = Strings.WorkloadSetVersionOptionDescription
429-
};
429+
}.AddCompletions((ctx) =>
430+
{
431+
var versions = Search.Versions.SearchWorkloadSetsCommand.GetWorkloadSetVersions(ctx).GetAwaiter().GetResult();
432+
return versions.Select(v => new System.CommandLine.Completions.CompletionItem(v));
433+
});
430434

431435
public static readonly CliOption<bool> PrintDownloadLinkOnlyOption = new("--print-download-link-only")
432436
{

src/Cli/dotnet/commands/dotnet-complete/CompleteCommand.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ private static CompletionItem[] Completions(ParseResult complete)
6060

6161
var result = Parser.Instance.Parse(input);
6262

63-
return result.GetCompletions(position)
64-
.Distinct()
63+
var completions = result.GetCompletions(position);
64+
return completions.Distinct()
6565
.ToArray();
6666
}
6767
}

src/Cli/dotnet/commands/dotnet-workload/search/WorkloadSearchCommand.cs

+2-47
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,17 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System.CommandLine;
5-
using System.Text.Json;
6-
using Microsoft.Deployment.DotNet.Releases;
75
using Microsoft.DotNet.Cli;
8-
using Microsoft.DotNet.Cli.NuGetPackageDownloader;
96
using Microsoft.DotNet.Cli.Utils;
107
using Microsoft.DotNet.Workloads.Workload.Install;
118
using Microsoft.NET.Sdk.WorkloadManifestReader;
12-
using Microsoft.TemplateEngine.Cli.Commands;
139

1410
namespace Microsoft.DotNet.Workloads.Workload.Search
1511
{
1612
internal class WorkloadSearchCommand : WorkloadCommandBase
1713
{
1814
private readonly IWorkloadResolver _workloadResolver;
19-
private readonly ReleaseVersion _sdkVersion;
2015
private readonly string _workloadIdStub;
21-
private readonly int _numberOfWorkloadSetsToTake;
22-
private readonly string _workloadSetOutputFormat;
23-
private readonly IWorkloadManifestInstaller _installer;
24-
internal bool ListWorkloadSetVersions { get; set; } = false;
2516

2617
public WorkloadSearchCommand(
2718
ParseResult result,
@@ -31,53 +22,17 @@ public WorkloadSearchCommand(
3122
_workloadIdStub = result.GetValue(WorkloadSearchCommandParser.WorkloadIdStubArgument);
3223

3324
workloadResolverFactory = workloadResolverFactory ?? new WorkloadResolverFactory();
25+
var creationResult = workloadResolverFactory.Create();
26+
_workloadResolver = creationResult.WorkloadResolver;
3427

3528
if (!string.IsNullOrEmpty(result.GetValue(WorkloadSearchCommandParser.VersionOption)))
3629
{
3730
throw new GracefulException(Install.LocalizableStrings.SdkVersionOptionNotSupported);
3831
}
39-
40-
var creationResult = workloadResolverFactory.Create();
41-
42-
_sdkVersion = creationResult.SdkVersion;
43-
_workloadResolver = creationResult.WorkloadResolver;
44-
45-
_numberOfWorkloadSetsToTake = result.GetValue(SearchWorkloadSetsParser.TakeOption);
46-
_workloadSetOutputFormat = result.GetValue(SearchWorkloadSetsParser.FormatOption);
47-
48-
_installer = WorkloadInstallerFactory.GetWorkloadInstaller(
49-
reporter,
50-
new SdkFeatureBand(_sdkVersion),
51-
_workloadResolver,
52-
Verbosity,
53-
creationResult.UserProfileDir,
54-
!SignCheck.IsDotNetSigned(),
55-
restoreActionConfig: new RestoreActionConfig(result.HasOption(SharedOptions.InteractiveOption)),
56-
elevationRequired: false,
57-
shouldLog: false);
5832
}
5933

6034
public override int Execute()
6135
{
62-
if (ListWorkloadSetVersions)
63-
{
64-
var featureBand = new SdkFeatureBand(_sdkVersion);
65-
var packageId = _installer.GetManifestPackageId(new ManifestId("Microsoft.NET.Workloads"), featureBand);
66-
var versions = PackageDownloader.GetLatestPackageVersions(packageId, _numberOfWorkloadSetsToTake, packageSourceLocation: null, includePreview: !string.IsNullOrWhiteSpace(_sdkVersion.Prerelease))
67-
.GetAwaiter().GetResult()
68-
.Select(version => WorkloadManifestUpdater.WorkloadSetPackageVersionToWorkloadSetVersion(featureBand, version.Version.ToString()));
69-
if (_workloadSetOutputFormat?.Equals("json", StringComparison.OrdinalIgnoreCase) == true)
70-
{
71-
Reporter.WriteLine(JsonSerializer.Serialize(versions.Select(version => version.ToDictionary(_ => "workloadVersion", v => v))));
72-
}
73-
else
74-
{
75-
Reporter.WriteLine(string.Join('\n', versions));
76-
}
77-
78-
return 0;
79-
}
80-
8136
IEnumerable<WorkloadResolver.WorkloadInfo> availableWorkloads = _workloadResolver.GetAvailableWorkloads()
8237
.OrderBy(workload => workload.Id);
8338

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.CommandLine;
5+
using System.CommandLine.Completions;
6+
using System.Text.Json;
7+
using Microsoft.Deployment.DotNet.Releases;
8+
using Microsoft.DotNet.Cli;
9+
using Microsoft.DotNet.Cli.NuGetPackageDownloader;
10+
using Microsoft.DotNet.Cli.Utils;
11+
using Microsoft.DotNet.Workloads.Workload.Install;
12+
using Microsoft.NET.Sdk.WorkloadManifestReader;
13+
using Microsoft.TemplateEngine.Cli.Commands;
14+
15+
namespace Microsoft.DotNet.Workloads.Workload.Search.Versions;
16+
17+
internal class SearchWorkloadSetsCommand : WorkloadCommandBase
18+
{
19+
internal readonly int NumberOfWorkloadSetsToTake;
20+
private readonly SearchWorkloadSetsFormat _workloadSetOutputFormat;
21+
internal readonly IWorkloadManifestInstaller Installer;
22+
internal readonly ReleaseVersion SdkVersion;
23+
private readonly IWorkloadResolver _workloadResolver;
24+
25+
private static readonly ManifestId WorkloadPackageIdBase = new("Microsoft.NET.Workloads");
26+
27+
public SearchWorkloadSetsCommand(ParseResult result, IWorkloadResolverFactory workloadResolverFactory = null, IReporter reporter = null) : base(result, reporter: reporter)
28+
{
29+
NumberOfWorkloadSetsToTake = result.HasOption(SearchWorkloadSetsParser.TakeOption) ? result.GetValue(SearchWorkloadSetsParser.TakeOption) : 5;
30+
_workloadSetOutputFormat = result.GetValue(SearchWorkloadSetsParser.FormatOption);
31+
workloadResolverFactory = workloadResolverFactory ?? new WorkloadResolverFactory();
32+
var creationResult = workloadResolverFactory.Create();
33+
34+
SdkVersion = creationResult.SdkVersion;
35+
_workloadResolver = creationResult.WorkloadResolver;
36+
37+
Installer = WorkloadInstallerFactory.GetWorkloadInstaller(
38+
reporter,
39+
new SdkFeatureBand(SdkVersion),
40+
_workloadResolver,
41+
Verbosity,
42+
creationResult.UserProfileDir,
43+
!SignCheck.IsDotNetSigned(),
44+
restoreActionConfig: new RestoreActionConfig(result.HasOption(SharedOptions.InteractiveOption)),
45+
elevationRequired: false,
46+
shouldLog: false);
47+
}
48+
49+
protected override void ShowHelpOrErrorIfAppropriate(ParseResult parseResult)
50+
{
51+
52+
}
53+
54+
public async Task<int> Execute(CancellationToken cancellationToken)
55+
{
56+
var featureBand = new SdkFeatureBand(SdkVersion);
57+
var packageId = Installer.GetManifestPackageId(WorkloadPackageIdBase, featureBand);
58+
var versions = (await PackageDownloader.GetLatestPackageVersions(packageId, NumberOfWorkloadSetsToTake, packageSourceLocation: null, includePreview: !string.IsNullOrWhiteSpace(SdkVersion.Prerelease)).ConfigureAwait(false))
59+
.Select(version => WorkloadManifestUpdater.WorkloadSetPackageVersionToWorkloadSetVersion(featureBand, version.Version.ToString()));
60+
if (_workloadSetOutputFormat == SearchWorkloadSetsFormat.json)
61+
{
62+
Reporter.WriteLine(JsonSerializer.Serialize(versions.Select(version => version.ToDictionary(_ => "workloadVersion", v => v))));
63+
}
64+
else
65+
{
66+
Reporter.WriteLine(string.Join('\n', versions));
67+
}
68+
69+
return 0;
70+
}
71+
72+
public override int Execute() => Execute(CancellationToken.None).GetAwaiter().GetResult();
73+
74+
/// <summary>
75+
/// Used for CLI completions to get the workload set versions.
76+
/// </summary>
77+
/// <returns></returns>
78+
public static async Task<IEnumerable<string>> GetWorkloadSetVersions(CompletionContext ctx)
79+
{
80+
var inner = new SearchWorkloadSetsCommand(ctx.ParseResult);
81+
var featureBand = new SdkFeatureBand(inner.SdkVersion);
82+
var packageId = inner.Installer.GetManifestPackageId(WorkloadPackageIdBase, featureBand);
83+
var versions = (await inner.PackageDownloader.GetLatestPackageVersions(packageId, inner.NumberOfWorkloadSetsToTake, packageSourceLocation: null, includePreview: !string.IsNullOrWhiteSpace(inner.SdkVersion.Prerelease)).ConfigureAwait(false))
84+
.Select(version => WorkloadManifestUpdater.WorkloadSetPackageVersionToWorkloadSetVersion(featureBand, version.Version.ToString()));
85+
return versions;
86+
}
87+
}

src/Cli/dotnet/commands/dotnet-workload/search/SearchWorkloadSetsParser.cs renamed to src/Cli/dotnet/commands/dotnet-workload/search/versions/SearchWorkloadSetsParser.cs

+9-6
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System.CommandLine;
5-
using Microsoft.DotNet.Workloads.Workload.Search;
5+
using Microsoft.DotNet.Workloads.Workload.Search.Versions;
66
using LocalizableStrings = Microsoft.DotNet.Workloads.Workload.Search.LocalizableStrings;
77

88
namespace Microsoft.DotNet.Cli
@@ -11,7 +11,7 @@ internal static class SearchWorkloadSetsParser
1111
{
1212
public static readonly CliOption<int> TakeOption = new("--take") { DefaultValueFactory = (_) => 5 };
1313

14-
public static readonly CliOption<string> FormatOption = new("--format")
14+
public static readonly CliOption<SearchWorkloadSetsFormat> FormatOption = new("--format")
1515
{
1616
Description = LocalizableStrings.FormatOptionDescription
1717
};
@@ -37,12 +37,15 @@ private static CliCommand ConstructCommand()
3737
}
3838
});
3939

40-
command.SetAction(parseResult => new WorkloadSearchCommand(parseResult)
41-
{
42-
ListWorkloadSetVersions = true
43-
}.Execute());
40+
command.SetAction((parseResult, ct) => new SearchWorkloadSetsCommand(parseResult).Execute(ct));
4441

4542
return command;
4643
}
4744
}
45+
46+
internal enum SearchWorkloadSetsFormat
47+
{
48+
text,
49+
json
50+
}
4851
}

0 commit comments

Comments
 (0)