hooks: find ourselves before seeking elsewhere
[girocco/mitgedanken.git] / toolbox / update-all-hooks.sh
blob0714f6b2050c9ceea8d53871be64014962d5d018
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" ] && [ "$1" != "-f" ] || { force=1; shift; }
14 [ "$1" != "--dry-run" ] && [ "$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 relocate=\
25 '# Make sure the current directory is where we expect to be
26 [ "${GIT_DIR+set}" != "set" ] || cd "${GIT_DIR:-.}" || exit 1
27 case "${PWD%/*}" in */worktrees)
28 # Gah!
30 # But it COULD just be a coincidence...
31 [ -s commondir ] && [ -s HEAD ] &&
32 _cmndir= && read -r _cmndir <commondir 2>/dev/null &&
33 [ -n "$_cmndir" ] && [ -d "$_cmndir" ]
34 then
35 # ...it is not, fix it!
36 cd "$_cmndir" || exit 1
38 esac
39 [ "${GIT_DIR+set}" != "set" ] || GIT_DIR="."'
41 write_mob_hook() {
42 echo '#!'@shbin@
43 echo 'mydir="${0%/*}" && : "${mydir:=.}" && mydir="$(cd "$mydir" && pwd -P)" || exit 1'
44 printf '%s\n' "$relocate"
45 echo 'cd .. && GIT_DIR=. GIROCCO_PERSONAL_MOB=1 exec "$mydir/../../hooks/${0##*/}"'
48 base="${cfg_reporoot%/}"
49 hookbin="$cfg_basedir/hooks"
50 cmd='cut -d : -f 1 <"$cfg_chroot/etc/group" | grep -v ^_repo'
51 [ $# -eq 0 ] || cmd='printf "%s\n" "$@"'
52 eval "$cmd" |
54 while read -r proj; do
55 proj="${proj#$base/}"
56 proj="${proj%.git}"
57 projdir="$base/$proj.git"
58 [ -d "$projdir" ] || { echo "$proj: does not exist -- skipping"; continue; }
59 ! [ -e "$projdir/.nohooks" ] || { echo "$proj: .nohooks found -- skipping"; continue; }
60 updates=
61 for hook in pre-receive post-receive update; do
62 if [ -f "$projdir/hooks/$hook" ]; then
63 if ! cmp -s "$hookbin/$hook" "$projdir/hooks/$hook"; then
64 [ -n "$dryrun" ] || cat "$hookbin/$hook" >"$projdir/hooks/$hook"
65 updates="$updates $hook"
67 elif ! [ -e "$projdir/hooks/$hook" ]; then
68 [ -n "$dryrun" ] || [ -d "$projdir/hooks" ] || mkdir "$projdir/hooks"
69 [ -n "$dryrun" ] || cat "$hookbin/$hook" >"$projdir/hooks/$hook"
70 [ -n "$dryrun" ] || chmod 0775 "$projdir/hooks/$hook"
71 updates="$updates +$hook"
73 done
74 if [ -d "$projdir/mob/hooks" ]; then
75 for hook in pre-receive post-receive; do
76 if [ -f "$projdir/mob/hooks/$hook" ]; then
77 if ! write_mob_hook "$hook" | cmp -s - "$projdir/mob/hooks/$hook"; then
78 [ -n "$dryrun" ] || write_mob_hook "$hook" >"$projdir/mob/hooks/$hook"
79 updates="$updates mob/$hook"
81 elif ! [ -e "$projdir/mob/hooks/$hook" ]; then
82 [ -n "$dryrun" ] || write_mob_hook "$hook" >"$projdir/mob/hooks/$hook"
83 [ -n "$dryrun" ] || chmod 0775 "$projdir/mob/hooks/$hook"
84 updates="$updates +mob/$hook"
86 done
87 if ! [ -x "$projdir/mob/hooks/update" ]; then
88 [ -n "$dryrun" ] || ln -sfn ../../hooks/update "$projdir/mob/hooks/update"
89 updates="$updates +mob/update"
92 for hook in post-update; do
93 if [ -e "$projdir/hooks/$hook" ]; then
94 [ -n "$dryrun" ] || rm -f "$projdir/hooks/$hook"
95 updates="$updates -$hook"
97 done
98 if [ -d "$projdir/mob/hooks" ]; then
99 for hook in post-update; do
100 if [ -e "$projdir/mob/hooks/$hook" ]; then
101 [ -n "$dryrun" ] || rm -f "$projdir/mob/hooks/$hook"
102 updates="$updates -mob/$hook"
104 done
106 added=
107 while read -r fixfilex; do
108 case "$fixfilex" in ""|*.sample) :;; *)
109 #[ -n "$added" ] || { added=1; updates="$updates a+rx"; }
110 #[ -n "$dryrun" ] || chmod a+rx "$projdir/$fixfilex"
112 esac
113 done <<-EOT
114 $(cd "$projdir"
115 # find -P is not POSIX (it is the default though) but we absolutely
116 # do NOT want either -H or -L here because if either the directory or
117 # the hook itself is a symbolic link we have no business changing it!
118 ! [ -d hooks ] || find hooks -xdev -type f ! -perm -a+rx -print
119 ! [ -d mob/hooks ] || find mob/hooks -xdev -type f ! -perm -a+rx -print)
121 [ -z "$updates" ] || echo "$proj:$updates" ${dryrun:+(dryrun)}
122 done