13 Commits

Author SHA1 Message Date
Yamashita Yuu
7aa5d13633 v20140705 2014-07-05 17:26:53 +09:00
Yamashita Yuu
aef2546319 Fix broken fish's if statement 2014-07-05 07:30:53 +09:00
Yamashita Yuu
6b4d6249a0 No need to use eval in fish init script 2014-07-05 07:27:12 +09:00
Yamashita Yuu
0de2cdbbc3 Should not persist PYENV_DEACTIVATE after failed attempt to deactivate and activate 2014-07-05 06:53:46 +09:00
Yamashita Yuu
abfda4bac9 Fix issues with manual activation of virtual environments (#34) 2014-07-04 22:55:06 +09:00
Yamashita Yuu
be18fd294e Fix virtualenv-prefix when the version is system 2014-07-04 22:44:08 +09:00
Yamashita Yuu
d4ce853e94 Display information on automatic (de)?activation 2014-07-04 22:44:05 +09:00
Yamashita Yuu
58ed045796 s/QUIET/NOERROR/g 2014-07-04 22:10:35 +09:00
Yamashita Yuu
c2b5bbd19a Fix fish syntax error at else 2014-07-04 20:51:31 +09:00
Yamashita Yuu
f0c400b669 Add --quiet option to activate and deactivate 2014-07-04 20:47:10 +09:00
Yamashita Yuu
5b3b909089 Exit as error on deactivation failures 2014-07-04 20:33:37 +09:00
Yamashita Yuu
0b5e0cf592 Unset shell version only if the deactivate has invoked 2014-07-04 20:27:55 +09:00
Yamashita Yuu
c09a6d3d6c Exit as error on activation failures 2014-07-04 20:23:29 +09:00
11 changed files with 353 additions and 71 deletions

View File

@@ -133,6 +133,14 @@ You can set certain environment variables to control the pyenv-virtualenv.
## Version History
#### 20140705
* Display information on auto-(de)?activation
* Support manual (de)?activation with auto-activation enabled (#32, #34)
* Exit as error when (de)?activation failed
* Use https://bootstrap.pypa.io/ to install setuptools and pip
* Create backup of original virtualenv within `$(pyenv root)/versions` when `--upgrade`
#### 20140615
* Fix incompatibility issue of `pyenv activate` and `pyenv deactivate` (#26)

View File

@@ -14,16 +14,32 @@
set -e
[ -n "$PYENV_DEBUG" ] && set -x
# Provide pyenv completions
if [ "$1" = "--complete" ]; then
unset NOERROR
unset VERBOSE
while [ $# -gt 0 ]; do
case "$1" in
"--complete" )
# Provide pyenv completions
echo --unset
exec pyenv-virtualenvs --bare
fi
if [ "$1" = "--unset" ]; then
;;
"--no-error" )
NOERROR=1
;;
"--unset" )
echo "pyenv deactivate"
exit
fi
;;
"--verbose" )
VERBOSE=1
;;
* )
break
;;
esac
shift 1
done
versions=("$@")
if [ -z "$versions" ]; then
@@ -40,11 +56,16 @@ if [ -z "${PYENV_VIRTUALENV_INIT}" ]; then
fi
if [ "${#versions[@]}" -gt 1 ]; then
echo "pyenv-virtualenv: cannot activate multiple versions at once: ${versions[@]}" 1>&2
[ -n "$NOERROR" ] || echo "pyenv-virtualenv: cannot activate multiple versions at once: ${versions[@]}" 1>&2
echo "false"
exit 1
fi
pyenv-virtualenv-prefix "${versions}" 1>/dev/null
if ! pyenv-virtualenv-prefix "${versions}" 1>/dev/null 2>&1; then
[ -n "$NOERROR" ] || echo "pyenv-virtualenv: version \`${versions}' is not a virtualenv" 1>&2
echo "false"
exit 1
fi
shell="$(basename "${PYENV_SHELL:-$SHELL}")"
case "$shell" in
@@ -70,21 +91,28 @@ if [ -f "$profile" ] && grep -q 'pyenv init -' "$profile" && ! grep -q 'pyenv vi
pyenv-virtualenv-init >&2 || true
fi
if [ -n "$VERBOSE" ]; then
echo "pyenv-virtualenv: activate ${versions}" 1>&2
fi
if [ -z "$no_shell" ]; then
echo "pyenv shell \"${versions}\";"
fi
prefix="$(pyenv-prefix "${versions}")"
case "$shell" in
fish )
cat <<EOS
set -e PYENV_DEACTIVATE;
. "$(pyenv-prefix "${versions}")/bin/activate.fish";
setenv PYENV_ACTIVATE "${prefix}";
. "${prefix}/bin/activate.fish";
EOS
;;
* )
cat <<EOS
unset PYENV_DEACTIVATE;
source "$(pyenv-prefix "${versions}")/bin/activate";
export PYENV_ACTIVATE="${prefix}";
source "${prefix}/bin/activate";
EOS
;;
esac

