From 01be29394dac1419e78c3035114a18b08c39f966 Mon Sep 17 00:00:00 2001 From: Eduardo Villalpando Mello Date: Fri, 11 Apr 2025 13:23:39 -0700 Subject: [PATCH 1/4] package-add: use PackageIdentityArgument --- .../Package/Add/PackageAddCommandParser.cs | 40 +------------------ 1 file changed, 2 insertions(+), 38 deletions(-) diff --git a/src/Cli/dotnet/Commands/Package/Add/PackageAddCommandParser.cs b/src/Cli/dotnet/Commands/Package/Add/PackageAddCommandParser.cs index ea394d0634c0..119d4564d2b7 100644 --- a/src/Cli/dotnet/Commands/Package/Add/PackageAddCommandParser.cs +++ b/src/Cli/dotnet/Commands/Package/Add/PackageAddCommandParser.cs @@ -13,44 +13,8 @@ namespace Microsoft.DotNet.Cli.Commands.Package.Add; internal static class PackageAddCommandParser { - public static PackageIdentity ParsePackageIdentity(ArgumentResult packageArgResult) - { - // per the Arity of the CmdPackageArgument's Arity, we should have exactly one token - - // this is a safety net for if we change the Arity in the future and forget to update this parser. - if (packageArgResult.Tokens.Count != 1) - { - throw new ArgumentException($"Expected exactly one token, but got {packageArgResult.Tokens.Count}."); - } - var token = packageArgResult.Tokens[0].Value; - var indexOfAt = token.IndexOf('@'); - if (indexOfAt == -1) - { - // no version specified, so we just return the package id - return new PackageIdentity(token, null); - } - // we have a version specified, so we need to split the token into id and version - else - { - var id = token[0..indexOfAt]; - var versionString = token[(indexOfAt + 1)..]; - if (SemanticVersion.TryParse(versionString, out var version)) - { - return new PackageIdentity(id, new NuGetVersion(version.Major, version.Minor, version.Patch, version.ReleaseLabels, version.Metadata)); - } - else - { - throw new ArgumentException(string.Format(CliCommandStrings.InvalidSemVerVersionString, versionString)); - } - }; - } - - public static readonly CliArgument CmdPackageArgument = new DynamicArgument(CliCommandStrings.CmdPackage) - { - Description = CliCommandStrings.CmdPackageDescription, - Arity = ArgumentArity.ExactlyOne, - CustomParser = ParsePackageIdentity, - - }.AddCompletions((context) => + public static readonly CliArgument CmdPackageArgument = CommonArguments.PackageIdentityArgument(true) + .AddCompletions((context) => { // we should take --prerelease flags into account for version completion var allowPrerelease = context.ParseResult.GetValue(PrereleaseOption); From 305ea13c9850361bf34333681a665f7f3afc1c6d Mon Sep 17 00:00:00 2001 From: Eduardo Villalpando Mello Date: Fri, 11 Apr 2025 14:28:50 -0700 Subject: [PATCH 2/4] CommonArguments.ParsePackageIdentity refactor --- src/Cli/dotnet/CommonArguments.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Cli/dotnet/CommonArguments.cs b/src/Cli/dotnet/CommonArguments.cs index edc9d1ac1107..816733ae2974 100644 --- a/src/Cli/dotnet/CommonArguments.cs +++ b/src/Cli/dotnet/CommonArguments.cs @@ -18,19 +18,19 @@ internal class CommonArguments { HelpName = "PACKAGE_ID", Description = CliStrings.PackageIdentityArgumentDescription, - CustomParser = ParsePackageIdentity, + CustomParser = (ArgumentResult argumentResult) => ParsePackageIdentity(argumentResult.Tokens[0]?.Value), Arity = requireArgument ? ArgumentArity.ExactlyOne : ArgumentArity.ZeroOrOne, }; - private static PackageIdentity? ParsePackageIdentity(ArgumentResult argumentResult) + private static PackageIdentity? ParsePackageIdentity(string packageIdentity) { - if (argumentResult.Tokens.Count == 0) + if (string.IsNullOrEmpty(packageIdentity)) { return null; } - string[] splitToken = argumentResult.Tokens[0].Value.Split('@'); - var (packageId, versionString) = (splitToken.ElementAtOrDefault(0), splitToken.ElementAtOrDefault(1)); + string[] splitPackageIdentity = packageIdentity.Split('@'); + var (packageId, versionString) = (splitPackageIdentity.ElementAtOrDefault(0), splitPackageIdentity.ElementAtOrDefault(1)); if (string.IsNullOrEmpty(packageId)) { From 10ccdd5d579fcbd17870fb16d7fd4ed89ece878f Mon Sep 17 00:00:00 2001 From: Eduardo Villalpando Mello Date: Mon, 14 Apr 2025 11:58:49 -0700 Subject: [PATCH 3/4] Update CliSnapshotTests --- .../bash/DotnetCliSnapshotTests.VerifyCompletions.verified.sh | 3 +-- .../DotnetCliSnapshotTests.VerifyCompletions.verified.ps1 | 4 ---- .../zsh/DotnetCliSnapshotTests.VerifyCompletions.verified.zsh | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/test/dotnet.Tests/CompletionTests/snapshots/bash/DotnetCliSnapshotTests.VerifyCompletions.verified.sh b/test/dotnet.Tests/CompletionTests/snapshots/bash/DotnetCliSnapshotTests.VerifyCompletions.verified.sh index 5ba197bcfa69..de504c2bb0bd 100644 --- a/test/dotnet.Tests/CompletionTests/snapshots/bash/DotnetCliSnapshotTests.VerifyCompletions.verified.sh +++ b/test/dotnet.Tests/CompletionTests/snapshots/bash/DotnetCliSnapshotTests.VerifyCompletions.verified.sh @@ -1059,7 +1059,6 @@ _testhost_package_add() { COMPREPLY=() opts="--version --framework --no-restore --source --package-directory --interactive --prerelease --project --help" - opts="$opts $(${COMP_WORDS[0]} complete --position ${COMP_POINT} ${COMP_LINE} 2>/dev/null | tr '\n' ' ')" if [[ $COMP_CWORD == "$1" ]]; then COMPREPLY=( $(compgen -W "$opts" -- "$cur") ) @@ -2224,4 +2223,4 @@ _testhost_completions_script() { -complete -F _testhost testhost +complete -F _testhost testhost \ No newline at end of file diff --git a/test/dotnet.Tests/CompletionTests/snapshots/pwsh/DotnetCliSnapshotTests.VerifyCompletions.verified.ps1 b/test/dotnet.Tests/CompletionTests/snapshots/pwsh/DotnetCliSnapshotTests.VerifyCompletions.verified.ps1 index 8e90c6fd8b76..b6b8f25c34c4 100644 --- a/test/dotnet.Tests/CompletionTests/snapshots/pwsh/DotnetCliSnapshotTests.VerifyCompletions.verified.ps1 +++ b/test/dotnet.Tests/CompletionTests/snapshots/pwsh/DotnetCliSnapshotTests.VerifyCompletions.verified.ps1 @@ -610,10 +610,6 @@ Register-ArgumentCompleter -Native -CommandName 'testhost' -ScriptBlock { [CompletionResult]::new('--help', '-h', [CompletionResultType]::ParameterName, "Show command line help.") ) $completions += $staticCompletions - $text = $commandAst.ToString() - $dotnetCompleteResults = @(dotnet complete --position $cursorPosition "$text") | Where-Object { $_ -NotMatch "^-|^/" } - $dynamicCompletions = $dotnetCompleteResults | Foreach-Object { [CompletionResult]::new($_, $_, [CompletionResultType]::ParameterValue, $_) } - $completions += $dynamicCompletions break } 'testhost;package;list' { diff --git a/test/dotnet.Tests/CompletionTests/snapshots/zsh/DotnetCliSnapshotTests.VerifyCompletions.verified.zsh b/test/dotnet.Tests/CompletionTests/snapshots/zsh/DotnetCliSnapshotTests.VerifyCompletions.verified.zsh index 80df2c7a686c..92a785040ac6 100644 --- a/test/dotnet.Tests/CompletionTests/snapshots/zsh/DotnetCliSnapshotTests.VerifyCompletions.verified.zsh +++ b/test/dotnet.Tests/CompletionTests/snapshots/zsh/DotnetCliSnapshotTests.VerifyCompletions.verified.zsh @@ -596,7 +596,7 @@ _testhost() { '--project=[The project file to operate on. If a file is not specified, the command will search the current directory for one.]: : ' \ '--help[Show command line help.]' \ '-h[Show command line help.]' \ - ':PACKAGE_NAME -- The package reference to add. This can be in the form of just the package identifier, for example '\''Newtonsoft.Json'\'', or a package identifier and version separated by '\''@'\'', for example '\''Newtonsoft.Json@13.0.3'\'':->dotnet_dynamic_complete' \ + ':packageId -- Package reference in the form of a package identifier like '\''Newtonsoft.Json'\'' or package identifier and version separated by '\''@'\'' like '\''Newtonsoft.Json@13.0.3'\''.: ' \ && ret=0 case $state in (dotnet_dynamic_complete) From 94adf62ed3951a4ecf429bd89f12ba306de3e10a Mon Sep 17 00:00:00 2001 From: Eduardo Villalpando Mello Date: Wed, 16 Apr 2025 14:00:05 -0700 Subject: [PATCH 4/4] Update CliArgument -> Argument --- src/Cli/dotnet/Commands/Package/Add/PackageAddCommandParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Cli/dotnet/Commands/Package/Add/PackageAddCommandParser.cs b/src/Cli/dotnet/Commands/Package/Add/PackageAddCommandParser.cs index c164b67f900e..17a4e435b96a 100644 --- a/src/Cli/dotnet/Commands/Package/Add/PackageAddCommandParser.cs +++ b/src/Cli/dotnet/Commands/Package/Add/PackageAddCommandParser.cs @@ -13,7 +13,7 @@ namespace Microsoft.DotNet.Cli.Commands.Package.Add; internal static class PackageAddCommandParser { - public static readonly CliArgument CmdPackageArgument = CommonArguments.PackageIdentityArgument(true) + public static readonly Argument CmdPackageArgument = CommonArguments.PackageIdentityArgument(true) .AddCompletions((context) => { // we should take --prerelease flags into account for version completion