diff --git a/bin/pyenv-virtualenv b/bin/pyenv-virtualenv index 56d5462..7db2553 100755 --- a/bin/pyenv-virtualenv +++ b/bin/pyenv-virtualenv @@ -261,12 +261,16 @@ if [[ "${#ARGUMENTS[@]}" == 0 ]]; then exit 1 elif [[ "${#ARGUMENTS[@]}" == 1 ]]; then # If only one argument given, use current version as source version - VERSION_NAME="$(pyenv-version-name)" + OLDIFS="${IFS}" + IFS=: + VERSION_NAMES=($(pyenv-version-name)) + IFS="${OLDIFS}" + VERSION_NAME="${VERSION_NAMES}" VIRTUALENV_NAME="${ARGUMENTS[0]}" else # Otherwise, use former as source version, and latter as virtualenv version VERSION_NAME="${ARGUMENTS[0]}" - VIRTUALENV_NAME="${ARGUMENTS[1]##*/}" + VIRTUALENV_NAME="${ARGUMENTS[1]}" fi if [ -z "${VERSION_NAME}" ] || [ -z "${VIRTUALENV_NAME}" ]; then @@ -283,6 +287,11 @@ if [ "$VIRTUALENV_NAME" != "${VIRTUALENV_NAME%[[:space:]]*}" ]; then exit 1 fi +if [ "${VIRTUALENV_NAME}" != "${VIRTUALENV_NAME%/*}" ] && [[ "${VIRTUALENV_NAME}" != "${VERSION_NAME%%/*}/envs/${VIRTUALENV_NAME##*/}" ]] ; then + echo "pyenv-virtualenv: no slash allowed in virtualenv name." 1>&2 + exit 1 +fi + # Set VERSION_NAME as default version in this script export PYENV_VERSION="${VERSION_NAME}" @@ -305,14 +314,14 @@ fi # Not create `system/envs` directory even if source version is `system` if [[ "${VERSION_NAME%/envs/*}" == "system" ]]; then - VERSION_NAME="${VIRTUALENV_NAME}" + VIRTUALENV_NAME="${VIRTUALENV_NAME##*/}" else - VERSION_NAME="${VERSION_NAME}/envs/${VIRTUALENV_NAME}" + VIRTUALENV_NAME="${VERSION_NAME}/envs/${VIRTUALENV_NAME##*/}" fi -VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VERSION_NAME}" +VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}" if [[ "${VIRTUALENV_PATH}" != "${VIRTUALENV_PATH%/envs/*}" ]]; then - COMPAT_VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}" + COMPAT_VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME##*/}" fi if [ -n "${COMPAT_VIRTUALENV_PATH}" ]; then @@ -427,7 +436,7 @@ if [ -d "${VIRTUALENV_PATH}/bin" ]; then fi if [ -n "$UPGRADE" ]; then - PYENV_VERSION="${VERSION_NAME}" prepare_requirements + PYENV_VERSION="${VIRTUALENV_NAME}" prepare_requirements fi fi @@ -455,10 +464,10 @@ if [ -d "${VIRTUALENV_PATH}" ] && [ -n "${COMPAT_VIRTUALENV_PATH}" ]; then fi ## Install setuptools and pip. -PYENV_VERSION="${VERSION_NAME}" build_package_ensurepip +PYENV_VERSION="${VIRTUALENV_NAME}" build_package_ensurepip ## Migrate previously installed packages from requirements.txt. -PYENV_VERSION="${VERSION_NAME}" install_requirements || true +PYENV_VERSION="${VIRTUALENV_NAME}" install_requirements || true # Execute `after_virtualenv` hooks. for hook in "${after_hooks[@]}"; do eval "$hook"; done diff --git a/test/virtualenv.bats b/test/virtualenv.bats index 1fc29f9..641ea05 100644 --- a/test/virtualenv.bats +++ b/test/virtualenv.bats @@ -144,3 +144,34 @@ OUT pyenv-virtualenv: \`system' is not allowed as virtualenv name. OUT } + +@test "no slash allowed in virtualenv name" { + run pyenv-virtualenv "3.2.1" "foo/bar" + + assert_failure + assert_output <