27 Commits

Author SHA1 Message Date
Yamashita Yuu
78af7ec9d4 release v20130507 2013-05-07 19:55:31 +09:00
Yamashita Yuu
5b357d2862 display virtualenv's help message on '--help' 2013-05-01 13:07:49 +09:00
Yamashita Yuu
5baa5084dc don't capture '-v' option in $VERBOSE to pass it to virtualenv 2013-05-01 13:05:32 +09:00
Yamashita Yuu
0f8477fcf5 store distribute/setuptools archive in $PYTHON_BUILD_CACHE_PATH to reuse
them between invocations.
2013-04-30 19:55:49 +09:00
Yamashita Yuu
aec759a0e0 ignore error on checking virtualenv version 2013-04-26 13:03:35 +09:00
Yamashita Yuu
15608701ae show virtualenv version in pyenv virtualenv --version 2013-04-25 22:10:29 +09:00
Yamashita Yuu
d927b2e137 update virtualenv version (1.8.4 -> 1.9.1) 2013-04-25 21:45:44 +09:00
Yamashita Yuu
ebeb3dcb71 fix wrong path for libexec 2013-03-27 15:15:44 +09:00
Yamashita Yuu
8b1ae9f19a update README. add note about pyenv-virtualenvwrapper. 2013-03-22 15:38:08 +09:00
Yamashita Yuu
003ea01b97 release v20130307 2013-03-07 13:12:17 +09:00
Yamashita Yuu
1a2d06bc05 update copyright 2013-02-23 19:09:49 +09:00
Yamashita Yuu
5ed1988b34 update README 2013-02-23 16:46:09 +09:00
Yamashita Yuu
c65e8b266b update README 2013-02-20 18:43:07 +09:00
Yamashita Yuu
6ee4bf1e5c Update virtualenv version; 1.8.2 -> 1.8.4 2013-02-18 13:16:10 +09:00
Yamashita Yuu
2910f87cb6 Preparing for renaming project; s/python-virtualenv/pyenv-virtualenv/g 2013-02-18 13:14:42 +09:00
Yamashita Yuu
9651cfe63d release 20130218 2013-02-18 12:42:21 +09:00
Yamashita Yuu
317fcdbfe7 add rbenv 0.4.x style documentation 2013-01-31 12:23:17 +09:00
Yamashita Yuu
fce66ebba7 s/an/a/g 2012-11-06 13:21:21 +09:00
Yamashita Yuu
2551913d75 fix broken markup in README 2012-11-02 22:03:01 +09:00
Yamashita Yuu
2e418ee563 release 20121023 2012-10-23 15:50:39 +09:00
Yamashita Yuu
7121fe04b0 add install.sh 2012-10-23 15:44:59 +09:00
Yamashita Yuu
908334a8e5 update help messages 2012-10-18 12:01:04 +09:00
Yamashita Yuu
50403a674e update README 2012-10-18 11:37:42 +09:00
Yamashita Yuu
83a85e0193 enable creating virtualenv based on "system" python.
*NOTE*
change first argument of python-virtualenv to path to the python
executable, not a prefix of python installation.
2012-10-16 00:05:34 +09:00
Yamashita Yuu
67fc864252 python 2.6 and older don't have "bin/python" as symlink.
so we must traverse files like "bin/python*" to obtain canonical name..
2012-09-28 20:11:06 +09:00
Yamashita Yuu
bd38d39ea4 create virtualenv by actual executable name such as python2.7 or pypy. 2012-09-28 12:58:06 +09:00
Yamashita Yuu
ed5f3eef77 ignore cache files generated by python3 and jython. 2012-09-28 12:33:31 +09:00
7 changed files with 706 additions and 449 deletions

6
.gitignore vendored
View File

