From 9237ad7134324ba56199ab0f29b680369fc5f805 Mon Sep 17 00:00:00 2001 From: NeuralFault <65365345+NeuralFault@users.noreply.github.com> Date: Fri, 1 May 2026 17:24:52 -0400 Subject: [PATCH 1/3] Fix pip requirements parsing for environment markers and escape quoted marker values correctly --- StabilityMatrix.Core/Python/PipInstallArgs.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/StabilityMatrix.Core/Python/PipInstallArgs.cs b/StabilityMatrix.Core/Python/PipInstallArgs.cs index 420410166..6c58430d1 100644 --- a/StabilityMatrix.Core/Python/PipInstallArgs.cs +++ b/StabilityMatrix.Core/Python/PipInstallArgs.cs @@ -54,7 +54,15 @@ public PipInstallArgs WithParsedFromRequirementsTxt( requirementsEntries = requirementsEntries.Where(s => !excludeRegex.IsMatch(s)); } - return this.AddArgs(requirementsEntries.Select(Argument.Quoted).ToArray()); + return this.AddArgs(requirementsEntries.Select(ToRequirementArgument).ToArray()); + } + + private static Argument ToRequirementArgument(string requirementEntry) + { + if (requirementEntry.StartsWith('-')) + return Argument.Quoted(requirementEntry); + + return new Argument(requirementEntry); } /// From 61ce94bb18d2e2dc096e9dca2b02729d8e8baf32 Mon Sep 17 00:00:00 2001 From: NeuralFault <65365345+NeuralFault@users.noreply.github.com> Date: Fri, 1 May 2026 17:26:49 -0400 Subject: [PATCH 2/3] Add test for environment marker in requirements.txt --- .../Core/PipInstallArgsTests.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/StabilityMatrix.Tests/Core/PipInstallArgsTests.cs b/StabilityMatrix.Tests/Core/PipInstallArgsTests.cs index 29a956aa9..cc7244cb1 100644 --- a/StabilityMatrix.Tests/Core/PipInstallArgsTests.cs +++ b/StabilityMatrix.Tests/Core/PipInstallArgsTests.cs @@ -81,6 +81,26 @@ public void TestParsedFromRequirementsTxt() Assert.AreEqual("torch~=2.0.0 torchvision --extra-index-url https://example.org", args.ToString()); } + [TestMethod] + public void TestParsedFromRequirementsTxt_KeepsEnvironmentMarkerRequirementAsSingleArgument() + { + const string requirements = """ + onnxruntime-gpu==1.22.0; python_version < "3.11" + """; + + var args = new PipInstallArgs().WithParsedFromRequirementsTxt(requirements).ToProcessArgs(); + + Assert.AreEqual(1, args.Count()); + Assert.AreEqual( + "\"onnxruntime-gpu==1.22.0; python_version < \\\"3.11\\\"\"", + args.Single().GetQuotedValue() + ); + Assert.AreEqual( + "\"onnxruntime-gpu==1.22.0; python_version < \\\"3.11\\\"\"", + args.ToString() + ); + } + [TestMethod] public void TestWithUserOverrides() { From 7f241b562873ef1c6fa3bdb599ddf4a6924a8bd5 Mon Sep 17 00:00:00 2001 From: NeuralFault <65365345+NeuralFault@users.noreply.github.com> Date: Fri, 1 May 2026 17:49:05 -0400 Subject: [PATCH 3/3] Refactor Quote method for argument quoting --- StabilityMatrix.Core/Processes/ProcessRunner.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/StabilityMatrix.Core/Processes/ProcessRunner.cs b/StabilityMatrix.Core/Processes/ProcessRunner.cs index e830a0e24..665e91fc6 100644 --- a/StabilityMatrix.Core/Processes/ProcessRunner.cs +++ b/StabilityMatrix.Core/Processes/ProcessRunner.cs @@ -651,8 +651,15 @@ public static Task RunBashCommand( /// public static string Quote(string argument) { - var inner = argument.Trim('"'); - return inner.Contains(' ') ? $"\"{inner}\"" : argument; + var inner = argument.Length >= 2 && argument.StartsWith('"') && argument.EndsWith('"') + ? argument[1..^1] + : argument; + + if (!inner.Contains(' ') && !inner.Contains('"')) + return argument; + + var escaped = inner.Replace("\"", "\\\""); + return $"\"{escaped}\""; } ///