Skip to content

Running shell-hook output multiple times causes issues #5599

@stinos

Description

@stinos

Checks

  • I have checked that this issue has not already been reported.

  • I have confirmed this bug exists on the latest version of pixi, using pixi --version.

Reproducible example

From #5510.

Using bash for instance the impact is minor, it keeps appending to PS1 but at least the PATH and other environment variables seem sane

me@TNS-0000:~$ eval "$(pixi shell-hook -m ~/projects/pixitest)"
(pixitest) me@TNS-0000:~$ pixi shell-hook -m ~/projects/pixitest/
export PATH="/home/me/projects/pixitest/.pixi/envs/default/bin:/home/me/.pixi/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
export CONDA_SHLVL=2
export CONDA_ENV_SHLVL_2_CONDA_PREFIX=/home/me/projects/pixitest/.pixi/envs/default
export CONDA_PREFIX=/home/me/projects/pixitest/.pixi/envs/default
export CONDA_ENV_SHLVL_2_PIXI_PROJECT_ROOT=/home/me/projects/pixitest
export PIXI_PROJECT_ROOT=/home/me/projects/pixitest
export CONDA_ENV_SHLVL_2_PIXI_PROJECT_MANIFEST=/home/me/projects/pixitest/pyproject.toml
export PIXI_PROJECT_MANIFEST=/home/me/projects/pixitest/pyproject.toml
export CONDA_ENV_SHLVL_2_PIXI_EXE=/home/me/.pixi/bin/pixi
export PIXI_EXE=/home/me/.pixi/bin/pixi
export CONDA_ENV_SHLVL_2_PIXI_IN_SHELL=1
export PIXI_IN_SHELL=1
export CONDA_ENV_SHLVL_2_PIXI_PROJECT_NAME=pixitest
export PIXI_PROJECT_NAME=pixitest
export CONDA_ENV_SHLVL_2_PIXI_PROJECT_VERSION=0.1.0
export PIXI_PROJECT_VERSION=0.1.0
export CONDA_ENV_SHLVL_2_CONDA_DEFAULT_ENV=pixitest
export CONDA_DEFAULT_ENV=pixitest
export CONDA_ENV_SHLVL_2_PIXI_ENVIRONMENT_NAME=default
export PIXI_ENVIRONMENT_NAME=default
export CONDA_ENV_SHLVL_2_PIXI_ENVIRONMENT_PLATFORMS=linux-64
export PIXI_ENVIRONMENT_PLATFORMS=linux-64
export CONDA_ENV_SHLVL_2_PIXI_PROMPT='(pixitest) '
export PIXI_PROMPT='(pixitest) '

# shellcheck shell=bash
pixi() {
    local first_arg="${1-}"

    "${PIXI_EXE-}" "$@" || return $?

    case "${first_arg-}" in
    add | a | remove | rm | install | i)
        eval "$("$PIXI_EXE" shell-hook --change-ps1 false)"
        hash -r
        ;;
    esac || :

    return 0
}

export PS1="(pixitest) ${PS1:-}"
(pixitest) me@TNS-0000:~$ eval "$(pixi shell-hook -m ~/projects/pixitest)"
(pixitest) (pixitest) me@TNS-0000:~$ pixi shell-hook -m ~/projects/pixitest/
export PATH="/home/me/projects/pixitest/.pixi/envs/default/bin:/home/me/.pixi/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
export CONDA_SHLVL=3
export CONDA_ENV_SHLVL_3_CONDA_PREFIX=/home/me/projects/pixitest/.pixi/envs/default
export CONDA_PREFIX=/home/me/projects/pixitest/.pixi/envs/default
export CONDA_ENV_SHLVL_3_PIXI_PROJECT_NAME=pixitest
export PIXI_PROJECT_NAME=pixitest
export CONDA_ENV_SHLVL_3_PIXI_PROJECT_MANIFEST=/home/me/projects/pixitest/pyproject.toml
export PIXI_PROJECT_MANIFEST=/home/me/projects/pixitest/pyproject.toml
export CONDA_ENV_SHLVL_3_PIXI_IN_SHELL=1
export PIXI_IN_SHELL=1
export CONDA_ENV_SHLVL_3_PIXI_EXE=/home/me/.pixi/bin/pixi
export PIXI_EXE=/home/me/.pixi/bin/pixi
export CONDA_ENV_SHLVL_3_PIXI_PROJECT_ROOT=/home/me/projects/pixitest
export PIXI_PROJECT_ROOT=/home/me/projects/pixitest
export CONDA_ENV_SHLVL_3_PIXI_PROJECT_VERSION=0.1.0
export PIXI_PROJECT_VERSION=0.1.0
export CONDA_ENV_SHLVL_3_CONDA_DEFAULT_ENV=pixitest
export CONDA_DEFAULT_ENV=pixitest
export CONDA_ENV_SHLVL_3_PIXI_ENVIRONMENT_NAME=default
export PIXI_ENVIRONMENT_NAME=default
export CONDA_ENV_SHLVL_3_PIXI_ENVIRONMENT_PLATFORMS=linux-64
export PIXI_ENVIRONMENT_PLATFORMS=linux-64
export CONDA_ENV_SHLVL_3_PIXI_PROMPT='(pixitest) '
export PIXI_PROMPT='(pixitest) '

# shellcheck shell=bash
pixi() {
    local first_arg="${1-}"

    "${PIXI_EXE-}" "$@" || return $?

    case "${first_arg-}" in
    add | a | remove | rm | install | i)
        eval "$("$PIXI_EXE" shell-hook --change-ps1 false)"
        hash -r
        ;;
    esac || :

    return 0
}

export PS1="(pixitest) ${PS1:-}"
(pixitest) (pixitest) me@TNS-0000:~$

but using powershell the prompt function is recursively defined like

$old_prompt = $function:prompt
function prompt {"(myenv) $($old_prompt.Invoke())"}

so calling (pixi shell-hook) | Out-String | Invoke-Expression multiple times results in a stack overflow and the process aborts.

Issue description

No response

Expected behavior

The result of executing consecutive shell-hook outputs should be consistent. The PS1 should only reflect the currently activated environment.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions