chiark / gitweb /
infrastructure: Run git gc --auto before mirroring. Closes:#841414.
[dgit.git] / infra / dgit-mirror-rsync
index 5b54d16..2d912c8 100755 (executable)
@@ -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
        ;;