1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
#!/usr/bin/env bash
# Usage: script/mirror update <COMMIT-RANGE>
# script/mirror verify <COMMIT-RANGE>
# script/mirror stats
set -e
eval "$(grep RUBY_BUILD_MIRROR_URL= ./bin/ruby-build | head -1)"
help_text() {
sed -ne '/^#/!q;s/.\{1,2\}//;1d;p' < "$0"
}
test_mirrored() {
curl -qsSfIL "$RUBY_BUILD_MIRROR_URL/$1" >/dev/null 2>&1
}
compute_sha2() {
local output="$(openssl dgst -sha256)"
echo "${output##* }" | tr '[A-Z]' '[a-z]'
}
download_package() {
curl -qsSfL -o "$2" "$1"
}
download_and_verify() {
local checksum
local url="$1"
local file="$2"
local expected="$3"
download_package "$url" "$file"
checksum="$(compute_sha2 < "$file")"
if [ "$checksum" != "$expected" ]; then
echo "Error: $url doesn't match its checksum $expected" >&2
return 1
fi
}
changed_files() {
git diff --name-only --diff-filter=ACMR "$@"
}
potentially_new_packages() {
local files="$(changed_files "$1" -- ./share/ruby-build)"
[ -n "$files" ] && extract_urls $files
}
extract_urls() {
$(type -p ggrep grep | head -1) -hoe 'http[^"]\+#[^"]\+' "$@" | sort | uniq
}
update() {
local url
local checksum
local file
for url in $(potentially_new_packages "$1"); do
checksum="${url#*#}"
url="${url%#*}"
if test_mirrored "$checksum"; then
echo "Already mirrored: $url"
else
echo "Mirroring: $url"
file="${TMPDIR:-/tmp}/$checksum"
download_and_verify "$url" "$file" "$checksum"
./script/s3-put "$file" "${AMAZON_S3_BUCKET?}"
fi
done
}
verify() {
local url
local checksum
local file
for url in $(potentially_new_packages "$1"); do
checksum="${url#*#}"
url="${url%#*}"
echo "Verifying checksum for $url"
file="${TMPDIR:-/tmp}/$checksum"
download_and_verify "$url" "$file" "$checksum"
done
}
stats() {
local packages=( $(extract_urls ./share/ruby-build/*) )
local total="${#packages[@]}"
local confirmed=0
local checksum
for url in "${packages[@]}"; do
checksum="${url#*#}"
if test_mirrored "$checksum"; then
confirmed="$((confirmed + 1))"
else
echo "failed: $url" >&2
fi
echo -n "."
done
echo
echo "$confirmed/$total mirrored"
}
cmd="$1"
case "$cmd" in
update | verify | stats )
shift 1
"$cmd" "$@"
;;
-h | --help )
help_text
exit 0
;;
* )
help_text >&2
exit 1
;;
esac
|