Skip to content

Commit 7939812

Browse files
Replace Package record with two specialized records for version and version range parsing (#6850)
1 parent a222d68 commit 7939812

26 files changed

Lines changed: 361 additions & 24 deletions
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
#nullable enable
5+
6+
using System.Collections.Generic;
7+
using System.CommandLine.Parsing;
8+
using NuGet.Versioning;
9+
10+
namespace NuGet.CommandLine.XPlat.Commands.Package
11+
{
12+
internal record PackageWithNuGetVersion
13+
{
14+
public required string Id { get; init; }
15+
16+
public NuGetVersion? NuGetVersion { get; init; }
17+
18+
internal static IReadOnlyList<PackageWithNuGetVersion> Parse(ArgumentResult result)
19+
{
20+
if (result.Tokens.Count == 0)
21+
{
22+
return [];
23+
}
24+
25+
var packages = new List<PackageWithNuGetVersion>(result.Tokens.Count);
26+
27+
foreach (var token in result.Tokens)
28+
{
29+
string? packageId;
30+
NuGetVersion? newExactVersion = null;
31+
32+
int separatorIndex = token.Value.IndexOf('@');
33+
34+
if (separatorIndex < 0)
35+
{
36+
packageId = token.Value;
37+
}
38+
else
39+
{
40+
packageId = token.Value.Substring(0, separatorIndex);
41+
string versionString = token.Value.Substring(separatorIndex + 1);
42+
43+
if (string.IsNullOrEmpty(versionString))
44+
{
45+
result.AddError(Messages.Error_MissingVersion(token.Value));
46+
return [];
47+
}
48+
49+
if (!NuGetVersion.TryParse(versionString, out newExactVersion))
50+
{
51+
result.AddError(Messages.Error_InvalidVersion(versionString));
52+
return [];
53+
}
54+
}
55+
56+
var package = new PackageWithNuGetVersion
57+
{
58+
Id = packageId,
59+
NuGetVersion = newExactVersion
60+
};
61+
62+
packages.Add(package);
63+
}
64+
65+
return packages;
66+
}
67+
}
68+
}

src/NuGet.Core/NuGet.CommandLine.XPlat/Commands/Package/Update/Package.cs renamed to src/NuGet.Core/NuGet.CommandLine.XPlat/Commands/Package/PackageWithVersionRange.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@
99
using System.Diagnostics.CodeAnalysis;
1010
using NuGet.Versioning;
1111

12-
namespace NuGet.CommandLine.XPlat.Commands.Package.Update
12+
namespace NuGet.CommandLine.XPlat.Commands.Package
1313
{
14-
internal record Package : IEqualityComparer<Package>
14+
internal record PackageWithVersionRange : IEqualityComparer<PackageWithVersionRange>
1515
{
1616
public required string Id { get; init; }
1717
public required VersionRange? VersionRange { get; init; }
1818

19-
internal static IReadOnlyList<Package> Parse(ArgumentResult result)
19+
internal static IReadOnlyList<PackageWithVersionRange> Parse(ArgumentResult result)
2020
{
2121
if (result.Tokens.Count == 0)
2222
{
2323
return [];
2424
}
2525

26-
List<Package> packages = new List<Package>(result.Tokens.Count);
26+
List<PackageWithVersionRange> packages = new List<PackageWithVersionRange>(result.Tokens.Count);
2727

2828
foreach (var token in result.Tokens)
2929
{
@@ -51,7 +51,7 @@ internal static IReadOnlyList<Package> Parse(ArgumentResult result)
5151
}
5252
}
5353

54-
var package = new Package
54+
var package = new PackageWithVersionRange
5555
{
5656
Id = packageId,
5757
VersionRange = newVersion
@@ -62,7 +62,7 @@ internal static IReadOnlyList<Package> Parse(ArgumentResult result)
6262
return packages;
6363
}
6464

65-
public bool Equals(Package? x, Package? y)
65+
public bool Equals(PackageWithVersionRange? x, PackageWithVersionRange? y)
6666
{
6767
if (ReferenceEquals(x, y))
6868
{
@@ -82,7 +82,7 @@ public bool Equals(Package? x, Package? y)
8282
return VersionRangeComparer.Default.Equals(x.VersionRange, y.VersionRange);
8383
}
8484

85-
public int GetHashCode([DisallowNull] Package obj)
85+
public int GetHashCode([DisallowNull] PackageWithVersionRange obj)
8686
{
8787
HashCode hash = new HashCode();
8888
hash.Add(obj.Id, StringComparer.OrdinalIgnoreCase);

src/NuGet.Core/NuGet.CommandLine.XPlat/Commands/Package/Update/PackageUpdateArgs.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ internal record PackageUpdateArgs
1212
{
1313
public required string Project { get; init; }
1414

15-
public required IReadOnlyList<Package> Packages { get; init; }
15+
public required IReadOnlyList<PackageWithVersionRange> Packages { get; init; }
1616

1717
public required bool Interactive { get; init; }
1818

src/NuGet.Core/NuGet.CommandLine.XPlat/Commands/Package/Update/PackageUpdateCommand.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ internal static void Register(Command packageCommand, Option<bool> interactiveOp
2424
{
2525
var command = new DocumentedCommand("update", Strings.PackageUpdateCommand_Description, "https://aka.ms/dotnet/package/update");
2626

27-
var packagesArguments = new Argument<IReadOnlyList<Package>>("packages")
27+
var packagesArguments = new Argument<IReadOnlyList<PackageWithVersionRange>>("packages")
2828
{
2929
Description = Strings.PackageUpdate_PackageArgumentDescription,
3030
Arity = ArgumentArity.ZeroOrMore,
31-
CustomParser = Package.Parse
31+
CustomParser = PackageWithVersionRange.Parse
3232
};
3333
command.Arguments.Add(packagesArguments);
3434

@@ -49,7 +49,7 @@ internal static void Register(Command packageCommand, Option<bool> interactiveOp
4949
command.SetAction(async (args, cancellationToken) =>
5050
{
5151
FileSystemInfo? project = args.GetValue(projectOption);
52-
IReadOnlyList<Package> packages = args.GetValue(packagesArguments) ?? [];
52+
IReadOnlyList<PackageWithVersionRange> packages = args.GetValue(packagesArguments) ?? [];
5353
bool interactive = args.GetValue(interactiveOption);
5454
VerbosityEnum verbosity = args.GetValue(verbosityOption) ?? VerbosityEnum.normal;
5555
LogLevel logLevel = verbosity.ToLogLevel();

src/NuGet.Core/NuGet.CommandLine.XPlat/Commands/Package/Update/PackageUpdateCommandRunner.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ internal static async Task<int> Run(PackageUpdateArgs args, ILoggerWithColor log
182182
}
183183

184184
private static async Task<(List<PackageUpdateResult> vulnerablePackages, int packagesScanned)> SelectVulnerablePackagesToUpdateAsync(
185-
IReadOnlyList<Package>? packages,
185+
IReadOnlyList<PackageWithVersionRange>? packages,
186186
DependencyGraphSpec dgSpec,
187187
ILoggerWithColor logger,
188188
IPackageUpdateIO packageUpdateIO,
@@ -283,7 +283,7 @@ bool PackageHasVulnerability(string packageId, NuGetVersion version, IReadOnlyLi
283283
}
284284

285285
internal static async Task<List<PackageUpdateResult>> SelectPackagesToUpdateAsync(
286-
IReadOnlyList<Package> packages,
286+
IReadOnlyList<PackageWithVersionRange> packages,
287287
PackageSpec project,
288288
ILoggerWithColor logger,
289289
IPackageUpdateIO packageUpdateIO,
@@ -499,7 +499,7 @@ private static (VersionRange? version, List<string> targetFrameworks)
499499
return successful ? (packagesToUpdate, allProjectPackages.Count) : (null, allProjectPackages.Count);
500500
}
501501

502-
private static List<(Package identity, List<string> tfms)>? GetAllPackagesReferencedByProject(PackageSpec project, ILoggerWithColor logger)
502+
private static List<(PackageWithVersionRange identity, List<string> tfms)>? GetAllPackagesReferencedByProject(PackageSpec project, ILoggerWithColor logger)
503503
{
504504
var allPackages = new Dictionary<string, (VersionRange version, List<string> tfms, bool hasError)>(StringComparer.OrdinalIgnoreCase);
505505
bool hasErrors = false;
@@ -543,10 +543,10 @@ private static (VersionRange? version, List<string> targetFrameworks)
543543
return null;
544544
}
545545

546-
List<(Package package, List<string> tfms)> result = new(allPackages.Count);
546+
List<(PackageWithVersionRange package, List<string> tfms)> result = new(allPackages.Count);
547547
foreach (var kvp in allPackages)
548548
{
549-
var package = new Package { Id = kvp.Key, VersionRange = kvp.Value.version };
549+
var package = new PackageWithVersionRange { Id = kvp.Key, VersionRange = kvp.Value.version };
550550
result.Add((package, kvp.Value.tfms));
551551
}
552552

src/NuGet.Core/NuGet.CommandLine.XPlat/Messages.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ internal static string Error_InvalidVersionRange(string input)
4949
return string.Format(CultureInfo.CurrentCulture, Strings.Error_InvalidVersionRange, input);
5050
}
5151

52+
/// <inheritdoc cref="Strings.Error_InvalidVersion"/>
53+
internal static string Error_InvalidVersion(string input)
54+
{
55+
return string.Format(CultureInfo.CurrentCulture, Strings.Error_InvalidVersion, input);
56+
}
57+
5258
/// <inheritdoc cref="Strings.Error_PackageSourceMappingNotFound"/>
5359
internal static string Error_PackageSourceMappingNotFound(string packageId)
5460
{

src/NuGet.Core/NuGet.CommandLine.XPlat/Strings.Designer.cs

Lines changed: 10 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/NuGet.Core/NuGet.CommandLine.XPlat/Strings.resx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,4 +1104,8 @@ Do not translate "PackageVersion"</comment>
11041104
<data name="ArgumentNullOrEmpty" xml:space="preserve">
11051105
<value>Argument cannot be null or empty.</value>
11061106
</data>
1107+
<data name="Error_InvalidVersion" xml:space="preserve">
1108+
<value>Invalid version value '{0}'.</value>
1109+
<comment>0 - package version</comment>
1110+
</data>
11071111
</root>

src/NuGet.Core/NuGet.CommandLine.XPlat/xlf/Strings.cs.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,11 @@ NuGet vyžaduje zdroje HTTPS. Pokud chcete používat zdroje HTTP, musíte v sou
353353
<target state="translated">Zadaný zdroj {0} není platný. Zadejte platný zdroj.</target>
354354
<note>0 - The invalid source.</note>
355355
</trans-unit>
356+
<trans-unit id="Error_InvalidVersion">
357+
<source>Invalid version value '{0}'.</source>
358+
<target state="new">Invalid version value '{0}'.</target>
359+
<note>0 - package version</note>
360+
</trans-unit>
356361
<trans-unit id="Error_InvalidVersionRange">
357362
<source>Invalid version range '{0}'</source>
358363
<target state="translated">Neplatný rozsah verzí {0}</target>

src/NuGet.Core/NuGet.CommandLine.XPlat/xlf/Strings.de.xlf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,11 @@ NuGet erfordert HTTPS-Quellen. Um HTTP-Quellen zu verwenden, müssen Sie „allo
353353
<target state="translated">Die angegebene Quelle "{0}" ist ungültig. Geben Sie eine gültige Quelle an.</target>
354354
<note>0 - The invalid source.</note>
355355
</trans-unit>
356+
<trans-unit id="Error_InvalidVersion">
357+
<source>Invalid version value '{0}'.</source>
358+
<target state="new">Invalid version value '{0}'.</target>
359+
<note>0 - package version</note>
360+
</trans-unit>
356361
<trans-unit id="Error_InvalidVersionRange">
357362
<source>Invalid version range '{0}'</source>
358363
<target state="translated">Ungültiger Versionsbereich „{0}“</target>

0 commit comments

Comments
 (0)