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

Respect VIRTUAL_ENV_DISABLE_PROMPT in nushell activation script #2458

Merged
merged 3 commits into from Dec 5, 2022
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
80 changes: 52 additions & 28 deletions src/virtualenv/activation/nushell/activate.nu
Expand Up @@ -15,6 +15,21 @@ export-env {
$name in (env).name
}

# Emulates a `test -z`, but btter as it handles e.g 'false'
def is-env-true [name: string] {
if (has-env $name) {
# Try to parse 'true', '0', '1', and fail if not convertible
let parsed = do -i { $env | get $name | into bool }
if ($parsed | describe) == 'bool' {
$parsed
} else {
not ($env | get $name | is-empty)
}
} else {
false
}
}

let is_windows = ($nu.os-info.name | str downcase) == 'windows'
let virtual_env = '__VIRTUAL_ENV__'
let bin = '__BIN_NAME__'
Expand Down Expand Up @@ -49,44 +64,53 @@ export-env {
let venv_path = ([$virtual_env $bin] | path join)
let new_path = ($old_path | prepend $venv_path | str collect $path_sep)

# Creating the new prompt for the session
let virtual_prompt = if ('__VIRTUAL_PROMPT__' == '') {
$'(char lparen)($virtual_env | path basename)(char rparen) '
} else {
'(__VIRTUAL_PROMPT__) '
let new_env = {
$path_name : $new_path
VIRTUAL_ENV : $virtual_env
}

# Back up the old prompt builder
let old_prompt_command = if (has-env 'VIRTUAL_ENV') and (has-env '_OLD_PROMPT_COMMAND') {
$env._OLD_PROMPT_COMMAND
let new_env = if (is-env-true 'VIRTUAL_ENV_DISABLE_PROMPT') {
$new_env
} else {
if (has-env 'PROMPT_COMMAND') {
$env.PROMPT_COMMAND
} else {
''
}
}
# Creating the new prompt for the session
let virtual_prompt = if ('__VIRTUAL_PROMPT__' == '') {
$'(char lparen)($virtual_env | path basename)(char rparen) '
} else {
'(__VIRTUAL_PROMPT__) '
}

# If there is no default prompt, then only the env is printed in the prompt
let new_prompt = if (has-env 'PROMPT_COMMAND') {
if ($old_prompt_command | describe) == 'block' {
{ $'($virtual_prompt)(do $old_prompt_command)' }
} else {
{ $'($virtual_prompt)($old_prompt_command)' }
}
} else {
{ $'($virtual_prompt)' }
}
# Back up the old prompt builder
let old_prompt_command = if (has-env 'VIRTUAL_ENV') and (has-env '_OLD_PROMPT_COMMAND') {
$env._OLD_PROMPT_COMMAND
} else {
if (has-env 'PROMPT_COMMAND') {
$env.PROMPT_COMMAND
} else {
''
}
}

# Environment variables that will be loaded as the virtual env
load-env {
$path_name : $new_path
VIRTUAL_ENV : $virtual_env
# If there is no default prompt, then only the env is printed in the prompt
let new_prompt = if (has-env 'PROMPT_COMMAND') {
if ($old_prompt_command | describe) == 'block' {
{ $'($virtual_prompt)(do $old_prompt_command)' }
} else {
{ $'($virtual_prompt)($old_prompt_command)' }
}
} else {
{ $'($virtual_prompt)' }
}

$new_env | insert {
_OLD_VIRTUAL_PATH : ($old_path | str collect $path_sep)
_OLD_PROMPT_COMMAND : $old_prompt_command
PROMPT_COMMAND : $new_prompt
VIRTUAL_PROMPT : $virtual_prompt
}
}

# Environment variables that will be loaded as the virtual env
load-env $new_env
}

export alias pydoc = python -m pydoc
Expand Down