View File

@@ -9,28 +9,74 @@
set -e
[ -n "$PYENV_DEBUG" ] && set -x
unset NOERROR
unset VERBOSE
while [ $# -gt 0 ]; do
case "$1" in
"--no-error" )
NOERROR=1
;;
"--verbose" )
VERBOSE=1
;;
* )
break
;;
esac
shift 1
done
shell="$(basename "${PYENV_SHELL:-$SHELL}")"
case "$shell" in
fish )
cat <<EOS
if functions -q deactivate
setenv PYENV_DEACTIVATE "\$VIRTUAL_ENV";
deactivate;
end;
EOS
echo "if functions -q deactivate;"
;;
* )
cat <<EOS
if declare -f deactivate 1>/dev/null 2>&1; then
export PYENV_DEACTIVATE="\$VIRTUAL_ENV";
deactivate;
fi;
EOS
echo "if declare -f deactivate 1>/dev/null 2>&1; then"
;;
esac
if [ -n "$VERBOSE" ]; then
echo " echo \"pyenv-virtualenv: deactivate ${PYENV_ACTIVATE##*/}\" 1>&2;"
fi
if [ -z "${PYENV_VIRTUALENV_INIT}" ]; then
# Backward compatibility issue
# https://github.com/yyuu/pyenv-virtualenv/issues/26
echo "pyenv shell --unset;"
echo " pyenv shell --unset;"
fi
case "$shell" in
fish )
cat <<EOS
setenv PYENV_DEACTIVATE "$PYENV_ACTIVATE";
set -e PYENV_ACTIVATE;
deactivate;
else;
EOS
;;
* )
cat <<EOS
export PYENV_DEACTIVATE="$PYENV_ACTIVATE";
unset PYENV_ACTIVATE;
deactivate;
else
EOS
;;
esac
if [ -z "$NOERROR" ]; then
echo " echo \"pyenv-virtualenv: no virtualenv has been activated.\" 1>&2;"
fi
echo " false;"
case "$shell" in
fish )
echo "end;"
;;
* )
echo "fi;"
;;
esac

View File

@@ -9,7 +9,7 @@
# -f/--force Install even if the version appears to be installed already
#
PYENV_VIRTUALENV_VERSION="20140615"
PYENV_VIRTUALENV_VERSION="20140705"
set -e
[ -n "$PYENV_DEBUG" ] && set -x

View File

