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}\"";
}
///