From 9774f8f1d4361f8d1070803a10de1f4268800979 Mon Sep 17 00:00:00 2001 From: chisato <67509746+yumeminami@users.noreply.github.com> Date: Tue, 9 Dec 2025 22:39:55 +0800 Subject: [PATCH] Fix relocatable nushell activation script (#17036) ## Summary Nushell activation now computes the venv root dynamically via path self for relocatable venvs, while non-relocatable venvs still embed a quoted absolute path Still keep `activate.csh` (maybe delete is also an option) close https://github.com/astral-sh/uv/issues/16973 --- crates/uv-virtualenv/src/activator/activate.nu | 2 +- crates/uv-virtualenv/src/virtualenv.rs | 9 ++++++++- crates/uv/tests/it/venv.rs | 6 ++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/crates/uv-virtualenv/src/activator/activate.nu b/crates/uv-virtualenv/src/activator/activate.nu index a13067994..6543a4fe1 100644 --- a/crates/uv-virtualenv/src/activator/activate.nu +++ b/crates/uv-virtualenv/src/activator/activate.nu @@ -68,7 +68,7 @@ export-env { } } - let virtual_env = '{{ VIRTUAL_ENV_DIR }}' + let virtual_env = {{ VIRTUAL_ENV_DIR }} let bin = '{{ BIN_NAME }}' let path_name = if (has-env 'Path') { 'Path' } else { 'PATH' } let venv_path = ([$virtual_env $bin] | path join) diff --git a/crates/uv-virtualenv/src/virtualenv.rs b/crates/uv-virtualenv/src/virtualenv.rs index 04b4c1016..3f4dca4d4 100644 --- a/crates/uv-virtualenv/src/virtualenv.rs +++ b/crates/uv-virtualenv/src/virtualenv.rs @@ -463,8 +463,15 @@ pub(crate) fn create( (true, "activate.fish") => { r#"'"$(dirname -- "$(cd "$(dirname -- "$(status -f)")"; and pwd)")"'"#.to_string() } + (true, "activate.nu") => r"(path self | path dirname | path dirname)".to_string(), + (false, "activate.nu") => { + format!( + "'{}'", + escape_posix_for_single_quotes(location.simplified().to_str().unwrap()) + ) + } // Note: - // * relocatable activate scripts appear not to be possible in csh and nu shell + // * relocatable activate scripts appear not to be possible in csh. // * `activate.ps1` is already relocatable by default. _ => escape_posix_for_single_quotes(location.simplified().to_str().unwrap()), }; diff --git a/crates/uv/tests/it/venv.rs b/crates/uv/tests/it/venv.rs index fa5a0161d..c2b9761aa 100644 --- a/crates/uv/tests/it/venv.rs +++ b/crates/uv/tests/it/venv.rs @@ -1296,6 +1296,12 @@ fn verify_pyvenv_cfg_relocatable() { let activate_fish = scripts.child("activate.fish"); activate_fish.assert(predicates::path::is_file()); activate_fish.assert(predicates::str::contains(r#"set -gx VIRTUAL_ENV ''"$(dirname -- "$(cd "$(dirname -- "$(status -f)")"; and pwd)")"''"#)); + + let activate_nu = scripts.child("activate.nu"); + activate_nu.assert(predicates::path::is_file()); + activate_nu.assert(predicates::str::contains( + r"let virtual_env = (path self | path dirname | path dirname)", + )); } /// Ensure that a nested virtual environment uses the same `home` directory as the parent.