3 # Mirror script for use as a dgit-repos-server mirror hook
5 # In addition to updated-hook (invoked by dgit-repos-server),
6 # this script also supports the following ACTIONs:
7 # MIRROR-HOOK-SCRIPT ... setup [...] create queue dir etc.
8 # MIRROR-HOOK-SCRIPT ... backlog [...] do all packages which need it
9 # MIRROR-HOOK-SCRIPT ... all [...] do all packages
10 # MIRROR-HOOK-SCRIPT ... mirror PACKAGE [...] do just that, longer timeout
12 # DISTRO-DIR must contain a file `mirror-settings' which is a bash
13 # script fragment assigning the following variables:
14 # remoterepos for rsync, in form user@host:/dir
16 # hooktimeout default 30 [sec]
17 # rsynctimeout default 900 [sec]
18 # rsyncssh default 'ssh -o batchmode=yes'
19 # rsync array, default (rsync -rltH --safe-links --delete)
20 # repos default DISTRO-DIR/repos
21 # (optional settings are all set before mirror-settings is included,
22 # so you can modify them with += or some such)
28 case "$DGIT_DRS_DEBUG" in
34 echo >&2 "dgit-mirror-rsync: $*"; exit 127
37 if [ $# -lt 2 ]; then fail "too few arguments"; fi
43 */*) self="$PWD/$self" ;;
51 repos=$distrodir/repos
53 rsync=(rsync -rltH --safe-links --delete)
56 rsyncssh='ssh -o batchmode=yes'
57 mirror_gc_cmd='git gc --auto'
59 . $distrodir/mirror-settings
62 # $queue/$package.n - mirror needed
63 # $queue/$package.a - being attempted, or attempt failed
64 # $queue/$package.lock - lock (with-lock-ex)
65 # $queue/$package.err - stderr from failed (or current) run
66 # $queue/$package.log - stderr from last successful run
71 case "$remoterepos" in
73 '') fail "remoterepos config not set" ;;
74 *) fail "remoterepos config does not match *:/* or /*" ;;
78 if [ "x$mirror_gc_cmd" != x ]; then
80 cd "$repos/$package.git"
85 --timeout=$rsynctimeout \
87 "$repos/$package.git"/. \
88 "$remoterepos/$package.git"
96 "$self" "$distrodir" "reinvoke$newaction" "$package"
99 check-package-mirrorable () {
100 local repo=$repos/$package.git
101 local mode; mode=$(stat -c%a "$repo")
105 *) echo >&2 "unexpected mode $mode for $repo"; return 1 ;;
109 lock-and-process () {
110 check-package-mirrorable || return 0
111 reinvoke -locked with-lock-ex -w "$queue/$package.lock"
115 exec 3>&2 >"$queue/$package.err" 2>&1
117 rm -f "$queue/$package.a"
119 mv -f "$queue/$package.err" "$queue/$package.log"
120 if ! [ -s "$queue/$package.log" ]; then
121 rm "$queue/$package.log"
123 rm "$queue/$package.lock"
125 cat >&3 "$queue/$package.err"
130 lock-and-process-baseof-f () {
132 package=${package%.*}
139 check-package-mirrorable || exit 0
140 touch "$queue/$package.n"
141 reinvoke -timed timeout --foreground $hooktimeout
145 (lock-and-process) >/dev/null 2>&1
153 touch "$queue/$package.a"
154 rm -f "$queue/$package.n"
159 for f in $queue/*.[na]; do
160 (lock-and-process-baseof-f ||:)
165 for f in [a-z0-9]*.git; do
166 (lock-and-process-baseof-f)
171 test -d "$queue" || mkdir "$queue"
175 fail "bad action $action"