diff --git a/bin/ruby-build b/bin/ruby-build index 17de5168..3bc6cb2f 100755 --- a/bin/ruby-build +++ b/bin/ruby-build @@ -227,7 +227,7 @@ http_head_curl() { } http_get_curl() { - curl -C - -o "${2:--}" -qsSLf "$1" + curl -q -o "${2:--}" -sSLf "$1" } http_head_wget() { @@ -235,7 +235,7 @@ http_head_wget() { } http_get_wget() { - wget -nv -c -O "${2:--}" "$1" + wget -nv -O "${2:--}" "$1" } fetch_tarball() { @@ -261,7 +261,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" || @@ -278,13 +278,19 @@ fetch_tarball() { } >&4 2>&1 } -symlink_tarball_from_cache() { - [ -n "$RUBY_BUILD_CACHE_PATH" ] || return 1 - +reuse_existing_tarball() { local package_filename="$1" - local cached_package_filename="${RUBY_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 "$RUBY_BUILD_CACHE_PATH" ] || return 1 + local cached_package_filename="${RUBY_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 diff --git a/test/cache.bats b/test/cache.bats index 8c71c358..8819facf 100644 --- a/test/cache.bats +++ b/test/cache.bats @@ -11,7 +11,7 @@ setup() { @test "packages are saved to download cache" { stub md5 true - 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/without-checksum [ "$status" -eq 0 ] @@ -59,7 +59,7 @@ setup() { stub md5 true "echo invalid" "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" touch "${RUBY_BUILD_CACHE_PATH}/package-1.0.0.tar.gz" @@ -76,7 +76,7 @@ setup() { @test "nonexistent cache directory is ignored" { stub md5 true - 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" export RUBY_BUILD_CACHE_PATH="${TMP}/nonexistent" diff --git a/test/checksum.bats b/test/checksum.bats index 3c4ffc3f..5bdbf1d5 100644 --- a/test/checksum.bats +++ b/test/checksum.bats @@ -7,7 +7,7 @@ export RUBY_BUILD_CACHE_PATH= @test "package URL without checksum" { stub md5 true - 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/without-checksum [ "$status" -eq 0 ] @@ -20,7 +20,7 @@ export RUBY_BUILD_CACHE_PATH= @test "package URL with valid checksum" { stub md5 true "echo 83e6d7725e20166024a1eb74cde80677" - 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 ] @@ -33,7 +33,7 @@ export RUBY_BUILD_CACHE_PATH= @test "package URL with invalid checksum" { stub md5 true "echo 83e6d7725e20166024a1eb74cde80677" - 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-invalid-checksum [ "$status" -eq 1 ] @@ -46,7 +46,7 @@ export RUBY_BUILD_CACHE_PATH= @test "package URL with checksum but no MD5 support" { 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 ] @@ -59,7 +59,7 @@ export RUBY_BUILD_CACHE_PATH= @test "package with invalid checksum" { stub md5 true "echo invalid" - 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 1 ] @@ -68,3 +68,46 @@ export RUBY_BUILD_CACHE_PATH= unstub curl unstub md5 } + +@test "existing tarball in build location is reused" { + stub md5 true "echo 83e6d7725e20166024a1eb74cde80677" + stub curl false + stub wget false + + export -n RUBY_BUILD_CACHE_PATH + export RUBY_BUILD_BUILD_PATH="${TMP}/build" + + mkdir -p "$RUBY_BUILD_BUILD_PATH" + ln -s "${FIXTURE_ROOT}/package-1.0.0.tar.gz" "$RUBY_BUILD_BUILD_PATH" + + run_inline_definition <&2 @@ -22,7 +22,7 @@ export RUBY_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 RUBY_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 RUBY_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 RUBY_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 RUBY_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 ]