X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=infra%2Fdgit-mirror-rsync;h=2d912c8ad1dd30f335c2f52d8e4f6011a718a22c;hp=5b54d16cc0f9a1cdbf0be5251d1943b5f5d3d535;hb=b38d6d36f43ef8ac41a937cacbdb7e3ae5535a5a;hpb=f7724dce721e5c2c04e9e2b73e15effa5a675a55 diff --git a/infra/dgit-mirror-rsync b/infra/dgit-mirror-rsync index 5b54d16c..2d912c8a 100755 --- a/infra/dgit-mirror-rsync +++ b/infra/dgit-mirror-rsync @@ -26,7 +26,7 @@ set -o pipefail shopt -s nullglob case "$DGIT_DRS_DEBUG" in -''|0!1) ;; +''|0|1) ;; *) set -x ;; esac @@ -37,6 +37,13 @@ fail () { if [ $# -lt 2 ]; then fail "too few arguments"; fi self=$0 + +case "$self" in +/*) ;; +*/*) self="$PWD/$self" ;; +*) ;; +esac + distrodir=$1; shift action=$1; shift package=$1 @@ -47,6 +54,7 @@ rsync=(rsync -rltH --safe-links --delete) hooktimeout=30 rsynctimeout=900 rsyncssh='ssh -o batchmode=yes' +mirror_gc_cmd='git gc --auto' . $distrodir/mirror-settings @@ -67,6 +75,12 @@ case "$remoterepos" in esac actually () { + if [ "x$mirror_gc_cmd" != x ]; then + ( + cd "$repos/$package.git" + $mirror_gc_cmd + ) + fi "${rsync[@]}" \ --timeout=$rsynctimeout \ -e "$rsyncssh" \ @@ -79,12 +93,12 @@ reinvoke () { exec \ "$@" \ - "$0" "$distrodir" "reinvoke$newaction" "$package" + "$self" "$distrodir" "reinvoke$newaction" "$package" } check-package-mirrorable () { local repo=$repos/$package.git - local mode=$(stat -c%a "$repo") + local mode; mode=$(stat -c%a "$repo") case $mode in *5) return 0 ;; *0) return 1 ;; @@ -98,13 +112,17 @@ lock-and-process () { } attempt () { - exec >"$queue/$package.err" 2>&1 + exec 3>&2 >"$queue/$package.err" 2>&1 if actually; then - rm "$queue/$package.a" + rm -f "$queue/$package.a" + exec 2>&3 2>&1 mv -f "$queue/$package.err" "$queue/$package.log" + if ! [ -s "$queue/$package.log" ]; then + rm "$queue/$package.log" + fi rm "$queue/$package.lock" else - cat >&2 "$queue/$package.err" + cat >&3 "$queue/$package.err" exit 127 fi } @@ -139,13 +157,13 @@ reinvoke-locked) backlog) for f in $queue/*.[na]; do - lock-and-process-baseof-f + (lock-and-process-baseof-f ||:) done ;; all) for f in [a-z0-9]*.git; do - lock-and-process-baseof-f + (lock-and-process-baseof-f) done ;;