Skip to content

Commit d3215e4

Browse files
authored
Respect VIRTUAL_ENV_DISABLE_PROMPT in nushell activation script (#2458)
Fixes #2461
1 parent 28f4067 commit d3215e4

File tree

2 files changed

+53
-28
lines changed

2 files changed

+53
-28
lines changed

docs/changelog/2461.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Make ``activate.nu`` respect ``VIRTUAL_ENV_DISABLE_PROMPT`` and not set the prompt if reqeusted - by :user:`m-lima`.

src/virtualenv/activation/nushell/activate.nu

Lines changed: 52 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,21 @@ export-env {
1515
$name in (env).name
1616
}
1717

18+
# Emulates a `test -z`, but btter as it handles e.g 'false'
19+
def is-env-true [name: string] {
20+
if (has-env $name) {
21+
# Try to parse 'true', '0', '1', and fail if not convertible
22+
let parsed = do -i { $env | get $name | into bool }
23+
if ($parsed | describe) == 'bool' {
24+
$parsed
25+
} else {
26+
not ($env | get $name | is-empty)
27+
}
28+
} else {
29+
false
30+
}
31+
}
32+
1833
let is_windows = ($nu.os-info.name | str downcase) == 'windows'
1934
let virtual_env = '__VIRTUAL_ENV__'
2035
let bin = '__BIN_NAME__'
@@ -49,44 +64,53 @@ export-env {
4964
let venv_path = ([$virtual_env $bin] | path join)
5065
let new_path = ($old_path | prepend $venv_path | str collect $path_sep)
5166

52-
# Creating the new prompt for the session
53-
let virtual_prompt = if ('__VIRTUAL_PROMPT__' == '') {
54-
$'(char lparen)($virtual_env | path basename)(char rparen) '
55-
} else {
56-
'(__VIRTUAL_PROMPT__) '
67+
let new_env = {
68+
$path_name : $new_path
69+
VIRTUAL_ENV : $virtual_env
5770
}
5871

59-
# Back up the old prompt builder
60-
let old_prompt_command = if (has-env 'VIRTUAL_ENV') and (has-env '_OLD_PROMPT_COMMAND') {
61-
$env._OLD_PROMPT_COMMAND
72+
let new_env = if (is-env-true 'VIRTUAL_ENV_DISABLE_PROMPT') {
73+
$new_env
6274
} else {
63-
if (has-env 'PROMPT_COMMAND') {
64-
$env.PROMPT_COMMAND
65-
} else {
66-
''
67-
}
68-
}
75+
# Creating the new prompt for the session
76+
let virtual_prompt = if ('__VIRTUAL_PROMPT__' == '') {
77+
$'(char lparen)($virtual_env | path basename)(char rparen) '
78+
} else {
79+
'(__VIRTUAL_PROMPT__) '
80+
}
6981

70-
# If there is no default prompt, then only the env is printed in the prompt
71-
let new_prompt = if (has-env 'PROMPT_COMMAND') {
72-
if ($old_prompt_command | describe) == 'block' {
73-
{ $'($virtual_prompt)(do $old_prompt_command)' }
74-
} else {
75-
{ $'($virtual_prompt)($old_prompt_command)' }
76-
}
77-
} else {
78-
{ $'($virtual_prompt)' }
79-
}
82+
# Back up the old prompt builder
83+
let old_prompt_command = if (has-env 'VIRTUAL_ENV') and (has-env '_OLD_PROMPT_COMMAND') {
84+
$env._OLD_PROMPT_COMMAND
85+
} else {
86+
if (has-env 'PROMPT_COMMAND') {
87+
$env.PROMPT_COMMAND
88+
} else {
89+
''
90+
}
91+
}
8092

81-
# Environment variables that will be loaded as the virtual env
82-
load-env {
83-
$path_name : $new_path
84-
VIRTUAL_ENV : $virtual_env
93+
# If there is no default prompt, then only the env is printed in the prompt
94+
let new_prompt = if (has-env 'PROMPT_COMMAND') {
95+
if ($old_prompt_command | describe) == 'block' {
96+
{ $'($virtual_prompt)(do $old_prompt_command)' }
97+
} else {
98+
{ $'($virtual_prompt)($old_prompt_command)' }
99+
}
100+
} else {
101+
{ $'($virtual_prompt)' }
102+
}
103+
104+
$new_env | merge {
85105
_OLD_VIRTUAL_PATH : ($old_path | str collect $path_sep)
86106
_OLD_PROMPT_COMMAND : $old_prompt_command
87107
PROMPT_COMMAND : $new_prompt
88108
VIRTUAL_PROMPT : $virtual_prompt
109+
}
89110
}
111+
112+
# Environment variables that will be loaded as the virtual env
113+
load-env $new_env
90114
}
91115

92116
export alias pydoc = python -m pydoc

0 commit comments

Comments
 (0)