Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,60 +9,89 @@
using System.Diagnostics.CodeAnalysis;
using NuGet.Versioning;

namespace NuGet.CommandLine.XPlat.Commands.Package.Update
namespace NuGet.CommandLine.XPlat.Commands.Package
{
internal record Package : IEqualityComparer<Package>
internal record NuGetPackage : IEqualityComparer<NuGetPackage>
{
public required string Id { get; init; }
public required VersionRange? VersionRange { get; init; }
public VersionRange? VersionRange { get; init; }

internal static IReadOnlyList<Package> Parse(ArgumentResult result)
public NuGetVersion? ExactVersion { get; init; }

internal static IReadOnlyList<NuGetPackage> ParsePackagesWithVersionRange(ArgumentResult result)
{
return ParsePackages(result, exactVersion: false);
}

internal static IReadOnlyList<NuGetPackage> ParsePackagesWithExactVersions(ArgumentResult result)
{
return ParsePackages(result, exactVersion: true);
}

private static IReadOnlyList<NuGetPackage> ParsePackages(ArgumentResult result, bool exactVersion)
{
if (result.Tokens.Count == 0)
{
return [];
}

List<Package> packages = new List<Package>(result.Tokens.Count);
List<NuGetPackage> packages = new List<NuGetPackage>(result.Tokens.Count);

foreach (var token in result.Tokens)
{
string? packageId;
VersionRange? newVersion;
VersionRange? newVersionRange = null;
NuGetVersion? newExactVersion = null;

int separatorIndex = token.Value.IndexOf('@');

if (separatorIndex < 0)
{
packageId = token.Value;
newVersion = null;
}
else
{
packageId = token.Value.Substring(0, separatorIndex);
string versionString = token.Value.Substring(separatorIndex + 1);

if (string.IsNullOrEmpty(versionString))
{
result.AddError(Messages.Error_MissingVersion(token.Value));
return [];
}
if (!VersionRange.TryParse(versionString, out newVersion))

if (exactVersion)
{
result.AddError(Messages.Error_InvalidVersionRange(versionString));
return [];
if (!NuGetVersion.TryParse(versionString, out newExactVersion))
{
result.AddError(Messages.Error_InvalidVersion(versionString));
return [];
}
}
else
{
if (!VersionRange.TryParse(versionString, out newVersionRange))
{
result.AddError(Messages.Error_InvalidVersionRange(versionString));
return [];
}
}
}

var package = new Package
NuGetPackage package = new NuGetPackage
{
Id = packageId,
VersionRange = newVersion
VersionRange = newVersionRange,
ExactVersion = newExactVersion
};

packages.Add(package);
}

return packages;
}

public bool Equals(Package? x, Package? y)
public bool Equals(NuGetPackage? x, NuGetPackage? y)
{
if (ReferenceEquals(x, y))
{
Expand All @@ -79,14 +108,16 @@ public bool Equals(Package? x, Package? y)
return false;
}

return VersionRangeComparer.Default.Equals(x.VersionRange, y.VersionRange);
return VersionRangeComparer.Default.Equals(x.VersionRange, y.VersionRange) &&
VersionComparer.Compare(x.ExactVersion, y.ExactVersion, VersionComparison.Default) == 0;
}

public int GetHashCode([DisallowNull] Package obj)
public int GetHashCode([DisallowNull] NuGetPackage obj)
{
HashCode hash = new HashCode();
hash.Add(obj.Id, StringComparer.OrdinalIgnoreCase);
hash.Add(obj.VersionRange);
hash.Add(obj.ExactVersion);
return hash.ToHashCode();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ internal record PackageUpdateArgs
{
public required string Project { get; init; }

public required IReadOnlyList<Package> Packages { get; init; }
public required IReadOnlyList<NuGetPackage> Packages { get; init; }

public required bool Interactive { get; init; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ internal static void Register(Command packageCommand, Option<bool> interactiveOp
{
var command = new DocumentedCommand("update", Strings.PackageUpdateCommand_Description, "https://aka.ms/dotnet/package/update");

var packagesArguments = new Argument<IReadOnlyList<Package>>("packages")
var packagesArguments = new Argument<IReadOnlyList<NuGetPackage>>("packages")
{
Description = Strings.PackageUpdate_PackageArgumentDescription,
Arity = ArgumentArity.ZeroOrMore,
CustomParser = Package.Parse
CustomParser = NuGetPackage.ParsePackagesWithVersionRange
};
command.Arguments.Add(packagesArguments);

Expand All @@ -49,7 +49,7 @@ internal static void Register(Command packageCommand, Option<bool> interactiveOp
command.SetAction(async (args, cancellationToken) =>
{
FileSystemInfo? project = args.GetValue(projectOption);
IReadOnlyList<Package> packages = args.GetValue(packagesArguments) ?? [];
IReadOnlyList<NuGetPackage> packages = args.GetValue(packagesArguments) ?? [];
bool interactive = args.GetValue(interactiveOption);
VerbosityEnum verbosity = args.GetValue(verbosityOption) ?? VerbosityEnum.normal;
LogLevel logLevel = verbosity.ToLogLevel();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ internal static async Task<int> Run(PackageUpdateArgs args, ILoggerWithColor log
}

private static async Task<(List<PackageUpdateResult> vulnerablePackages, int packagesScanned)> SelectVulnerablePackagesToUpdateAsync(
IReadOnlyList<Package>? packages,
IReadOnlyList<NuGetPackage>? packages,
DependencyGraphSpec dgSpec,
ILoggerWithColor logger,
IPackageUpdateIO packageUpdateIO,
Expand Down Expand Up @@ -283,7 +283,7 @@ bool PackageHasVulnerability(string packageId, NuGetVersion version, IReadOnlyLi
}

internal static async Task<List<PackageUpdateResult>> SelectPackagesToUpdateAsync(
IReadOnlyList<Package> packages,
IReadOnlyList<NuGetPackage> packages,
PackageSpec project,
ILoggerWithColor logger,
IPackageUpdateIO packageUpdateIO,
Expand Down Expand Up @@ -499,7 +499,7 @@ private static (VersionRange? version, List<string> targetFrameworks)
return successful ? (packagesToUpdate, allProjectPackages.Count) : (null, allProjectPackages.Count);
}

private static List<(Package identity, List<string> tfms)>? GetAllPackagesReferencedByProject(PackageSpec project, ILoggerWithColor logger)
private static List<(NuGetPackage identity, List<string> tfms)>? GetAllPackagesReferencedByProject(PackageSpec project, ILoggerWithColor logger)
{
var allPackages = new Dictionary<string, (VersionRange version, List<string> tfms, bool hasError)>(StringComparer.OrdinalIgnoreCase);
bool hasErrors = false;
Expand Down Expand Up @@ -543,10 +543,10 @@ private static (VersionRange? version, List<string> targetFrameworks)
return null;
}

List<(Package package, List<string> tfms)> result = new(allPackages.Count);
List<(NuGetPackage package, List<string> tfms)> result = new(allPackages.Count);
foreach (var kvp in allPackages)
{
var package = new Package { Id = kvp.Key, VersionRange = kvp.Value.version };
var package = new NuGetPackage { Id = kvp.Key, VersionRange = kvp.Value.version };
result.Add((package, kvp.Value.tfms));
}

Expand Down
6 changes: 6 additions & 0 deletions src/NuGet.Core/NuGet.CommandLine.XPlat/Messages.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@ internal static string Error_InvalidVersionRange(string input)
return string.Format(CultureInfo.CurrentCulture, Strings.Error_InvalidVersionRange, input);
}

/// <inheritdoc cref="Strings.Error_InvalidVersion"/>
internal static string Error_InvalidVersion(string input)
{
return string.Format(CultureInfo.CurrentCulture, Strings.Error_InvalidVersion, input);
}

/// <inheritdoc cref="Strings.Error_PackageSourceMappingNotFound"/>
internal static string Error_PackageSourceMappingNotFound(string packageId)
{
Expand Down
11 changes: 10 additions & 1 deletion src/NuGet.Core/NuGet.CommandLine.XPlat/Strings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions src/NuGet.Core/NuGet.CommandLine.XPlat/Strings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -1104,4 +1104,8 @@ Do not translate "PackageVersion"</comment>
<data name="ArgumentNullOrEmpty" xml:space="preserve">
<value>Argument cannot be null or empty.</value>
</data>
<data name="Error_InvalidVersion" xml:space="preserve">
<value>Invalid version value '{0}'. An exact NuGet version is required for this operation.</value>
<comment>0 - package version</comment>
</data>
</root>
5 changes: 5 additions & 0 deletions src/NuGet.Core/NuGet.CommandLine.XPlat/xlf/Strings.cs.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ NuGet vyžaduje zdroje HTTPS. Pokud chcete používat zdroje HTTP, musíte v sou
<target state="translated">Zadaný zdroj {0} není platný. Zadejte platný zdroj.</target>
<note>0 - The invalid source.</note>
</trans-unit>
<trans-unit id="Error_InvalidVersion">
<source>Invalid version value '{0}'. An exact NuGet version is required for this operation.</source>
<target state="new">Invalid version value '{0}'. An exact NuGet version is required for this operation.</target>
<note>0 - package version</note>
</trans-unit>
<trans-unit id="Error_InvalidVersionRange">
<source>Invalid version range '{0}'</source>
<target state="translated">Neplatný rozsah verzí {0}</target>
Expand Down
5 changes: 5 additions & 0 deletions src/NuGet.Core/NuGet.CommandLine.XPlat/xlf/Strings.de.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ NuGet erfordert HTTPS-Quellen. Um HTTP-Quellen zu verwenden, müssen Sie „allo
<target state="translated">Die angegebene Quelle "{0}" ist ungültig. Geben Sie eine gültige Quelle an.</target>
<note>0 - The invalid source.</note>
</trans-unit>
<trans-unit id="Error_InvalidVersion">
<source>Invalid version value '{0}'. An exact NuGet version is required for this operation.</source>
<target state="new">Invalid version value '{0}'. An exact NuGet version is required for this operation.</target>
<note>0 - package version</note>
</trans-unit>
<trans-unit id="Error_InvalidVersionRange">
<source>Invalid version range '{0}'</source>
<target state="translated">Ungültiger Versionsbereich „{0}“</target>
Expand Down
5 changes: 5 additions & 0 deletions src/NuGet.Core/NuGet.CommandLine.XPlat/xlf/Strings.es.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ NuGet requiere orígenes HTTPS. Para usar orígenes HTTP, es necesario establece
<target state="translated">El origen "{0}" especificado no es válido. Proporcione un origen válido.</target>
<note>0 - The invalid source.</note>
</trans-unit>
<trans-unit id="Error_InvalidVersion">
<source>Invalid version value '{0}'. An exact NuGet version is required for this operation.</source>
<target state="new">Invalid version value '{0}'. An exact NuGet version is required for this operation.</target>
<note>0 - package version</note>
</trans-unit>
<trans-unit id="Error_InvalidVersionRange">
<source>Invalid version range '{0}'</source>
<target state="translated">Intervalo de versiones no válido "{0}"</target>
Expand Down
5 changes: 5 additions & 0 deletions src/NuGet.Core/NuGet.CommandLine.XPlat/xlf/Strings.fr.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ NuGet nécessite des sources HTTPS. Pour utiliser des sources HTTP, vous devez d
<target state="translated">La source spécifiée '{0}' est non valide. Indiquez une source valide.</target>
<note>0 - The invalid source.</note>
</trans-unit>
<trans-unit id="Error_InvalidVersion">
<source>Invalid version value '{0}'. An exact NuGet version is required for this operation.</source>
<target state="new">Invalid version value '{0}'. An exact NuGet version is required for this operation.</target>
<note>0 - package version</note>
</trans-unit>
<trans-unit id="Error_InvalidVersionRange">
<source>Invalid version range '{0}'</source>
<target state="translated">Étendue de version non valide « {0} »</target>
Expand Down
5 changes: 5 additions & 0 deletions src/NuGet.Core/NuGet.CommandLine.XPlat/xlf/Strings.it.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ NuGet richiede origini HTTPS. Per utilizzare origini HTTP, è necessario imposta
<target state="translated">L'origine '{0}' specificata non è valida. Specificare un'origine valida.</target>
<note>0 - The invalid source.</note>
</trans-unit>
<trans-unit id="Error_InvalidVersion">
<source>Invalid version value '{0}'. An exact NuGet version is required for this operation.</source>
<target state="new">Invalid version value '{0}'. An exact NuGet version is required for this operation.</target>
<note>0 - package version</note>
</trans-unit>
<trans-unit id="Error_InvalidVersionRange">
<source>Invalid version range '{0}'</source>
<target state="translated">Intervallo versioni non valido '{0}'</target>
Expand Down
5 changes: 5 additions & 0 deletions src/NuGet.Core/NuGet.CommandLine.XPlat/xlf/Strings.ja.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ NuGet には HTTPS ソースが必要です。HTTP ソースを使用するに
<target state="translated">指定されたソース '{0}' が正しくありません。有効なソースを指定してください。</target>
<note>0 - The invalid source.</note>
</trans-unit>
<trans-unit id="Error_InvalidVersion">
<source>Invalid version value '{0}'. An exact NuGet version is required for this operation.</source>
<target state="new">Invalid version value '{0}'. An exact NuGet version is required for this operation.</target>
<note>0 - package version</note>
</trans-unit>
<trans-unit id="Error_InvalidVersionRange">
<source>Invalid version range '{0}'</source>
<target state="translated">バージョン範囲 '{0}' が無効です</target>
Expand Down
5 changes: 5 additions & 0 deletions src/NuGet.Core/NuGet.CommandLine.XPlat/xlf/Strings.ko.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ NuGet에는 HTTPS 원본이 필요합니다. HTTP 원본을 사용하려면 NuGe
<target state="translated">지정된 소스 '{0}'이(가) 올바르지 않습니다. 유효한 소스를 제공하세요.</target>
<note>0 - The invalid source.</note>
</trans-unit>
<trans-unit id="Error_InvalidVersion">
<source>Invalid version value '{0}'. An exact NuGet version is required for this operation.</source>
<target state="new">Invalid version value '{0}'. An exact NuGet version is required for this operation.</target>
<note>0 - package version</note>
</trans-unit>
<trans-unit id="Error_InvalidVersionRange">
<source>Invalid version range '{0}'</source>
<target state="translated">잘못된 버전 범위 '{0}'</target>
Expand Down
5 changes: 5 additions & 0 deletions src/NuGet.Core/NuGet.CommandLine.XPlat/xlf/Strings.pl.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ Menedżer NuGet wymaga źródeł HTTPS. Aby użyć źródeł HTTP, musisz wyraź
<target state="translated">Określone źródło „{0}” jest nieprawidłowe. Określ prawidłowe źródło.</target>
<note>0 - The invalid source.</note>
</trans-unit>
<trans-unit id="Error_InvalidVersion">
<source>Invalid version value '{0}'. An exact NuGet version is required for this operation.</source>
<target state="new">Invalid version value '{0}'. An exact NuGet version is required for this operation.</target>
<note>0 - package version</note>
</trans-unit>
<trans-unit id="Error_InvalidVersionRange">
<source>Invalid version range '{0}'</source>
<target state="translated">Nieprawidłowy zakres wersji „{0}”</target>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ O NuGet requer fontes HTTPS. Para usar fontes HTTP, você deve definir explicita
<target state="translated">A origem especificada '{0}' é inválida. Forneça uma origem válida.</target>
<note>0 - The invalid source.</note>
</trans-unit>
<trans-unit id="Error_InvalidVersion">
<source>Invalid version value '{0}'. An exact NuGet version is required for this operation.</source>
<target state="new">Invalid version value '{0}'. An exact NuGet version is required for this operation.</target>
<note>0 - package version</note>
</trans-unit>
<trans-unit id="Error_InvalidVersionRange">
<source>Invalid version range '{0}'</source>
<target state="translated">Intervalo de versão "{0}" inválido</target>
Expand Down
5 changes: 5 additions & 0 deletions src/NuGet.Core/NuGet.CommandLine.XPlat/xlf/Strings.ru.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ NuGet requires HTTPS sources. To use HTTP sources, you must explicitly set 'allo
<target state="translated">Указанный источник "{0}" является недопустимым. Укажите допустимый источник.</target>
<note>0 - The invalid source.</note>
</trans-unit>
<trans-unit id="Error_InvalidVersion">
<source>Invalid version value '{0}'. An exact NuGet version is required for this operation.</source>
<target state="new">Invalid version value '{0}'. An exact NuGet version is required for this operation.</target>
<note>0 - package version</note>
</trans-unit>
<trans-unit id="Error_InvalidVersionRange">
<source>Invalid version range '{0}'</source>
<target state="translated">Недопустимый диапазон версий "{0}"</target>
Expand Down
5 changes: 5 additions & 0 deletions src/NuGet.Core/NuGet.CommandLine.XPlat/xlf/Strings.tr.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,11 @@ NuGet için HTTPS kaynakları gereklidir. HTTP kaynaklarını kullanmak için Nu
<target state="translated">Belirtilen '{0}' kaynağı geçersiz. Geçerli bir kaynak belirtin.</target>
<note>0 - The invalid source.</note>
</trans-unit>
<trans-unit id="Error_InvalidVersion">
<source>Invalid version value '{0}'. An exact NuGet version is required for this operation.</source>
<target state="new">Invalid version value '{0}'. An exact NuGet version is required for this operation.</target>
<note>0 - package version</note>
</trans-unit>
<trans-unit id="Error_InvalidVersionRange">
<source>Invalid version range '{0}'</source>
<target state="translated">Geçersiz sürüm aralığı '{0}'</target>
Expand Down
Loading