diff --git a/plugins/python-build/README.md b/plugins/python-build/README.md index 978c9af6..1f4b5911 100644 --- a/plugins/python-build/README.md +++ b/plugins/python-build/README.md @@ -109,6 +109,8 @@ You can set certain environment variables to control the build process. downloaded package files. * `PYTHON_BUILD_MIRROR_URL` overrides the default mirror URL root to one of your choosing. +* `PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM`, if set, does not append the SHA2 + checksum of the file to the mirror URL. * `PYTHON_BUILD_SKIP_MIRROR`, if set, forces python-build to download packages from their original source URLs instead of using a mirror. * `PYTHON_BUILD_ROOT` overrides the default location from where build definitions @@ -182,6 +184,10 @@ You can point python-build to another mirror by specifying the own local mirror, for example. Package mirror URLs are constructed by joining this variable with the SHA2 checksum of the package file. +If the mirror being used does not have the same checksum (*e.g.* with a +pull-through cache like Artifactory), you can set the +`PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM` environment variable. + If you don't have an SHA2 program installed, python-build will skip the download mirror and use official URLs instead. You can force python-build to bypass the mirror by setting the `PYTHON_BUILD_SKIP_MIRROR` environment variable. diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index d2e829d3..d81e3b8f 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -480,7 +480,12 @@ reuse_existing_tarball() { } download_tarball() { - local package_url="$1" + local official_source="www.python.org/ftp/python" + if [ -n "$PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM" ]; then + local package_url="$(echo "$1" | sed -e "s|.*//${URL_BASE:-$official_source}|$PYTHON_BUILD_MIRROR_URL|g")" + else + local package_url="$1" + fi [ -n "$package_url" ] || return 1 local package_filename="$2" @@ -1953,7 +1958,11 @@ else PYTHON_BUILD_DEFAULT_MIRROR= fi -if [ -n "$PYTHON_BUILD_SKIP_MIRROR" ] || ! has_checksum_support compute_sha2; then +if [ -n "$PYTHON_BUILD_SKIP_MIRROR" ]; then + unset PYTHON_BUILD_MIRROR_URL +fi + +if ! has_checksum_support compute_sha2 && ! [ -n "$PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM" ] ; then unset PYTHON_BUILD_MIRROR_URL fi diff --git a/plugins/python-build/test/mirror.bats b/plugins/python-build/test/mirror.bats index 62ed38c0..c53b0096 100644 --- a/plugins/python-build/test/mirror.bats +++ b/plugins/python-build/test/mirror.bats @@ -70,6 +70,26 @@ export PYTHON_BUILD_MIRROR_URL=http://mirror.example.com unstub shasum } +@test "package is fetched from mirror when checksum is invalid if SKIP_CHECKSUM set" { + export PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM=1 + export PYTHON_BUILD_MIRROR_URL=https://custom.mirror.org + export URL_BASE=example.com + local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" + + stub shasum false + stub curl "-*I* : true" \ + "-q -o * -*S* https://custom.mirror.org/* : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$3" \ + + install_fixture definitions/with-checksum + + assert_success + assert [ -x "${INSTALL_ROOT}/bin/package" ] + + unstub curl + unstub shasum + unset PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM +} + @test "package is fetched from original URL if mirror download checksum is invalid" { local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5"