Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
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
@@ -0,0 +1,98 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

#nullable enable

using System;
using System.Collections.Generic;
using System.CommandLine.Parsing;
using System.Diagnostics.CodeAnalysis;
using NuGet.Versioning;

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

public NuGetVersion? NuGetVersion { get; init; }

internal static IReadOnlyList<NuGetPackageWithNuGetVersion> Parse(ArgumentResult result)
{
if (result.Tokens.Count == 0)
{
return [];
}

var packages = new List<NuGetPackageWithNuGetVersion>(result.Tokens.Count);

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

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

if (separatorIndex < 0)
{
packageId = token.Value;
}
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 (!NuGetVersion.TryParse(versionString, out newExactVersion))
{
result.AddError(Messages.Error_InvalidVersion(versionString));
return [];
}
}

var package = new NuGetPackageWithNuGetVersion
{
Id = packageId,
NuGetVersion = newExactVersion
};

packages.Add(package);
}

return packages;
}

public bool Equals(NuGetPackageWithNuGetVersion? x, NuGetPackageWithNuGetVersion? y)
{
if (ReferenceEquals(x, y))
{
return true;
}

if (x is null || y is null)
{
return false;
}

if (!x.Id.Equals(y.Id, StringComparison.OrdinalIgnoreCase))
{
return false;
}

return VersionComparer.Compare(x.NuGetVersion, y.NuGetVersion, VersionComparison.Default) == 0;
}

public int GetHashCode([DisallowNull] NuGetPackageWithNuGetVersion obj)
{
HashCode hash = new HashCode();
hash.Add(obj.Id, StringComparer.OrdinalIgnoreCase);
hash.Add(obj.NuGetVersion);
return hash.ToHashCode();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,21 @@
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 NuGetPackageWithVersionRange : IEqualityComparer<NuGetPackageWithVersionRange>
{
public required string Id { get; init; }
public required VersionRange? VersionRange { get; init; }

internal static IReadOnlyList<Package> Parse(ArgumentResult result)
internal static IReadOnlyList<NuGetPackageWithVersionRange> Parse(ArgumentResult result)
{
if (result.Tokens.Count == 0)
{
return [];
}

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

foreach (var token in result.Tokens)
{
Expand Down Expand Up @@ -51,7 +51,7 @@ internal static IReadOnlyList<Package> Parse(ArgumentResult result)
}
}

var package = new Package
var package = new NuGetPackageWithVersionRange
{
Id = packageId,
VersionRange = newVersion
Expand All @@ -62,7 +62,7 @@ internal static IReadOnlyList<Package> Parse(ArgumentResult result)
return packages;
}

public bool Equals(Package? x, Package? y)
public bool Equals(NuGetPackageWithVersionRange? x, NuGetPackageWithVersionRange? y)
{
if (ReferenceEquals(x, y))
{
Expand All @@ -82,7 +82,7 @@ public bool Equals(Package? x, Package? y)
return VersionRangeComparer.Default.Equals(x.VersionRange, y.VersionRange);
}

public int GetHashCode([DisallowNull] Package obj)
public int GetHashCode([DisallowNull] NuGetPackageWithVersionRange obj)
{
HashCode hash = new HashCode();
hash.Add(obj.Id, StringComparer.OrdinalIgnoreCase);
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<NuGetPackageWithVersionRange> 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<NuGetPackageWithVersionRange>>("packages")
{
Description = Strings.PackageUpdate_PackageArgumentDescription,
Arity = ArgumentArity.ZeroOrMore,
CustomParser = Package.Parse
CustomParser = NuGetPackageWithVersionRange.Parse
};
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<NuGetPackageWithVersionRange> 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<NuGetPackageWithVersionRange>? 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<NuGetPackageWithVersionRange> 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<(NuGetPackageWithVersionRange 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<(NuGetPackageWithVersionRange 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 NuGetPackageWithVersionRange { 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
Loading