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
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
18 printf '%s\n' "$(basename "$0"): refusing to run as root -- bad things would happen"
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)
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" ]
35 # ...it is not, fix it!
36 cd "$_cmndir" || exit 1
39 [ "${GIT_DIR+set}" != "set" ] || GIT_DIR="."'
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" "$@"'
54 while read -r proj
; do
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; }
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"
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"
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"
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"
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"
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)}