|
16 | 16 | _llama_cpp_rebuild_cmd, |
17 | 17 | _append_vllm_linux_preflight_lines, |
18 | 18 | _local_tooling_path_export, |
| 19 | + _local_windows_bash_env_prefix, |
19 | 20 | _pip_install_attempt, |
20 | 21 | _pip_install_fallback_chain, |
21 | 22 | _ollama_bind_from_cmd, |
@@ -107,6 +108,70 @@ def test_safe_env_prefix_accepts_powershell_activation_path(): |
107 | 108 | ) |
108 | 109 |
|
109 | 110 |
|
| 111 | +@pytest.mark.parametrize( |
| 112 | + ("prefix", "expected"), |
| 113 | + [ |
| 114 | + ("& 'C:\\Users\\me\\venv\\Scripts\\Activate.ps1'", "source /c/Users/me/venv/Scripts/activate"), |
| 115 | + (r"& C:\Users\me\venv\Scripts\Activate.ps1", "source /c/Users/me/venv/Scripts/activate"), |
| 116 | + ( |
| 117 | + r"& C:\Users\me\My Envs\venv\Scripts\Activate.ps1", |
| 118 | + "source '/c/Users/me/My Envs/venv/Scripts/activate'", |
| 119 | + ), |
| 120 | + ( |
| 121 | + "& 'C:\\Users\\me\\My Envs\\venv\\Scripts\\Activate.ps1'", |
| 122 | + "source '/c/Users/me/My Envs/venv/Scripts/activate'", |
| 123 | + ), |
| 124 | + (r"& D:/Envs/venv/Scripts/Activate.ps1", "source /d/Envs/venv/Scripts/activate"), |
| 125 | + ], |
| 126 | +) |
| 127 | +def test_local_windows_bash_env_prefix_converts_powershell_venv_activation(prefix, expected): |
| 128 | + converted = _local_windows_bash_env_prefix(prefix) |
| 129 | + |
| 130 | + assert converted == expected |
| 131 | + assert _safe_env_prefix(converted).startswith('[ -f "') |
| 132 | + |
| 133 | + |
| 134 | +@pytest.mark.parametrize( |
| 135 | + "prefix", |
| 136 | + [ |
| 137 | + None, |
| 138 | + "", |
| 139 | + "source /home/me/venv/bin/activate", |
| 140 | + "conda activate qwen35", |
| 141 | + 'eval "$(conda shell.bash hook)" && conda activate qwen35', |
| 142 | + r"& \\server\share\venv\Scripts\Activate.ps1", |
| 143 | + ], |
| 144 | +) |
| 145 | +def test_local_windows_bash_env_prefix_leaves_other_prefixes_unchanged(prefix): |
| 146 | + assert _local_windows_bash_env_prefix(prefix) == prefix |
| 147 | + |
| 148 | + |
| 149 | +def test_local_windows_bash_env_prefix_handles_long_whitespace_input(): |
| 150 | + prefix = "\t" * 100_000 |
| 151 | + |
| 152 | + assert _local_windows_bash_env_prefix(prefix) == prefix |
| 153 | + |
| 154 | + |
| 155 | +@pytest.mark.parametrize( |
| 156 | + "relative_path", |
| 157 | + ["static/js/cookbookRunning.js", "static/js/cookbookDownload.js"], |
| 158 | +) |
| 159 | +def test_primary_windows_venv_emitters_quote_activation_path(relative_path): |
| 160 | + source = (Path(__file__).resolve().parents[1] / relative_path).read_text(encoding="utf-8") |
| 161 | + |
| 162 | + assert "'& ' + _psQuote(" in source |
| 163 | + assert "_psQuote = shared._psQuote;" in source |
| 164 | + |
| 165 | + |
| 166 | +def test_windows_venv_conversion_stays_scoped_to_local_git_bash_runners(): |
| 167 | + source = (Path(__file__).resolve().parents[1] / "routes/cookbook_routes.py").read_text(encoding="utf-8") |
| 168 | + guarded_conversion = ( |
| 169 | + "_local_windows_bash_env_prefix(req.env_prefix) if local_windows else req.env_prefix" |
| 170 | + ) |
| 171 | + |
| 172 | + assert source.count(guarded_conversion) == 2 |
| 173 | + |
| 174 | + |
110 | 175 | def test_validate_local_dir_accepts_external_drive_paths_with_spaces(): |
111 | 176 | path = "/Volumes/T7 2TB/AI Models/llamacpp" |
112 | 177 |
|
|
0 commit comments