mirror of
https://github.com/pyenv/pyenv-virtualenv.git
synced 2025-11-10 20:43:55 -05:00
add foolproof for -p argument.
find proper source version from pyenv if the given executable is only basename or is a shim script.
This commit is contained in:
@@ -318,9 +318,28 @@ if [ -n "${USE_PYVENV}" ]; then
|
|||||||
# Unset some arguments not supported by pyvenv
|
# Unset some arguments not supported by pyvenv
|
||||||
unset QUIET
|
unset QUIET
|
||||||
unset VERBOSE
|
unset VERBOSE
|
||||||
|
if [ -n "${VIRTUALENV_PYTHON}" ]; then
|
||||||
|
echo "pyenv-virtualenv: \`--python=${VIRTUALENV_PYTHON}' is not supported by pyvenv." 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
if [ -n "${VIRTUALENV_PYTHON}" ]; then
|
if [ -n "${VIRTUALENV_PYTHON}" ]; then
|
||||||
VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--python=${VIRTUALENV_PYTHON}"
|
if [[ "${VIRTUALENV_PYTHON}" == "${VIRTUALENV_PYTHON##*/}" ]] || [[ "${VIRTUALENV_PYTHON}" == "${PYENV_ROOT}/shims/"* ]]; then
|
||||||
|
python="$(pyenv-which "${VIRTUALENV_PYTHON##*/}" 2>/dev/null || true)"
|
||||||
|
if [ -x "${python}" ]; then
|
||||||
|
VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--python=${python}"
|
||||||
|
else
|
||||||
|
python="$(PYENV_VERSION="$(pyenv-whence "${VIRTUALENV_PYTHON##*/}" 2>/dev/null | tail -n 1 || true)" pyenv-which "${VIRTUALENV_PYTHON##*/}" 2>/dev/null || true)"
|
||||||
|
if [ -x "${python}" ]; then
|
||||||
|
VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--python=${python}"
|
||||||
|
else
|
||||||
|
echo "pyenv-virtualenv: \`${VIRTUALENV_PYTHON##*/}' is not installed in pyenv." 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--python=${VIRTUALENV_PYTHON}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
if [ -z "${HAS_VIRTUALENV}" ]; then
|
if [ -z "${HAS_VIRTUALENV}" ]; then
|
||||||
VIRTUALENV_VERSION="==${VIRTUALENV_VERSION}"
|
VIRTUALENV_VERSION="==${VIRTUALENV_VERSION}"
|
||||||
|
|||||||
101
test/python.bats
Normal file
101
test/python.bats
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
#!/usr/bin/env bats
|
||||||
|
|
||||||
|
load test_helper
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
export PYENV_ROOT="${TMP}/pyenv"
|
||||||
|
export PYENV_VERSION="2.7.8"
|
||||||
|
create_executable "${PYENV_VERSION}" "virtualenv"
|
||||||
|
remove_executable "${PYENV_VERSION}" "pyvenv"
|
||||||
|
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
|
||||||
|
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
|
||||||
|
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
|
||||||
|
stub pyenv-hooks "virtualenv : echo"
|
||||||
|
stub pyenv-rehash " : true"
|
||||||
|
stub pyenv-version-name "echo \${PYENV_VERSION}"
|
||||||
|
stub curl true
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown() {
|
||||||
|
unstub curl
|
||||||
|
unstub pyenv-version-name
|
||||||
|
unstub pyenv-prefix
|
||||||
|
unstub pyenv-hooks
|
||||||
|
unstub pyenv-rehash
|
||||||
|
rm -fr "$TMP"/*
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "resolve python executable from enabled version" {
|
||||||
|
remove_executable "2.7.7" "python2.7"
|
||||||
|
create_executable "2.7.8" "python2.7"
|
||||||
|
remove_executable "2.7.9" "python2.7"
|
||||||
|
|
||||||
|
stub pyenv-exec "virtualenv --verbose --python=${PYENV_ROOT}/versions/2.7.8/bin/python2.7 ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
||||||
|
stub pyenv-exec "python -s -m ensurepip : true"
|
||||||
|
stub pyenv-which "python2.7 : echo ${PYENV_ROOT}/versions/2.7.8/bin/python2.7"
|
||||||
|
|
||||||
|
run pyenv-virtualenv --verbose --python=python2.7 venv
|
||||||
|
|
||||||
|
assert_output <<OUT
|
||||||
|
PYENV_VERSION=2.7.8 virtualenv --verbose --python=${PYENV_ROOT}/versions/2.7.8/bin/python2.7 ${PYENV_ROOT}/versions/venv
|
||||||
|
OUT
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
unstub pyenv-which
|
||||||
|
unstub pyenv-exec
|
||||||
|
|
||||||
|
remove_executable "2.7.7" "python2.7"
|
||||||
|
remove_executable "2.7.8" "python2.7"
|
||||||
|
remove_executable "2.7.9" "python2.7"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "resolve python executable from other versions" {
|
||||||
|
remove_executable "2.7.7" "python2.7"
|
||||||
|
remove_executable "2.7.8" "python2.7"
|
||||||
|
create_executable "2.7.9" "python2.7"
|
||||||
|
|
||||||
|
stub pyenv-exec "virtualenv --verbose --python=${PYENV_ROOT}/versions/2.7.9/bin/python2.7 ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
||||||
|
stub pyenv-exec "python -s -m ensurepip : true"
|
||||||
|
stub pyenv-which "python2.7 : false"
|
||||||
|
stub pyenv-whence "python2.7 : echo 2.7.7; echo 2.7.8; echo 2.7.9"
|
||||||
|
stub pyenv-which "python2.7 : echo ${PYENV_ROOT}/versions/2.7.9/bin/python2.7"
|
||||||
|
|
||||||
|
run pyenv-virtualenv --verbose --python=python2.7 venv
|
||||||
|
|
||||||
|
assert_output <<OUT
|
||||||
|
PYENV_VERSION=2.7.8 virtualenv --verbose --python=${PYENV_ROOT}/versions/2.7.9/bin/python2.7 ${PYENV_ROOT}/versions/venv
|
||||||
|
OUT
|
||||||
|
assert_success
|
||||||
|
|
||||||
|
unstub pyenv-which
|
||||||
|
unstub pyenv-whence
|
||||||
|
unstub pyenv-exec
|
||||||
|
|
||||||
|
remove_executable "2.7.7" "python2.7"
|
||||||
|
remove_executable "2.7.8" "python2.7"
|
||||||
|
remove_executable "2.7.9" "python2.7"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "cannot resolve python executable" {
|
||||||
|
remove_executable "2.7.7" "python2.7"
|
||||||
|
remove_executable "2.7.8" "python2.7"
|
||||||
|
remove_executable "2.7.9" "python2.7"
|
||||||
|
|
||||||
|
stub pyenv-which "python2.7 : false"
|
||||||
|
stub pyenv-whence "python2.7 : false"
|
||||||
|
stub pyenv-which "python2.7 : false"
|
||||||
|
|
||||||
|
run pyenv-virtualenv --verbose --python=python2.7 venv
|
||||||
|
|
||||||
|
assert_output <<OUT
|
||||||
|
pyenv-virtualenv: \`python2.7' is not installed in pyenv.
|
||||||
|
OUT
|
||||||
|
assert_failure
|
||||||
|
|
||||||
|
unstub pyenv-which
|
||||||
|
unstub pyenv-whence
|
||||||
|
|
||||||
|
remove_executable "2.7.7" "python2.7"
|
||||||
|
remove_executable "2.7.8" "python2.7"
|
||||||
|
remove_executable "2.7.9" "python2.7"
|
||||||
|
}
|
||||||
@@ -101,20 +101,20 @@ OUT
|
|||||||
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
|
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
|
||||||
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
|
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
|
||||||
stub pyenv-exec "pip install virtualenv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
stub pyenv-exec "pip install virtualenv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
||||||
stub pyenv-exec "virtualenv --python=python3 ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
stub pyenv-exec "virtualenv --python=${TMP}/python3 ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
||||||
stub pyenv-exec "python -s -m ensurepip : true"
|
stub pyenv-exec "python -s -m ensurepip : true"
|
||||||
|
|
||||||
remove_executable "3.4.1" "virtualenv"
|
remove_executable "3.4.1" "virtualenv"
|
||||||
create_executable "3.4.1" "pyvenv"
|
create_executable "3.4.1" "pyvenv"
|
||||||
|
|
||||||
run pyenv-virtualenv -p python3 venv
|
run pyenv-virtualenv -p ${TMP}/python3 venv
|
||||||
|
|
||||||
assert_success
|
|
||||||
assert_output <<OUT
|
assert_output <<OUT
|
||||||
PYENV_VERSION=3.4.1 pip install virtualenv
|
PYENV_VERSION=3.4.1 pip install virtualenv
|
||||||
PYENV_VERSION=3.4.1 virtualenv --python=python3 ${PYENV_ROOT}/versions/venv
|
PYENV_VERSION=3.4.1 virtualenv --python=${TMP}/python3 ${PYENV_ROOT}/versions/venv
|
||||||
rehashed
|
rehashed
|
||||||
OUT
|
OUT
|
||||||
|
assert_success
|
||||||
|
|
||||||
unstub_pyenv
|
unstub_pyenv
|
||||||
unstub pyenv-exec
|
unstub pyenv-exec
|
||||||
@@ -126,20 +126,20 @@ OUT
|
|||||||
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
|
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
|
||||||
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
|
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
|
||||||
stub pyenv-exec "pip install virtualenv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
stub pyenv-exec "pip install virtualenv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
||||||
stub pyenv-exec "virtualenv --python=python3 ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
stub pyenv-exec "virtualenv --python=${TMP}/python3 ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
||||||
stub pyenv-exec "python -s -m ensurepip : true"
|
stub pyenv-exec "python -s -m ensurepip : true"
|
||||||
|
|
||||||
remove_executable "3.4.1" "virtualenv"
|
remove_executable "3.4.1" "virtualenv"
|
||||||
create_executable "3.4.1" "pyvenv"
|
create_executable "3.4.1" "pyvenv"
|
||||||
|
|
||||||
run pyenv-virtualenv --python=python3 venv
|
run pyenv-virtualenv --python=${TMP}/python3 venv
|
||||||
|
|
||||||
assert_success
|
|
||||||
assert_output <<OUT
|
assert_output <<OUT
|
||||||
PYENV_VERSION=3.4.1 pip install virtualenv
|
PYENV_VERSION=3.4.1 pip install virtualenv
|
||||||
PYENV_VERSION=3.4.1 virtualenv --python=python3 ${PYENV_ROOT}/versions/venv
|
PYENV_VERSION=3.4.1 virtualenv --python=${TMP}/python3 ${PYENV_ROOT}/versions/venv
|
||||||
rehashed
|
rehashed
|
||||||
OUT
|
OUT
|
||||||
|
assert_success
|
||||||
|
|
||||||
unstub_pyenv
|
unstub_pyenv
|
||||||
unstub pyenv-exec
|
unstub pyenv-exec
|
||||||
|
|||||||
@@ -73,19 +73,19 @@ OUT
|
|||||||
export PYENV_VERSION="3.2.1"
|
export PYENV_VERSION="3.2.1"
|
||||||
stub_pyenv "${PYENV_VERSION}"
|
stub_pyenv "${PYENV_VERSION}"
|
||||||
stub pyenv-version-name "echo \${PYENV_VERSION}"
|
stub pyenv-version-name "echo \${PYENV_VERSION}"
|
||||||
stub pyenv-exec "virtualenv --verbose --python=python ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
stub pyenv-exec "virtualenv --verbose --python=${TMP}/python ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
||||||
stub pyenv-exec "python -s -m ensurepip : false"
|
stub pyenv-exec "python -s -m ensurepip : false"
|
||||||
stub pyenv-exec "python -s */get-pip.py : true"
|
stub pyenv-exec "python -s */get-pip.py : true"
|
||||||
stub curl true
|
stub curl true
|
||||||
|
|
||||||
run pyenv-virtualenv -v -p python venv
|
run pyenv-virtualenv -v -p ${TMP}/python venv
|
||||||
|
|
||||||
assert_success
|
|
||||||
assert_output <<OUT
|
assert_output <<OUT
|
||||||
PYENV_VERSION=3.2.1 virtualenv --verbose --python=python ${PYENV_ROOT}/versions/venv
|
PYENV_VERSION=3.2.1 virtualenv --verbose --python=${TMP}/python ${PYENV_ROOT}/versions/venv
|
||||||
Installing pip from https://bootstrap.pypa.io/get-pip.py...
|
Installing pip from https://bootstrap.pypa.io/get-pip.py...
|
||||||
rehashed
|
rehashed
|
||||||
OUT
|
OUT
|
||||||
|
assert_success
|
||||||
|
|
||||||
unstub_pyenv
|
unstub_pyenv
|
||||||
unstub pyenv-version-name
|
unstub pyenv-version-name
|
||||||
@@ -97,19 +97,19 @@ OUT
|
|||||||
export PYENV_VERSION="3.2.1"
|
export PYENV_VERSION="3.2.1"
|
||||||
stub_pyenv "${PYENV_VERSION}"
|
stub_pyenv "${PYENV_VERSION}"
|
||||||
stub pyenv-version-name "echo \${PYENV_VERSION}"
|
stub pyenv-version-name "echo \${PYENV_VERSION}"
|
||||||
stub pyenv-exec "virtualenv --verbose --python=python ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
stub pyenv-exec "virtualenv --verbose --python=${TMP}/python ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
|
||||||
stub pyenv-exec "python -s -m ensurepip : false"
|
stub pyenv-exec "python -s -m ensurepip : false"
|
||||||
stub pyenv-exec "python -s */get-pip.py : true"
|
stub pyenv-exec "python -s */get-pip.py : true"
|
||||||
stub curl true
|
stub curl true
|
||||||
|
|
||||||
run pyenv-virtualenv --verbose --python=python venv
|
run pyenv-virtualenv --verbose --python=${TMP}/python venv
|
||||||
|
|
||||||
assert_success
|
|
||||||
assert_output <<OUT
|
assert_output <<OUT
|
||||||
PYENV_VERSION=3.2.1 virtualenv --verbose --python=python ${PYENV_ROOT}/versions/venv
|
PYENV_VERSION=3.2.1 virtualenv --verbose --python=${TMP}/python ${PYENV_ROOT}/versions/venv
|
||||||
Installing pip from https://bootstrap.pypa.io/get-pip.py...
|
Installing pip from https://bootstrap.pypa.io/get-pip.py...
|
||||||
rehashed
|
rehashed
|
||||||
OUT
|
OUT
|
||||||
|
assert_success
|
||||||
|
|
||||||
unstub_pyenv
|
unstub_pyenv
|
||||||
unstub pyenv-version-name
|
unstub pyenv-version-name
|
||||||
|
|||||||
Reference in New Issue
Block a user