@@ -75,18 +75,21 @@ case "$shell" in
fish )
cat <<EOS
function _pyenv_virtualenv_hook --on-event fish_prompt;
if [ -n "\$VIRTUAL_ENV" ]
if [ -n "\$PYENV_ACTIVATE" ]
if [ (pyenv version-name) = "system" ]
eval (pyenv sh-deactivate); or true
pyenv deactivate --no-error --verbose
return 0
end
if [ "\$VIRTUAL_ENV" != (pyenv prefix) ]
eval (pyenv sh-deactivate); or true
eval (pyenv sh-activate 2>/dev/null); or true
if [ "\$PYENV_ACTIVATE" != (pyenv prefix) ]
if pyenv deactivate --no-error --verbose
pyenv activate --no-error --verbose; or set -e PYENV_DEACTIVATE
else
pyenv activate --no-error --verbose
end
end
else
if [ "\$PYENV_DEACTIVATE" != (pyenv prefix) ]
eval (pyenv sh-activate 2>/dev/null); or true
if [ -z "\$VIRTUAL_ENV" ]; and [ "\$PYENV_DEACTIVATE" != (pyenv prefix) ]
pyenv activate --no-error --verbose
end
end
end
@@ -106,18 +109,21 @@ esac
if [[ "$shell" != "fish" ]]; then
cat <<EOS
if [ -n "\$VIRTUAL_ENV" ]; then
if [ -n "\$PYENV_ACTIVATE" ]; then
if [ "x\`pyenv version-name\`" = "xsystem" ]; then
pyenv deactivate || true
pyenv deactivate --no-error --verbose
return 0
fi
if [ "x\$VIRTUAL_ENV" != "x\`pyenv prefix\`" ]; then
pyenv deactivate || true
pyenv activate 2>/dev/null || true
if [ "x\$PYENV_ACTIVATE" != "x\`pyenv prefix\`" ]; then
if pyenv deactivate --no-error --verbose; then
pyenv activate --no-error --verbose || unset PYENV_DEACTIVATE
else
pyenv activate --no-error --verbose
fi
fi
else
if [ "x\$PYENV_DEACTIVATE" != "x\`pyenv prefix\`" ]; then
pyenv activate 2>/dev/null || true
if [ -z "\$VIRTUAL_ENV" ] && [ "x\$PYENV_DEACTIVATE" != "x\`pyenv prefix\`" ]; then
pyenv activate --no-error --verbose
fi
fi
};

View File

