Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update shell_init for nushell #3771

Draft
wants to merge 11 commits into
base: main
Choose a base branch
from
Prev Previous commit
Next Next commit
Fixed remaining issues
  • Loading branch information
cvanelteren committed Mar 18, 2025
commit cb69396890836a7d2edf4cdab8fd949c3a79ffb4
13 changes: 6 additions & 7 deletions libmamba/src/core/activation.cpp
Original file line number Diff line number Diff line change
@@ -1248,32 +1248,31 @@ namespace mamba

if (!env_transform.export_path.empty())
{
out << "PATH = " << env_transform.export_path << util:on_win ? ';' : ':';
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)
{
// add unix or windows handling
out << ekey << " = " << evar << util:on_win ? ';' : ':';
out << ekey << " = " << evar << "\n";
}
for (const fs::u8path& p : env_transform.activate_scripts)
{
out << "source " << p << ";";
out << "source " << p << "\n";
}
return out.str();
}
83 changes: 49 additions & 34 deletions libmamba/src/core/shell_init.cpp
Original file line number Diff line number Diff line change
@@ -489,48 +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 (if $nu.os-info.name == "windows" { ";" } else { ":" })
| parse --regex '(.*)=(.+)'
| transpose --header-row
| into record
| load-env
)
$env.PATH = $env.PATH | split row (char esep)
# 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 $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}
}
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();
}