update_mirrors.sh (1616B)
1 #!/bin/sh 2 # Updates git mirror repositories from upstream. This script is typically 3 # installed as a cron job for for user `git` via `crontab -e`: 4 # 5 # minute hour mday month wday command 6 # 0 * * * * ~/_git_infra/update_mirrors.sh ~/etc/mirrors_hourly.conf 7 # * 0 * * * ~/_git_infra/update_mirrors.sh ~/etc/mirrors_daily.conf 8 # * * * * 0 ~/_git_infra/update_mirrors.sh ~/etc/mirrors_weekly.conf 9 # 10 # The config files are formatted as one repo per line. The repos must be 11 # specified as absolute paths. 12 13 # Echos arguments to stderr. 14 printerr() { 15 >&2 echo "$@" 16 } 17 18 # Prints the usage string. 19 usage() { 20 printerr "usage: $0 CONFIG" 21 } 22 23 # Exits with failure if $1 is not an absolute path. 24 verify_absolute() { 25 case "$1" in 26 /*) 27 ;; 28 *) 29 printerr "[git mirror] ERROR: must use absolute paths: $1" 30 exit 1 31 ;; 32 esac 33 } 34 35 # Fetches the mirrors specified in the arguments list. 36 fetch_mirrors() { 37 mirrors="$*" 38 for mirror in $mirrors; do 39 verify_absolute "$mirror" 40 if [ -d "$mirror" ]; then 41 cd "$mirror" 42 printerr "[git mirror] ... $mirror" 43 git fetch 44 45 # Regenerate static pages for public, unlisted repos. 46 if [ -e git-daemon-export-ok ]; then 47 grm rc `basename "$mirror" '.git'` 48 fi 49 else 50 printerr "[git mirror] ... $mirror NOT FOUND" 51 fi 52 done 53 } 54 55 CONFIG="$1" 56 if [ -z "${CONFIG}" ]; then 57 usage 58 exit 1 59 fi 60 61 printerr "[git mirror] Updating mirror repos from $CONFIG" 62 if [ -f "$CONFIG" ]; then 63 fetch_mirrors "$(sort -u "$CONFIG")" 64 fi