103 lines
3.8 KiB
Python
103 lines
3.8 KiB
Python
"""Fake uv executable used by behavioral Windows installer tests."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
import subprocess
|
|
|
|
|
|
_FAKE_UV = r'''
|
|
using System;
|
|
using System.IO;
|
|
using System.Linq;
|
|
|
|
public static class FakeUv {
|
|
public static int Main(string[] args) {
|
|
if (Path.GetFileName(Environment.GetCommandLineArgs()[0]).Equals(
|
|
"python.exe", StringComparison.OrdinalIgnoreCase)) {
|
|
Console.WriteLine(Environment.GetEnvironmentVariable("FAKE_PYTHON_VERSION")
|
|
?? "Python 3.11.0");
|
|
return 0;
|
|
}
|
|
|
|
File.AppendAllText(Environment.GetEnvironmentVariable("FAKE_UV_LOG"),
|
|
string.Join(" ", args) + Environment.NewLine);
|
|
|
|
if (args.Length >= 2 && args[0] == "python" && args[1] == "find") {
|
|
string findDelayMs = Environment.GetEnvironmentVariable(
|
|
"FAKE_UV_FIND_DELAY_MS");
|
|
if (!string.IsNullOrEmpty(findDelayMs)) {
|
|
System.Threading.Thread.Sleep(int.Parse(findDelayMs));
|
|
}
|
|
string stderrBytes = Environment.GetEnvironmentVariable(
|
|
"FAKE_UV_FIND_STDERR_BYTES");
|
|
if (!string.IsNullOrEmpty(stderrBytes)) {
|
|
Console.Error.Write(new string('x', int.Parse(stderrBytes)));
|
|
}
|
|
bool managed = args.Contains("--managed-python");
|
|
string availableVersion = Environment.GetEnvironmentVariable(
|
|
"FAKE_MANAGED_PYTHON_VERSION");
|
|
if (managed && !string.IsNullOrEmpty(availableVersion)
|
|
&& (args.Length < 3 || args[2] != availableVersion)) {
|
|
return 1;
|
|
}
|
|
Console.WriteLine(Environment.GetEnvironmentVariable(
|
|
managed ? "FAKE_MANAGED_PYTHON" : "FAKE_THIRD_PARTY_PYTHON"));
|
|
return 0;
|
|
}
|
|
if (args.Length >= 2 && args[0] == "python" && args[1] == "install") {
|
|
return 0;
|
|
}
|
|
if (args.Length >= 2 && args[0] == "venv" && args[1] == "venv") {
|
|
string forcedExit = Environment.GetEnvironmentVariable("FAKE_UV_VENV_EXIT");
|
|
if (!string.IsNullOrEmpty(forcedExit)) {
|
|
return int.Parse(forcedExit);
|
|
}
|
|
string managedPython = Environment.GetEnvironmentVariable("FAKE_MANAGED_PYTHON");
|
|
int pythonAt = Array.IndexOf(args, "--python");
|
|
bool correctPython = pythonAt >= 0 && pythonAt + 1 < args.Length
|
|
&& string.Equals(args[pythonAt + 1], managedPython,
|
|
StringComparison.OrdinalIgnoreCase);
|
|
if (!correctPython || !args.Contains("--managed-python")
|
|
|| !args.Contains("--no-python-downloads")) {
|
|
return 42;
|
|
}
|
|
string scripts = Path.Combine(Environment.CurrentDirectory, "venv", "Scripts");
|
|
Directory.CreateDirectory(scripts);
|
|
File.Copy(managedPython, Path.Combine(scripts, "python.exe"), true);
|
|
return 0;
|
|
}
|
|
return 2;
|
|
}
|
|
}
|
|
'''
|
|
|
|
|
|
def compile_fake_uv(powershell: str, output: Path) -> None:
|
|
source = output.with_suffix(".cs")
|
|
source.write_text(_FAKE_UV, encoding="utf-8")
|
|
compile_script = output.with_name("compile-fake-uv.ps1")
|
|
compile_script.write_text(
|
|
"param([string]$Source, [string]$Output)\n"
|
|
"Add-Type -Path $Source -OutputAssembly $Output "
|
|
"-OutputType ConsoleApplication\n",
|
|
encoding="utf-8",
|
|
)
|
|
subprocess.run(
|
|
[
|
|
powershell,
|
|
"-NoProfile",
|
|
"-ExecutionPolicy",
|
|
"Bypass",
|
|
"-File",
|
|
str(compile_script),
|
|
"-Source",
|
|
str(source),
|
|
"-Output",
|
|
str(output),
|
|
],
|
|
check=True,
|
|
capture_output=True,
|
|
text=True,
|
|
)
|