Fix nushell env for Windows (#3880)

Co-authored-by: Weng Wei <wuvist@gmail.com>
This commit is contained in:
Casper van Elteren 2025-04-25 15:59:44 +02:00 committed by GitHub
parent 306e4542a1
commit 3364c8e2d7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 55 additions and 40 deletions

View File

@ -1248,32 +1248,31 @@ namespace mamba
if (!env_transform.export_path.empty())
{
out << "PATH = " << env_transform.export_path << ";";
out << "PATH = " << env_transform.export_path << (util::on_win ? ';' : ':') << "\n";
}
for (const fs::u8path& ds : env_transform.deactivate_scripts)
{
out << "source " << ds << ";";
out << "source " << ds << "\n";
}
for (const std::string& uvar : env_transform.unset_vars)
{
out << "hide-env " << uvar << ";";
out << "hide-env " << uvar << "\n";
}
for (const auto& [skey, svar] : env_transform.set_vars)
{
out << "let " << skey << " = " << svar << ";";
out << "let " << skey << " = " << svar << "\n";
}
for (const auto& [ekey, evar] : env_transform.export_vars)
{
out << ekey << " = " << evar << ";";
out << ekey << " = " << evar << "\n";
}
for (const fs::u8path& p : env_transform.activate_scripts)
{
out << "source " << p << ";";
out << "source " << p << "\n";
}
return out.str();
}

View File

@ -489,47 +489,63 @@ namespace mamba
// TODO the following shouldn't live here but in a shell hook
content << R"nu(def --env ")nu" << exe_name << R"nu( activate" [name: string] {)nu";
content << R"###(
#add condabin when base env
if $env.MAMBA_SHLVL? == null {
$env.MAMBA_SHLVL = 0
$env.PATH = ($env.PATH | prepend $"($env.MAMBA_ROOT_PREFIX)/condabin")
}
#ask mamba how to setup the environment and set the environment
(^($env.MAMBA_EXE) shell activate --shell nu $name
| str replace --regex '\s+' '' --all
| split row ";"
| parse --regex '(.*)=(.+)'
| transpose --header-row
| into record
| load-env
)
# update prompt
if ($env.CONDA_PROMPT_MODIFIER? != null) {
$env.PROMPT_COMMAND = {|| $env.CONDA_PROMPT_MODIFIER + (do $env.PROMPT_COMMAND_BK)}
}
})###" << "\n";
#add condabin when base env
if $env.MAMBA_SHLVL? == null {
$env.MAMBA_SHLVL = 0
$env.PATH = ($env.PATH | prepend $"($env.MAMBA_ROOT_PREFIX)/condabin")
}
try {
let new_env = ^($env.MAMBA_EXE) shell activate --shell nu $name
# Process and load environment only if mamba command succeeded
$new_env
| lines
| str replace --regex '\s+' '' --all
| parse --regex '([^=]+)=(.+)'
| reduce -f {} { |it, acc|
$acc | merge {
$it.capture0: (
if ($it.capture0 == "PATH") or ($it.capture0 | str ends-with "_PATH") {
$it.capture1 | split row (if $nu.os-info.name == "Windows" { ";" } else { ":" }) | where { |path| $path != "" }
} else {
$it.capture1
}
)
}
} | load-env
# Set up prompt
$env.CONDA_PROMPT_MODIFIER = "(" + $name + ")"
if ($env.PROMPT_COMMAND_BK? == null) {
$env.PROMPT_COMMAND_BK = $env.PROMPT_COMMAND
}
$env.PROMPT_COMMAND = {|| $env.CONDA_PROMPT_MODIFIER + " " + (do $env.PROMPT_COMMAND_BK)}
} catch { | err |
echo $"Failed to activate ($name) environment: ($err.msg)"
}
})###" << "\n";
content << R"nu(def --env ")nu" << exe_name << R"nu( deactivate" [] {)nu";
content << R"###(
#remove active environment except base env
if $env.CONDA_PROMPT_MODIFIER? != null {
# unset set variables
for x in (^$env.MAMBA_EXE shell deactivate --shell nu
| split row ";") {
if ("hide-env" in $x) {
hide-env ($x | parse "hide-env {var}").var.0
} else if $x != "" {
let keyValue = ($x
| str replace --regex '\s+' "" --all
| parse '{key}={value}'
)
load-env {$keyValue.0.key: $keyValue.0.value}
}
for x in (^$env.MAMBA_EXE shell deactivate --shell nu
| split row (if $nu.os-info.name == "windows" { ";" } else { ":" })) {
if ("hide-env" in $x) {
hide-env ($x | parse "hide-env {var}").var.0
} else if $x != "" {
let keyValue = ($x
| str replace --regex '\s+' "" --all
| parse '{key}={value}'
)
load-env {$keyValue.0.key: $keyValue.0.value}
}
}
# reset prompt
$env.PROMPT_COMMAND = $env.PROMPT_COMMAND_BK
}
})###" << "\n";
)###" << "\n";
content << "# <<< mamba initialize <<<\n";
return content.str();
}