clone/update: optimize ref removal
[girocco.git] / toolbox / update-all-hooks.sh
blob908602e88b676853bc4f28ad3a2ae741eea6df1a
1 #!/bin/sh
3 # Update all out-of-date hooks in all current projects and install missing ones
5 # If one or more project names are given, just update those instead
7 set -e
9 . @basedir@/shlib.sh
11 force=
12 dryrun=
13 [ "$1" != "--force" -a "$1" != "-f" ] || { force=1; shift; }
14 [ "$1" != "--dry-run" -a "$1" != "-n" ] || { dryrun=1; shift; }
15 case "$1" in -*) echo "Invalid options: $1" >&2; exit 1;; esac
17 if is_root; then
18 printf '%s\n' "$(basename "$0"): refusing to run as root -- bad things would happen"
19 exit 1
22 umask 002
24 write_mob_hook() {
25 echo '#!'@shbin@
26 echo "cd .. && GIT_DIR=. GIROCCO_PERSONAL_MOB=1 exec hooks/$1"
29 base="${cfg_reporoot%/}"
30 hookbin="$cfg_basedir/hooks"
31 cmd='cut -d : -f 1 < "$cfg_chroot/etc/group" | grep -v ^_repo'
32 [ $# -eq 0 ] || cmd='printf "%s\n" "$@"'
33 eval "$cmd" | \
35 while read -r proj; do
36 proj="${proj#$base/}"
37 proj="${proj%.git}"
38 projdir="$base/$proj.git"
39 [ -d "$projdir" ] || { echo "$proj: does not exist -- skipping"; continue; }
40 ! [ -e "$projdir/.nohooks" ] || { echo "$proj: .nohooks found -- skipping"; continue; }
41 updates=
42 for hook in pre-receive post-receive update; do
43 if [ -f "$projdir/hooks/$hook" ]; then
44 if ! cmp -s "$hookbin/$hook" "$projdir/hooks/$hook"; then
45 [ -n "$dryrun" ] || cat "$hookbin/$hook" > "$projdir/hooks/$hook"
46 updates="$updates $hook"
48 elif [ ! -e "$projdir/hooks/$hook" ]; then
49 [ -n "$dryrun" ] || [ -d "$projdir/hooks" ] || mkdir "$projdir/hooks"
50 [ -n "$dryrun" ] || cat "$hookbin/$hook" > "$projdir/hooks/$hook"
51 [ -n "$dryrun" ] || chmod 0775 "$projdir/hooks/$hook"
52 updates="$updates +$hook"
54 done
55 if [ -d "$projdir/mob/hooks" ]; then
56 for hook in pre-receive post-receive; do
57 if [ -f "$projdir/mob/hooks/$hook" ]; then
58 if ! write_mob_hook "$hook" | cmp -s - "$projdir/mob/hooks/$hook"; then
59 [ -n "$dryrun" ] || write_mob_hook "$hook" > "$projdir/mob/hooks/$hook"
60 updates="$updates mob/$hook"
62 elif ! [ -e "$projdir/mob/hooks/$hook" ]; then
63 [ -n "$dryrun" ] || write_mob_hook "$hook" > "$projdir/mob/hooks/$hook"
64 [ -n "$dryrun" ] || chmod 0775 "$projdir/mob/hooks/$hook"
65 updates="$updates +mob/$hook"
67 done
68 if ! [ -x "$projdir/mob/hooks/update" ]; then
69 [ -n "$dryrun" ] || ln -sfn ../../hooks/update "$projdir/mob/hooks/update"
70 updates="$updates +mob/update"
73 for hook in post-update; do
74 if [ -e "$projdir/hooks/$hook" ]; then
75 [ -n "$dryrun" ] || rm -f "$projdir/hooks/$hook"
76 updates="$updates -$hook"
78 done
79 if [ -d "$projdir/mob/hooks" ]; then
80 for hook in post-update; do
81 if [ -e "$projdir/mob/hooks/$hook" ]; then
82 [ -n "$dryrun" ] || rm -f "$projdir/mob/hooks/$hook"
83 updates="$updates -mob/$hook"
85 done
87 added=
88 while read -r fixfilex; do
89 case "$fixfilex" in ""|*.sample) :;; *)
90 #[ -n "$added" ] || { added=1; updates="$updates a+rx"; }
91 #[ -n "$dryrun" ] || chmod a+rx "$projdir/$fixfilex"
93 esac
94 done <<-EOT
95 $(cd "$projdir"
96 ! [ -d hooks ] || find hooks -xdev -type f \! -perm -a+rx -print
97 ! [ -d mob/hooks ] || find mob/hooks -xdev -type f \! -perm -a+rx -print)
98 EOT
99 [ -z "$updates" ] || echo "$proj:$updates" ${dryrun:+(dryrun)}
100 done