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 activate.nu to support Linux and MacOS #2831

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 62 additions & 38 deletions src/virtualenv/activation/nushell/activate.nu
Original file line number Diff line number Diff line change
@@ -1,94 +1,118 @@
# virtualenv activation module
# Virtualenv activation module for Windows and Linux/macOS
# Activate with `overlay use activate.nu`
# Deactivate with `deactivate`, as usual
#
# To customize the overlay name, you can call `overlay use activate.nu as foo`,
# but then simply `deactivate` won't work because it is just an alias to hide
# the "activate" overlay. You'd need to call `overlay hide foo` manually.


export-env {
def is-string [x] {
($x | describe) == 'string'
}

def has-env [...names] {
$names | each {|n|
$n in $env
} | all {|i| $i == true}
def has-env [name: string] {
$name in $env
}

# Emulates a `test -z`, but better as it handles e.g 'false'
# Emulates a `test -z`, but better as it handles values like '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 })
let parsed = do -i { $env | get $name | into bool }
if ($parsed | describe) == 'bool' {
$parsed
} else {
not ($env | get -i $name | is-empty)
not ($env | get $name | is-empty)
}
} else {
false
}
}

let virtual_env = __VIRTUAL_ENV__
let bin = __BIN_NAME__
# Detect OS (Windows or Linux/macOS)
let os_name = ($nu.os-info.name | str downcase)
let is_windows = $os_name == 'windows'
let is_macos = $os_name == 'macos'
let is_linux = $os_name == 'linux'

# Set environment path correctly based on OS
let virtual_env = ($env.PWD | path join ".env") # Adjust the virtual environment directory

let bin = if $is_windows { "Scripts" } else { "bin" } # Use 'Scripts' for Windows and 'bin' for Unix systems

let is_windows = ($nu.os-info.family) == 'windows'
let path_name = (if (has-env 'Path') {
let path_sep = if $is_windows { ";" } else { ":" } # Use ';' for Windows, ':' for Unix systems

let path_name = if $is_windows {
if (has-env 'Path') {
'Path'
} else {
'PATH'
}
)
} else {
'PATH'
}

let venv_path = ([$virtual_env $bin] | path join)
let new_path = ($env | get $path_name | prepend $venv_path)
let old_path = (
if $is_windows {
if (has-env 'Path') {
$env.Path
} else {
$env.PATH
}
} else {
$env.PATH
} | if (is-string $in) {
$in | split row $path_sep | path expand
} else {
$in
}
)

# If there is no default prompt, then use the env name instead
let virtual_env_prompt = (if (__VIRTUAL_PROMPT__ | is-empty) {
($virtual_env | path basename)
} else {
__VIRTUAL_PROMPT__
})
let venv_path = ([$virtual_env, $bin] | path join)
let new_path = ($old_path | prepend $venv_path | str join $path_sep)

let new_env = {
$path_name : $new_path
VIRTUAL_ENV : $virtual_env
VIRTUAL_ENV_PROMPT : $virtual_env_prompt
$path_name : $new_path
VIRTUAL_ENV : $virtual_env
}

let new_env = (if (is-env-true 'VIRTUAL_ENV_DISABLE_PROMPT') {
let new_env = if (is-env-true 'VIRTUAL_ENV_DISABLE_PROMPT') {
$new_env
} else {
# Creating the new prompt for the session
let virtual_prefix = $'(char lparen)($virtual_env_prompt)(char rparen) '
let virtual_prompt = $"(char lparen)($virtual_env | path basename)(char rparen) "

# Back up the old prompt builder
let old_prompt_command = (if (has-env 'PROMPT_COMMAND') {
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 {
''
})
""
}
}

let new_prompt = (if (has-env 'PROMPT_COMMAND') {
let new_prompt = if (has-env 'PROMPT_COMMAND') {
if 'closure' in ($old_prompt_command | describe) {
{|| $'($virtual_prefix)(do $old_prompt_command)' }
{|| $'($virtual_prompt)(do $old_prompt_command)' }
} else {
{|| $'($virtual_prefix)($old_prompt_command)' }
{|| $'($virtual_prompt)($old_prompt_command)' }
}
} else {
{|| $'($virtual_prefix)' }
})
{|| $'($virtual_prompt)' }
}

$new_env | merge {
_OLD_VIRTUAL_PATH : ($old_path | str join $path_sep)
_OLD_PROMPT_COMMAND : $old_prompt_command
PROMPT_COMMAND : $new_prompt
VIRTUAL_PREFIX : $virtual_prefix
VIRTUAL_PROMPT : $virtual_prompt
}
})
}

# Environment variables that will be loaded as the virtual env
# Load environment variables to activate the virtualenv
load-env $new_env
}

Expand Down
Loading