diff --git a/src/Cli/dotnet/CommandFactory/CommandResolution/MuxerCommandSpecMaker.cs b/src/Cli/dotnet/CommandFactory/CommandResolution/MuxerCommandSpecMaker.cs index 63a3ecae1d5b..57b2db2ba6e0 100644 --- a/src/Cli/dotnet/CommandFactory/CommandResolution/MuxerCommandSpecMaker.cs +++ b/src/Cli/dotnet/CommandFactory/CommandResolution/MuxerCommandSpecMaker.cs @@ -38,7 +38,7 @@ internal static CommandSpec CreatePackageCommandSpecUsingMuxer( { if (rollForwardArgument.Any()) { - arguments.AddRange(commandArguments.Except(rollForwardArgument)); + arguments.AddRange(commandArguments.Where(arg => !arg.Equals("--allow-roll-forward", StringComparison.OrdinalIgnoreCase))); } else { diff --git a/test/dotnet.Tests/CommandTests/Tool/Run/ToolRunCommandTests.cs b/test/dotnet.Tests/CommandTests/Tool/Run/ToolRunCommandTests.cs index f122a680dc71..1616c16f9aae 100644 --- a/test/dotnet.Tests/CommandTests/Tool/Run/ToolRunCommandTests.cs +++ b/test/dotnet.Tests/CommandTests/Tool/Run/ToolRunCommandTests.cs @@ -43,6 +43,24 @@ public void WhenRunWithRollForwardOptionItShouldIncludeRollForwardInNativeHost() result.Args.Should().ContainAll("--roll-forward", "Major", fakeExecutable.Value); } + [Fact] + public void WhenRunWithRollForwardOptionItShouldPreserveDuplicateArgumentsForwardedToTool() + { + (FilePath fakeExecutable, LocalToolsCommandResolver localToolsCommandResolver) = DefaultSetup("a"); + IEnumerable testForwardArgument = ["--var", "a", "--var", "b"]; + + var result = localToolsCommandResolver.ResolveStrict(new CommandResolverArguments() + { + CommandName = "dotnet-a", + CommandArguments = testForwardArgument + }, allowRollForward: true); + + result.Should().NotBeNull(); + result.Args.Should().ContainAll("--roll-forward", "Major", fakeExecutable.Value); + // Verify duplicate forwarded arguments are preserved in order. + result.Args.Should().Contain("--var a --var b"); + } + [Fact] public void WhenRunWithoutRollForwardOptionItShouldNotIncludeRollForwardInNativeHost() {