Support package@version syntax in dotnet new install, partial fix for #45422#45545
Support package@version syntax in dotnet new install, partial fix for #45422#45545Forgind merged 3 commits intodotnet:release/9.0.2xxfrom
Conversation
| string[] splitByColons = installArg.Split(["::"], StringSplitOptions.RemoveEmptyEntries); | ||
| string[] splitByAt = installArg.Split('@', StringSplitOptions.RemoveEmptyEntries); | ||
| string[] split = splitByColons.Length > splitByAt.Length ? splitByColons : | ||
| splitByAt.Length > splitByColons.Length ? splitByAt : |
There was a problem hiding this comment.
Why is this monstrosity necessary?
I wanted to avoid breaking changes. If one array is longer, that means it split more, and that means we should use it. If the arrays are the same length but the thing at the first index is shorter in one than the other, that means it parsed out (and dropped) (a) separator character(s), and we should use the shorter one.
We should really change CanInstallRemoteNuGetPackage_LatestVariations when we can finally get rid of support for ::
There was a problem hiding this comment.
Are you ever supposed to have more than one instance of either :: or @ in the argument?
It seems like you could check if the string contains ::. If it does, split on that, otherwise try splitting it on @.
There was a problem hiding this comment.
Hmm...there could be multiple...which also makes me wonder whether anyone would try dotnet new install package1::version1 package2@version2. The semi-reasonable reason someone might do that is if they have some script that takes optional 'additional' package@version things and runs dotnet new install with some 'base' package::version things.
What would you think of something like:
string[] split = installArgs.Split(["::"], StringSplitOptions.RemoveEntryEntries).Select(arg => arg.Split('@', StringSplitOptions.RemoveEmptyEntries)).Flatten().ToArray();
? That should support both cases.
dsplaisted
left a comment
There was a problem hiding this comment.
I think we should have tests for this, especially since we want to make sure we're not breaking anything.
Hopefully that's simple, since we just need to test how arguments are parsed.
| string[] splitByColons = installArg.Split(["::"], StringSplitOptions.RemoveEmptyEntries); | ||
| string[] splitByAt = installArg.Split('@', StringSplitOptions.RemoveEmptyEntries); | ||
| string[] split = splitByColons.Length > splitByAt.Length ? splitByColons : | ||
| splitByAt.Length > splitByColons.Length ? splitByAt : |
There was a problem hiding this comment.
Are you ever supposed to have more than one instance of either :: or @ in the argument?
It seems like you could check if the string contains ::. If it does, split on that, otherwise try splitting it on @.
Progress towards #45422
This adds support for package@version syntax without removing support for package::version syntax. I'll add a follow-up PR in main to add a warning, and then we can remove support for package::version syntax in .NET 11.