File: mirror

package info (click to toggle)
ruby-build 20170726-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,704 kB
  • ctags: 129
  • sloc: sh: 1,694; makefile: 11
file content (116 lines) | stat: -rwxr-xr-x 2,361 bytes parent folder | download | duplicates (4)
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