diff --git a/plugins/python-build/bin/pyenv-install b/plugins/python-build/bin/pyenv-install index cb6cf623..1c30ac8c 100755 --- a/plugins/python-build/bin/pyenv-install +++ b/plugins/python-build/bin/pyenv-install @@ -6,16 +6,17 @@ # pyenv install [-f] [-kvp] # pyenv install -l|--list # -# -l/--list List all available versions -# -f/--force Install even if the version appears to be installed already +# -l/--list List all available versions +# -f/--force Install even if the version appears to be installed already +# -s/--skip-existing Skip if the version appears to be installed already # # python-build options: # -# -k/--keep Keep source tree in $PYENV_BUILD_ROOT after installation -# (defaults to $PYENV_ROOT/sources) -# -v/--verbose Verbose mode: print compilation status to stdout -# -p/--patch Apply a patch from stdin before building -# -g/--debug Build a debug version +# -k/--keep Keep source tree in $PYENV_BUILD_ROOT after installation +# (defaults to $PYENV_ROOT/sources) +# -v/--verbose Verbose mode: print compilation status to stdout +# -p/--patch Apply a patch from stdin before building +# -g/--debug Build a debug version # # For detailed information on installing Python versions with # python-build, including a list of environment variables for adjusting @@ -52,6 +53,7 @@ indent() { } unset FORCE +unset SKIP_EXISTING unset KEEP unset VERBOSE unset HAS_PATCH @@ -71,6 +73,9 @@ for option in "${OPTIONS[@]}"; do "f" | "force" ) FORCE=true ;; + "s" | "skip-existing" ) + SKIP_EXISTING=true + ;; "k" | "keep" ) [ -n "${PYENV_BUILD_ROOT}" ] || PYENV_BUILD_ROOT="${PYENV_ROOT}/sources" ;; @@ -134,14 +139,21 @@ PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}" # If the installation prefix exists, prompt for confirmation unless # the --force option was specified. -if [ -z "$FORCE" ] && [ -d "${PREFIX}/bin" ]; then - echo "pyenv: $PREFIX already exists" >&2 - read -p "continue with installation? (y/N) " +if [ -d "${PREFIX}/bin" ]; then + if [ -z "$FORCE" ] && [ -z "$SKIP_EXISTING" ]; then + echo "pyenv: $PREFIX already exists" >&2 + read -p "continue with installation? (y/N) " - case "$REPLY" in - y* | Y* ) ;; - * ) exit 1 ;; - esac + case "$REPLY" in + y* | Y* ) ;; + * ) exit 1 ;; + esac + elif [ -n "$SKIP_EXISTING" ]; then + # Since we know the python version is already installed, and are opting to + # not force installation of existing versions, we just `exit 0` here to + # leave things happy + exit 0 + fi fi # If PYENV_BUILD_ROOT is set, always pass keep options to python-build. @@ -158,7 +170,7 @@ fi # Default PYENV_VERSION to the friendly Python version. (The # CPython installer requires an existing Python installation to run. An -# unsatisfied local python version can cause the installer to +# unsatisfied local .python-version file can cause the installer to # fail.) if [[ "${VERSION_NAME}" == [23]"."* ]]; then for version in "${VERSION_NAME%-dev}" "${VERSION_NAME%.*}" "${VERSION_NAME%%.*}"; do diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 638879bc..13bc3264 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -1,6 +1,6 @@ #!/usr/bin/env bash -PYTHON_BUILD_VERSION="20140225" +PYTHON_BUILD_VERSION="20140408" set -E exec 3<&2 # preserve original stderr at fd 3 @@ -245,7 +245,7 @@ http_head_curl() { } http_get_curl() { - curl -C - -o "${2:--}" -qsSLf "$1" + curl -q -o "${2:--}" -sSLf "$1" } http_head_wget() { @@ -253,7 +253,7 @@ http_head_wget() { } http_get_wget() { - wget -nv -c -O "${2:--}" "$1" + wget -nv -O "${2:--}" "$1" } fetch_tarball() { @@ -283,7 +283,7 @@ fetch_tarball() { tar_args="${tar_args/z/j}" fi - if ! symlink_tarball_from_cache "$package_filename" "$checksum"; then + if ! reuse_existing_tarball "$package_filename" "$checksum"; then echo "Downloading ${package_filename}..." >&2 http head "$mirror_url" && download_tarball "$mirror_url" "$package_filename" "$checksum" || @@ -300,13 +300,19 @@ fetch_tarball() { } >&4 2>&1 } -symlink_tarball_from_cache() { - [ -n "$PYTHON_BUILD_CACHE_PATH" ] || return 1 - +reuse_existing_tarball() { local package_filename="$1" - local cached_package_filename="${PYTHON_BUILD_CACHE_PATH}/$package_filename" local checksum="$2" + # Reuse existing file in build location + if [ -e "$package_filename" ] && verify_checksum "$package_filename" "$checksum"; then + return 0 + fi + + # Reuse previously downloaded file in cache location + [ -n "$PYTHON_BUILD_CACHE_PATH" ] || return 1 + local cached_package_filename="${PYTHON_BUILD_CACHE_PATH}/$package_filename" + [ -e "$cached_package_filename" ] || return 1 verify_checksum "$cached_package_filename" "$checksum" >&4 2>&1 || return 1 ln -s "$cached_package_filename" "$package_filename" >&4 2>&1 || return 1 @@ -429,7 +435,7 @@ fetch_jar() { local package_filename="${package_name}.jar" - if ! symlink_tarball_from_cache "$package_filename" "$checksum"; then + if ! reuse_existing_tarball "$package_filename" "$checksum"; then echo "Downloading ${package_filename}..." >&2 http head "$mirror_url" && download_tarball "$mirror_url" "$package_filename" "$checksum" || @@ -463,7 +469,7 @@ fetch_zip() { local package_filename="${package_name}.zip" - if ! symlink_tarball_from_cache "$package_filename" "$checksum"; then + if ! reuse_existing_tarball "$package_filename" "$checksum"; then echo "Downloading ${package_filename}..." >&2 http head "$mirror_url" && download_tarball "$mirror_url" "$package_filename" "$checksum" || @@ -497,7 +503,7 @@ fetch_script() { local package_filename="${package_name}.sh" # TODO: extract suffix from ${package_url} - if ! symlink_tarball_from_cache "$package_filename" "$checksum"; then + if ! reuse_existing_tarball "$package_filename" "$checksum"; then echo "Downloading ${package_filename}..." >&2 http head "$mirror_url" && download_tarball "$mirror_url" "$package_filename" "$checksum" || @@ -860,7 +866,9 @@ fix_rbx_gem_binstubs() { for file in "$gemdir"/*; do binstub="${bindir}/${file##*/}" rm -f "$binstub" - sed -E "s:^#\!.+:#\!${bindir}/ruby:" < "$file" > "$binstub" + { echo "#!${bindir}/ruby" + cat "$file" + } > "$binstub" chmod +x "$binstub" done rm -rf "$gemdir" diff --git a/plugins/python-build/test/build.bats b/plugins/python-build/test/build.bats index e5c15d2e..23ed87a2 100644 --- a/plugins/python-build/test/build.bats +++ b/plugins/python-build/test/build.bats @@ -56,7 +56,7 @@ assert_build_log() { } @test "yaml is installed for python" { - cached_tarball "yaml-0.1.5" + cached_tarball "yaml-0.1.6" cached_tarball "Python-3.2.1" stub brew false @@ -69,7 +69,7 @@ assert_build_log() { unstub make assert_build_log <&2 @@ -22,7 +22,7 @@ export PYTHON_BUILD_MIRROR_URL=http://mirror.example.com @test "package URL with checksum but no MD5 support bypasses mirror" { stub md5 false - stub curl "-C - -o * -*S* http://example.com/* : cp $FIXTURE_ROOT/\${6##*/} \$4" + stub curl "-q -o * -*S* http://example.com/* : cp $FIXTURE_ROOT/\${5##*/} \$3" install_fixture definitions/with-checksum [ "$status" -eq 0 ] @@ -39,7 +39,7 @@ export PYTHON_BUILD_MIRROR_URL=http://mirror.example.com stub md5 true "echo $checksum" stub curl "-*I* $mirror_url : true" \ - "-C - -o * -*S* $mirror_url : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$4" + "-q -o * -*S* $mirror_url : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$3" install_fixture definitions/with-checksum [ "$status" -eq 0 ] @@ -56,7 +56,7 @@ export PYTHON_BUILD_MIRROR_URL=http://mirror.example.com stub md5 true "echo $checksum" stub curl "-*I* $mirror_url : false" \ - "-C - -o * -*S* http://example.com/* : cp $FIXTURE_ROOT/\${6##*/} \$4" + "-q -o * -*S* http://example.com/* : cp $FIXTURE_ROOT/\${5##*/} \$3" install_fixture definitions/with-checksum [ "$status" -eq 0 ] @@ -73,8 +73,8 @@ export PYTHON_BUILD_MIRROR_URL=http://mirror.example.com stub md5 true "echo invalid" "echo $checksum" stub curl "-*I* $mirror_url : true" \ - "-C - -o * -*S* $mirror_url : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$4" \ - "-C - -o * -*S* http://example.com/* : cp $FIXTURE_ROOT/\${6##*/} \$4" + "-q -o * -*S* $mirror_url : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$3" \ + "-q -o * -*S* http://example.com/* : cp $FIXTURE_ROOT/\${5##*/} \$3" install_fixture definitions/with-checksum echo "$output" >&2 @@ -92,7 +92,7 @@ export PYTHON_BUILD_MIRROR_URL=http://mirror.example.com stub md5 true "echo $checksum" stub curl "-*I* : true" \ - "-C - -o * -*S* http://?*/$checksum : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$4" \ + "-q -o * -*S* http://?*/$checksum : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$3" \ install_fixture definitions/with-checksum [ "$status" -eq 0 ]