@@ -1,4 +1,6 @@
*.pyc /libexec/*.class
*.pyo /libexec/*.pyc
/libexec/*.pyo
/libexec/__pycache__
*.swo *.swo
*.swp *.swp

View File

@@ -1,5 +1,4 @@
Copyright (c) 2012 Yamashita, Yuu Copyright (c) 2013 Yamashita, Yuu
Copyright (c) 2011 Sam Stephenson
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the

View File

@@ -1,27 +1,29 @@
# python-virtualenv # pyenv-virtualenv (a.k.a. [python-virtualenv](https://github.com/yyuu/python-virtualenv))
python-virtualenv is an [pyenv](https://github.com/yyuu/pyenv) plugin pyenv-virtualenv is a [pyenv](https://github.com/yyuu/pyenv) plugin
that provides an `pyenv virtualenv` command to create virtualenv for Python that provides an `pyenv virtualenv` command to create virtualenv for Python
on UNIX-like systems. on UNIX-like systems.
(NOTICE: If you are an existing user of [virtualenvwrapper](http://pypi.python.org/pypi/virtualenvwrapper)
and you love it, [pyenv-virtualenvwrapper](https://github.com/yyuu/pyenv-virtualenvwrapper) may help you
to manage your virtualenvs.)
## Installation ## Installation
### Installing as an pyenv plugin (recommended) ### Installing as a pyenv plugin
Installing python-virtualenv as an pyenv plugin will give you access to the Installing pyenv-virtualenv as a pyenv plugin will give you access to the
`pyenv virtualenv` command. `pyenv virtualenv` command.
$ mkdir -p ~/.pyenv/plugins $ mkdir -p ~/.pyenv/plugins
$ cd ~/.pyenv/plugins $ cd ~/.pyenv/plugins
$ git clone git://github.com/yyuu/python-virtualenv.git $ git clone git://github.com/yyuu/pyenv-virtualenv.git
This will install the latest development version of python-virtualenv into This will install the latest development version of pyenv-virtualenv into
the `~/.pyenv/plugins/python-virtualenv` directory. From that directory, you the `~/.pyenv/plugins/pyenv-virtualenv` directory. From that directory, you
can check out a specific release tag. To update python-virtualenv, run `git can check out a specific release tag. To update pyenv-virtualenv, run `git
pull` to download the latest changes. pull` to download the latest changes.
## Usage ## Usage
### Using `pyenv virtualenv` with pyenv ### Using `pyenv virtualenv` with pyenv
@@ -30,7 +32,7 @@ To create a virtualenv for the Python version use with pyenv, run
`pyenv virtualenv` with tha exact name of the version you want to create `pyenv virtualenv` with tha exact name of the version you want to create
virtualenv. For example, virtualenv. For example,
$ pyenv virtualenv 2.7.3 venv27 $ pyenv virtualenv --distribute 2.7.3 venv27
virtualenvs will be created into a directory of the same name virtualenvs will be created into a directory of the same name
under `~/.pyenv/versions`. under `~/.pyenv/versions`.
@@ -38,6 +40,29 @@ under `~/.pyenv/versions`.
## Version History ## Version History
#### 20130507
* Display virtualenv information in `--help` and `--version`
* Update virtualenv version; 1.8.4 -> 1.9.1
#### 20130307
* Rename the project; `s/python-virtualenv/pyenv-virtualenv/g`
* The `pyenv-virtualenv` script is not depending on `python-virtualenv` now.
`python-virtualenv` will left for compatibility and will not continue for future releases.
* Update virtualenv version; 1.8.2 -> 1.8.4
#### 20130218
* Add pyenv 0.2.x (rbenv 0.4.x) style help messages.
#### 20121023
* Create virtualenv with exact name of python executables.
* Changed command-line options of python-virtualenv.
First argument should be a path to the python executable.
* Add install script.
#### 20120927 #### 20120927
* Initial public release. * Initial public release.
@@ -46,8 +71,7 @@ under `~/.pyenv/versions`.
(The MIT License) (The MIT License)
Copyright (c) 2012 Yamashita, Yuu * Copyright (c) 2013 Yamashita, Yuu
Copyright (c) 2011 Sam Stephenson
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the a copy of this software and associated documentation files (the

View File

@@ -1,31 +1,84 @@
#!/usr/bin/env bash #!/usr/bin/env bash
#
# Summary: Create a Python virtualenv using the pyenv-virtualenv plugin
#
# Usage: pyenv virtualenv [VIRTUALENV_OPTIONS] <version> <virtualenv-name>
# pyenv virtualenv --version
# pyenv virtualenv --help
#
PYENV_VIRTUALENV_VERSION="20130507"
set -e set -e
[ -n "$PYENV_DEBUG" ] && set -x [ -n "$PYENV_DEBUG" ] && set -x
# Provide pyenv completions # Provide pyenv completions
if [ "$1" = "--complete" ]; then if [ "$1" = "--complete" ]; then
exec pyenv versions --bare exec pyenv-versions --bare
fi fi
if [ -z "$PYENV_ROOT" ]; then if [ -z "$PYENV_ROOT" ]; then
PYENV_ROOT="${HOME}/.pyenv" PYENV_ROOT="${HOME}/.pyenv"
fi fi
# Load shared library functions # Define library functions
eval "$(python-virtualenv --lib)" parse_options() {
OPTIONS=()
ARGUMENTS=()
local arg option index
for arg in "$@"; do
if [ "${arg:0:1}" = "-" ]; then
if [ "${arg:1:1}" = "-" ]; then
OPTIONS[${#OPTIONS[*]}]="${arg:2}"
else
index=1
while option="${arg:$index:1}"; do
[ -n "$option" ] || break
OPTIONS[${#OPTIONS[*]}]="$option"
index=$(($index+1))
done
fi
else
ARGUMENTS[${#ARGUMENTS[*]}]="$arg"
fi
done
}
resolve_link() {
$(type -p greadlink readlink | head -1) "$1"
}
abs_dirname() {
local cwd="$(pwd)"
local path="$1"
while [ -n "$path" ]; do
cd "${path%/*}"
local name="${path##*/}"
path="$(resolve_link "$name" || true)"
done
pwd
cd "$cwd"
}
version() {
local VIRTUALENV_VERSION="$(pyenv-exec python "${VIRTUALENV}" --version || true)"
echo "pyenv-virtualenv ${PYENV_VIRTUALENV_VERSION} (virtualenv ${VIRTUALENV_VERSION:-unknown})"
}
usage() { usage() {
{ echo "usage: pyenv virtualenv [-v|--verbose] [VIRTUALENV_OPTIONS] PYTHON_VERSION NAME" # We can remove the sed fallback once pyenv 0.2.0 is widely available.
echo pyenv-help virtualenv 2>/dev/null || sed -ne '/^#/!q;s/.//;s/.//;1,4d;p' < "$0"
echo " -v/--verbose Verbose mode: print compilation status to stdout" pyenv-exec python "${VIRTUALENV}" --help 2>/dev/null || true
echo
} >&2
[ -z "$1" ] || exit "$1" [ -z "$1" ] || exit "$1"
} }
unset VERBOSE PYENV_VIRTUALENV_ROOT="$(abs_dirname "$0")/.."
VIRTUALENV="${PYENV_VIRTUALENV_ROOT}/libexec/pyenv-virtualenv/virtualenv.py"
[ -f "${VIRTUALENV}" ] || VIRTUALENV="${PYENV_VIRTUALENV_ROOT}/libexec/python-virtualenv/virtualenv.py" # backward compatibility before v20130307
[ -f "${VIRTUALENV}" ] || VIRTUALENV="${PYENV_VIRTUALENV_ROOT}/libexec/virtualenv.py"
VIRTUALENV_OPTIONS=() VIRTUALENV_OPTIONS=()
parse_options "$@" parse_options "$@"
@@ -34,11 +87,9 @@ for option in "${OPTIONS[@]}"; do
"h" | "help" ) "h" | "help" )
usage 0 usage 0
;; ;;
"v" | "verbose" )
VERBOSE="-v"
;;
"version" ) "version" )
exec python-virtualenv --version version
exit 0
;; ;;
* ) * )
VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--$option" VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--$option"
@@ -53,9 +104,49 @@ for script in $(pyenv-hooks virtualenv); do
source "$script" source "$script"
done done
PYTHON_PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}" PYTHON_BIN=$(PYENV_VERSION="${VERSION_NAME}" pyenv-which python)
if [ ! -x "${PYTHON_BIN}" ]; then
echo "pyenv-virtualenv: could not obtain python executable: ${PYTHON_BIN}" >&2
exit 1
fi
# find canonical name of python executable.
# virtualenv will create "bin/python" executable as same name as its bootstraped python.
if [ -L "${PYTHON_BIN}" ]; then
while [ -L "${PYTHON_BIN}" ]; do # retrieve symlinks
PYTHON_BIN="$(dirname "${PYTHON_BIN}")/$(resolve_link "${PYTHON_BIN}")"
done
else
# python 2.6 and older don't have "bin/python" as symlink.
# so we must traverse files like "bin/python*" to obtain canonical name.
for python in ${PYENV_ROOT}/versions/${VERSION_NAME}/bin/python*; do
if ( basename "$python" | grep '^python[0-9][0-9]*\.[0-9][0-9]*$' && cmp "$PYTHON_BIN" "$python" ) >/dev/null; then
PYTHON_BIN="${python}"
break
fi
done
fi
VIRTUALENV_NAME="${ARGUMENTS[1]##*/}" VIRTUALENV_NAME="${ARGUMENTS[1]##*/}"
VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}" VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}"
python-virtualenv $VERBOSE "${VIRTUALENV_OPTIONS[@]}" "$PYTHON_PREFIX" "$VIRTUALENV_PATH" # virtualenv may download distribute/setuptools in current directory.
pyenv rehash # change to cache directory to reuse them between invocation.
VIRTUALENV_CACHE_PATH="${PYTHON_BUILD_CACHE_PATH:-${PYENV_ROOT}/cache}"
mkdir -p "${VIRTUALENV_CACHE_PATH}"
{
cd "${VIRTUALENV_CACHE_PATH}"
"${PYTHON_BIN}" "${VIRTUALENV}" "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}"
}
# create symlink of `python' bound for actual executable
if [ ! -f "$VIRTUALENV_PYTHON_BIN" ]; then
if [ -f "${VIRTUALENV_PATH}/bin/$(basename "${PYTHON_BIN}")" ]; then
{
cd ${VIRTUALENV_PATH}/bin
ln -fs "$(basename "${PYTHON_BIN}")" python
}
fi
fi
pyenv-rehash

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
PYTHON_VIRTUALENV_VERSION="20120927" PYTHON_VIRTUALENV_VERSION="20130507"
set -E set -E
exec 3<&2 # preserve original stderr at fd 3 exec 3<&2 # preserve original stderr at fd 3
@@ -30,14 +30,6 @@ lib() {
done done
} }
if [ "$1" == "--$FUNCNAME" ]; then
declare -f "$FUNCNAME"
echo "$FUNCNAME \"\$1\";"
exit
fi
}
lib "$1"
resolve_link() { resolve_link() {
$(type -p greadlink readlink | head -1) "$1" $(type -p greadlink readlink | head -1) "$1"
} }
@@ -56,13 +48,21 @@ abs_dirname() {
cd "$cwd" cd "$cwd"
} }
if [ "$1" == "--$FUNCNAME" ]; then
declare -f "$FUNCNAME"
echo "$FUNCNAME \"\$1\";"
exit
fi
}
lib "$1"
version() { version() {
echo "python-virtualenv ${PYTHON_VIRTUALENV_VERSION}" echo "python-virtualenv ${PYTHON_VIRTUALENV_VERSION}"
} }
usage() { usage() {
{ version { version
echo "usage: python-virtualenv [-v|--verbose] [VIRTUALENV_OPTIONS] python_prefix virtualenv_path" echo "usage: python-virtualenv [-v|--verbose] [VIRTUALENV_OPTIONS] python_bin virtualenv_path"
} >&2 } >&2
if [ -z "$1" ]; then if [ -z "$1" ]; then
@@ -99,11 +99,11 @@ for option in "${OPTIONS[@]}"; do
esac esac
done done
PYTHON_PREFIX="${ARGUMENTS[0]}" PYTHON_BIN="${ARGUMENTS[0]}"
if [ -z "$PYTHON_PREFIX" ]; then if [ -z "${PYTHON_BIN}" ]; then
usage usage
elif [ ! -x "${PYTHON_PREFIX}/bin/python" ]; then elif [ ! -x "${PYTHON_BIN}" ]; then
echo "python-virtualenv: python not found: ${PYTHON_PREFIX}" >&2 echo "python-virtualenv: given python is not an executable: ${PYTHON_BIN}" >&2
exit 1 exit 1
fi fi
@@ -112,7 +112,19 @@ if [ -z "$VIRTUALENV_PATH" ]; then
usage usage
fi fi
PYTHON_BIN="${PYTHON_PREFIX}/bin/python" VIRTUALENV_PYTHON_BIN="${VIRTUALENV_PATH}/bin/python"
CWD="$(pwd)"
"${PYTHON_BIN}" "${PYTHON_VIRTUALENV_ROOT}/libexec/virtualenv.py" --python="${PYTHON_BIN}" "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}" # create virtualenv
VIRTUALENV="${PYTHON_VIRTUALENV_ROOT}/libexec/python-virtualenv/virtualenv.py"
[ -f "${VIRTUALENV}" ] || VIRTUALENV="${PYTHON_VIRTUALENV_ROOT}/libexec/virtualenv.py"
"${PYTHON_BIN}" "${VIRTUALENV}" "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}"
# create symlink of `python' bound for actual executable
if [ ! -f "$VIRTUALENV_PYTHON_BIN" ]; then
if [ -f "${VIRTUALENV_PATH}/bin/$(basename "${PYTHON_BIN}")" ]; then
{
cd ${VIRTUALENV_PATH}/bin
ln -fs "$(basename "${PYTHON_BIN}")" python
}
fi
fi

23
install.sh Executable file
View File

@@ -0,0 +1,23 @@
#!/bin/sh
set -e
if [ -z "${PREFIX}" ]; then
PREFIX="/usr/local"
fi
BIN_PATH="${PREFIX}/bin"
LIBEXEC_PATH="${PREFIX}/libexec/pyenv-virtualenv"
mkdir -p "${BIN_PATH}"
mkdir -p "${LIBEXEC_PATH}"
for file in bin/*; do
cp "${file}" "${BIN_PATH}"
done
for file in libexec/*; do
cp "${file}" "${LIBEXEC_PATH}"
done
echo "Installed pyenv-virtualenv at ${PREFIX}"

File diff suppressed because it is too large Load Diff