@@ -32,6 +32,10 @@ base_prefix() { # pyvenv
VIRTUALENV_PREFIX_PATHS=()
for version in "${versions[@]}"; do
if [ "$version" = "system" ]; then
echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2
exit 1
fi
PREFIX="$(pyenv-prefix "${version}")"
if [ -f "${PREFIX}/bin/activate" ]; then
VIRTUALENV_PREFIX_PATH="$(real_prefix "${version}" || base_prefix "${version}" || true)"

View File

@@ -23,6 +23,29 @@ setup() {
assert_success
assert_output <<EOS
unset PYENV_DEACTIVATE;
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv";
source "${PYENV_ROOT}/versions/venv/bin/activate";
EOS
}
@test "activate virtualenv from current version (verbose)" {
export PYENV_VIRTUALENV_INIT=1
stub pyenv-version-name "echo venv"
stub pyenv-virtualenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
stub pyenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
PYENV_SHELL="bash" PYENV_VERSION="venv" run pyenv-sh-activate --verbose
unstub pyenv-version-name
unstub pyenv-virtualenv-prefix
unstub pyenv-prefix
assert_success
assert_output <<EOS
pyenv-virtualenv: activate venv
unset PYENV_DEACTIVATE;
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv";
source "${PYENV_ROOT}/versions/venv/bin/activate";
EOS
}
@@ -44,6 +67,7 @@ EOS
assert_output <<EOS
pyenv shell "venv";
unset PYENV_DEACTIVATE;
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv";
source "${PYENV_ROOT}/versions/venv/bin/activate";
EOS
}
@@ -64,6 +88,7 @@ EOS
assert_success
assert_output <<EOS
set -e PYENV_DEACTIVATE;
setenv PYENV_ACTIVATE "${PYENV_ROOT}/versions/venv";
. "${PYENV_ROOT}/versions/venv/bin/activate.fish";
EOS
}
@@ -85,6 +110,7 @@ EOS
assert_output <<EOS
pyenv shell "venv";
set -e PYENV_DEACTIVATE;
setenv PYENV_ACTIVATE "${PYENV_ROOT}/versions/venv";
. "${PYENV_ROOT}/versions/venv/bin/activate.fish";
EOS
}
@@ -104,6 +130,7 @@ EOS
assert_output <<EOS
pyenv shell "venv27";
unset PYENV_DEACTIVATE;
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv27";
source "${PYENV_ROOT}/versions/venv27/bin/activate";
EOS
}
@@ -123,6 +150,7 @@ EOS
assert_output <<EOS
pyenv shell "venv27";
unset PYENV_DEACTIVATE;
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv27";
source "${PYENV_ROOT}/versions/venv27/bin/activate";
EOS
}
@@ -144,6 +172,23 @@ EOS
unstub pyenv-virtualenv-prefix
assert_failure
assert_output <<EOS
pyenv-virtualenv: version \`3.3.3' is not a virtualenv
false
EOS
}
@test "should fail if the version is not a virtualenv (no-error)" {
stub pyenv-virtualenv-prefix "3.3.3 : false"
run pyenv-sh-activate --no-error "3.3.3"
unstub pyenv-virtualenv-prefix
assert_failure
assert_output <<EOS
false
EOS
}
@test "should fail if there are multiple versions" {
@@ -152,6 +197,16 @@ EOS
assert_failure
assert_output <<EOS
pyenv-virtualenv: cannot activate multiple versions at once: venv venv27
false
EOS
}
@test "should fail if there are multiple versions (no-error)" {
run pyenv-sh-activate --no-error "venv" "venv27"
assert_failure
assert_output <<EOS
false
EOS
}

View File

@@ -8,62 +8,175 @@ setup() {
@test "deactivate virtualenv" {
export PYENV_VIRTUALENV_INIT=1
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
PYENV_SHELL="bash" run pyenv-sh-deactivate
assert_success
assert_output <<EOS
if declare -f deactivate 1>/dev/null 2>&1; then
export PYENV_DEACTIVATE="\$VIRTUAL_ENV";
export PYENV_DEACTIVATE="$PYENV_ACTIVATE";
unset PYENV_ACTIVATE;
deactivate;
else
echo "pyenv-virtualenv: no virtualenv has been activated." 1>&2;
false;
fi;
EOS
}
@test "deactivate virtualenv (verbose)" {
export PYENV_VIRTUALENV_INIT=1
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
PYENV_SHELL="bash" run pyenv-sh-deactivate --verbose
assert_success
assert_output <<EOS
if declare -f deactivate 1>/dev/null 2>&1; then
echo "pyenv-virtualenv: deactivate venv" 1>&2;
export PYENV_DEACTIVATE="$PYENV_ACTIVATE";
unset PYENV_ACTIVATE;
deactivate;
else
echo "pyenv-virtualenv: no virtualenv has been activated." 1>&2;
false;
fi;
EOS
}
@test "deactivate virtualenv (no-error)" {
export PYENV_VIRTUALENV_INIT=1
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
PYENV_SHELL="bash" run pyenv-sh-deactivate --no-error
assert_success
assert_output <<EOS
if declare -f deactivate 1>/dev/null 2>&1; then
export PYENV_DEACTIVATE="$PYENV_ACTIVATE";
unset PYENV_ACTIVATE;
deactivate;
else
false;
fi;
EOS
}
@test "deactivate virtualenv (without pyenv-virtualenv-init)" {
export PYENV_VIRTUALENV_INIT=
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
PYENV_SHELL="bash" run pyenv-sh-deactivate
assert_success
assert_output <<EOS
if declare -f deactivate 1>/dev/null 2>&1; then
export PYENV_DEACTIVATE="\$VIRTUAL_ENV";
pyenv shell --unset;
export PYENV_DEACTIVATE="$PYENV_ACTIVATE";
unset PYENV_ACTIVATE;
deactivate;
else
echo "pyenv-virtualenv: no virtualenv has been activated." 1>&2;
false;
fi;
EOS
}
@test "deactivate virtualenv (without pyenv-virtualenv-init) (no-error)" {
export PYENV_VIRTUALENV_INIT=
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
PYENV_SHELL="bash" run pyenv-sh-deactivate --no-error
assert_success
assert_output <<EOS
if declare -f deactivate 1>/dev/null 2>&1; then
pyenv shell --unset;
export PYENV_DEACTIVATE="$PYENV_ACTIVATE";
unset PYENV_ACTIVATE;
deactivate;
else
false;
fi;
pyenv shell --unset;
EOS
}
@test "deactivate virtualenv (fish)" {
export PYENV_VIRTUALENV_INIT=1
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
PYENV_SHELL="fish" run pyenv-sh-deactivate
assert_success
assert_output <<EOS
if functions -q deactivate
setenv PYENV_DEACTIVATE "\$VIRTUAL_ENV";
if functions -q deactivate;
setenv PYENV_DEACTIVATE "$PYENV_ACTIVATE";
set -e PYENV_ACTIVATE;
deactivate;
else;
echo "pyenv-virtualenv: no virtualenv has been activated." 1>&2;
false;
end;
EOS
}
@test "deactivate virtualenv (fish) (no-error)" {
export PYENV_VIRTUALENV_INIT=1
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
PYENV_SHELL="fish" run pyenv-sh-deactivate --no-error
assert_success
assert_output <<EOS
if functions -q deactivate;
setenv PYENV_DEACTIVATE "$PYENV_ACTIVATE";
set -e PYENV_ACTIVATE;
deactivate;
else;
false;
end;
EOS
}
@test "deactivate virtualenv (fish) (without pyenv-virtualenv-init)" {
export PYENV_VIRTUALENV_INIT=
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
PYENV_SHELL="fish" run pyenv-sh-deactivate
assert_success
assert_output <<EOS
if functions -q deactivate
setenv PYENV_DEACTIVATE "\$VIRTUAL_ENV";
if functions -q deactivate;
pyenv shell --unset;
setenv PYENV_DEACTIVATE "$PYENV_ACTIVATE";
set -e PYENV_ACTIVATE;
deactivate;
else;
echo "pyenv-virtualenv: no virtualenv has been activated." 1>&2;
false;
end;
pyenv shell --unset;
EOS
}
@test "deactivate virtualenv (fish) (without pyenv-virtualenv-init) (no-error)" {
export PYENV_VIRTUALENV_INIT=
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
PYENV_SHELL="fish" run pyenv-sh-deactivate --no-error
assert_success
assert_output <<EOS
if functions -q deactivate;
pyenv shell --unset;
setenv PYENV_DEACTIVATE "$PYENV_ACTIVATE";
set -e PYENV_ACTIVATE;
deactivate;
else;
false;
end;
EOS
}
@test "should fail if deactivate is invoked as a command" {
run pyenv-deactivate

View File

@@ -31,18 +31,21 @@ load test_helper
assert_output <<EOS
export PYENV_VIRTUALENV_INIT=1;
_pyenv_virtualenv_hook() {
if [ -n "\$VIRTUAL_ENV" ]; then
if [ -n "\$PYENV_ACTIVATE" ]; then
if [ "x\`pyenv version-name\`" = "xsystem" ]; then
pyenv deactivate || true
pyenv deactivate --no-error --verbose
return 0
fi
if [ "x\$VIRTUAL_ENV" != "x\`pyenv prefix\`" ]; then
pyenv deactivate || true
pyenv activate 2>/dev/null || true
if [ "x\$PYENV_ACTIVATE" != "x\`pyenv prefix\`" ]; then
if pyenv deactivate --no-error --verbose; then
pyenv activate --no-error --verbose || unset PYENV_DEACTIVATE
else
pyenv activate --no-error --verbose
fi
fi
else
if [ "x\$PYENV_DEACTIVATE" != "x\`pyenv prefix\`" ]; then
pyenv activate 2>/dev/null || true
if [ -z "\$VIRTUAL_ENV" ] && [ "x\$PYENV_DEACTIVATE" != "x\`pyenv prefix\`" ]; then
pyenv activate --no-error --verbose
fi
fi
};
@@ -58,18 +61,21 @@ EOS
assert_output <<EOS
setenv PYENV_VIRTUALENV_INIT 1;
function _pyenv_virtualenv_hook --on-event fish_prompt;
if [ -n "\$VIRTUAL_ENV" ]
if [ -n "\$PYENV_ACTIVATE" ]
if [ (pyenv version-name) = "system" ]
eval (pyenv sh-deactivate); or true
pyenv deactivate --no-error --verbose
return 0
end
if [ "\$VIRTUAL_ENV" != (pyenv prefix) ]
eval (pyenv sh-deactivate); or true
eval (pyenv sh-activate 2>/dev/null); or true
if [ "\$PYENV_ACTIVATE" != (pyenv prefix) ]
if pyenv deactivate --no-error --verbose
pyenv activate --no-error --verbose; or set -e PYENV_DEACTIVATE
else
pyenv activate --no-error --verbose
end
end
else
if [ "\$PYENV_DEACTIVATE" != (pyenv prefix) ]
eval (pyenv sh-activate 2>/dev/null); or true
if [ -z "\$VIRTUAL_ENV" ]; and [ "\$PYENV_DEACTIVATE" != (pyenv prefix) ]
pyenv activate --no-error --verbose
end
end
end
@@ -82,18 +88,21 @@ EOS
assert_output <<EOS
export PYENV_VIRTUALENV_INIT=1;
_pyenv_virtualenv_hook() {
if [ -n "\$VIRTUAL_ENV" ]; then
if [ -n "\$PYENV_ACTIVATE" ]; then
if [ "x\`pyenv version-name\`" = "xsystem" ]; then
pyenv deactivate || true
pyenv deactivate --no-error --verbose
return 0
fi
if [ "x\$VIRTUAL_ENV" != "x\`pyenv prefix\`" ]; then
pyenv deactivate || true
pyenv activate 2>/dev/null || true
if [ "x\$PYENV_ACTIVATE" != "x\`pyenv prefix\`" ]; then
if pyenv deactivate --no-error --verbose; then
pyenv activate --no-error --verbose || unset PYENV_DEACTIVATE
else
pyenv activate --no-error --verbose
fi
fi
else
if [ "x\$PYENV_DEACTIVATE" != "x\`pyenv prefix\`" ]; then
pyenv activate 2>/dev/null || true
if [ -z "\$VIRTUAL_ENV" ] && [ "x\$PYENV_DEACTIVATE" != "x\`pyenv prefix\`" ]; then
pyenv activate --no-error --verbose
fi
fi
};

View File

@@ -4,7 +4,7 @@ load test_helper
setup() {
export PYENV_ROOT="${TMP}/pyenv"
export PYENV_VIRTUALENV_VERSION="20140615"
export PYENV_VIRTUALENV_VERSION="20140705"
}
@test "display virtualenv version" {

View File

@@ -102,6 +102,19 @@ ${PYENV_ROOT}/versions/3.3.3:${PYENV_ROOT}/versions/3.4.0
OUT
}
@test "should fail if the version is the system" {
stub pyenv-version-name "echo system"
PYENV_VERSION="system" run pyenv-virtualenv-prefix
unstub pyenv-version-name
assert_failure
assert_output <<OUT
pyenv-virtualenv: version \`system' is not a virtualenv
OUT
}
@test "should fail if the version is not a virtualenv" {
stub pyenv-version-name "echo 3.4.0"
stub pyenv-prefix "3.4.0 : echo \"${PYENV_ROOT}/versions/3.4.0\""