mirror of
https://github.com/pyenv/pyenv-virtualenv.git
synced 2025-11-11 04:53:53 -05:00
(1) fix handling of hooks
(2) remove $VIRTUALENV_PATH after failed creation
This commit is contained in:
@@ -147,13 +147,32 @@ for option in "${OPTIONS[@]}"; do
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# The first argument contains the source version to create virtualenv.
|
||||||
VERSION_NAME="${ARGUMENTS[0]}"
|
VERSION_NAME="${ARGUMENTS[0]}"
|
||||||
[ -n "$VERSION_NAME" ] || usage 1
|
[ -n "$VERSION_NAME" ] || usage 1
|
||||||
|
|
||||||
|
|
||||||
|
# Define `before_virtualenv` and `after_virtualenv` functions that allow
|
||||||
|
# plugin hooks to register a string of code for execution before or
|
||||||
|
# after the installation process.
|
||||||
|
declare -a before_hooks after_hooks
|
||||||
|
|
||||||
|
before_virtualenv() {
|
||||||
|
local hook="$1"
|
||||||
|
before_hooks["${#before_hooks[@]}"]="$hook"
|
||||||
|
}
|
||||||
|
|
||||||
|
after_virtualenv() {
|
||||||
|
local hook="$1"
|
||||||
|
after_hooks["${#after_hooks[@]}"]="$hook"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load plugin hooks.
|
||||||
for script in $(pyenv-hooks virtualenv); do
|
for script in $(pyenv-hooks virtualenv); do
|
||||||
source "$script"
|
source "$script"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
PYTHON_BIN=$(PYENV_VERSION="${VERSION_NAME}" pyenv-which python)
|
PYTHON_BIN=$(PYENV_VERSION="${VERSION_NAME}" pyenv-which python)
|
||||||
if [ ! -x "${PYTHON_BIN}" ]; then
|
if [ ! -x "${PYTHON_BIN}" ]; then
|
||||||
echo "pyenv-virtualenv: could not find python executable: ${PYTHON_BIN}" 1>&2
|
echo "pyenv-virtualenv: could not find python executable: ${PYTHON_BIN}" 1>&2
|
||||||
@@ -181,13 +200,37 @@ VIRTUALENV_NAME="${ARGUMENTS[1]##*/}"
|
|||||||
VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}"
|
VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}"
|
||||||
VIRTUALENV_PYTHON_BIN="${VIRTUALENV_PATH}/bin/python"
|
VIRTUALENV_PYTHON_BIN="${VIRTUALENV_PATH}/bin/python"
|
||||||
|
|
||||||
|
[ -d "${VIRTUALENV_PATH}" ] && PREFIX_EXISTS=1
|
||||||
|
|
||||||
|
# If the virtualenv exists, prompt for confirmation unless
|
||||||
|
# the --force option was specified.
|
||||||
|
if [ -z "$FORCE" ] && [ -d "${VIRTUALENV_PATH}/bin" ]; then
|
||||||
|
echo "pyenv: $VIRTUALENV_PATH already exists" >&2
|
||||||
|
read -p "continue with installation? (y/N) "
|
||||||
|
|
||||||
|
case "$REPLY" in
|
||||||
|
y* | Y* ) ;;
|
||||||
|
* ) exit 1 ;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Execute `before_virtualenv` hooks.
|
||||||
|
for hook in "${before_hooks[@]}"; do eval "$hook"; done
|
||||||
|
|
||||||
|
# Plan cleanup on unsuccessful installation.
|
||||||
|
cleanup() {
|
||||||
|
[ -z "${PREFIX_EXISTS}" ] && rm -rf "$VIRTUALENV_PATH"
|
||||||
|
}
|
||||||
|
|
||||||
|
trap cleanup SIGINT
|
||||||
|
|
||||||
|
# Invoke virtualenv and record exit status in $STATUS.
|
||||||
|
STATUS=0
|
||||||
# virtualenv may download distribute/setuptools in current directory.
|
# virtualenv may download distribute/setuptools in current directory.
|
||||||
# change to cache directory to reuse them between invocation.
|
# change to cache directory to reuse them between invocation.
|
||||||
mkdir -p "${PYENV_VIRTUALENV_CACHE_PATH}"
|
mkdir -p "${PYENV_VIRTUALENV_CACHE_PATH}"
|
||||||
{
|
|
||||||
cd "${PYENV_VIRTUALENV_CACHE_PATH}"
|
cd "${PYENV_VIRTUALENV_CACHE_PATH}"
|
||||||
"${PYTHON_BIN}" "${VIRTUALENV}" "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}"
|
"${PYTHON_BIN}" "${VIRTUALENV}" "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}" || STATUS=$?
|
||||||
}
|
|
||||||
|
|
||||||
# create symlink of `python' bound for actual executable
|
# create symlink of `python' bound for actual executable
|
||||||
if [ ! -f "$VIRTUALENV_PYTHON_BIN" ]; then
|
if [ ! -f "$VIRTUALENV_PYTHON_BIN" ]; then
|
||||||
@@ -199,4 +242,14 @@ if [ ! -f "$VIRTUALENV_PYTHON_BIN" ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
pyenv-rehash
|
# Execute `after_virtualenv` hooks
|
||||||
|
for hook in "${after_hooks[@]}"; do eval "$hook"; done
|
||||||
|
|
||||||
|
# Run `pyenv-rehash` after a successful installation.
|
||||||
|
if [ "$STATUS" == "0" ]; then
|
||||||
|
pyenv rehash
|
||||||
|
else
|
||||||
|
cleanup
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit "$STATUS"
|
||||||
|
|||||||
Reference in New Issue
Block a user