hooks: work around worktree wierdness
[girocco.git] / bin / create-personal-mob-area
blob4d04c3d334c99523dcd10599ec3568f70a84ea5e
1 #!/bin/sh
3 set -e
5 . @basedir@/shlib.sh
7 [ "$cfg_mob" = "mob" ] || { echo "mob support not enabled" >&2; exit 1; }
9 proj="$1"
10 [ -d "$cfg_reporoot/$proj.git" ] || { echo "Invalid project name: $1" >&2; exit 1; }
12 [ -f "$cfg_reporoot/$proj.git/.nofetch" ] || { echo "Mirrors may not use mob: $1" >&2; exit 1; }
14 projdir="$cfg_reporoot/$proj.git"
16 [ -L "$projdir/HEAD" ] ||
17 ! [ -f "$projdir/HEAD" ] ||
18 ! [ -f "$projdir/config" ] ||
19 ! [ -f "$projdir/description" ] ||
20 ! [ -f "$projdir/hooks/pre-receive" ] ||
21 ! [ -x "$projdir/hooks/pre-receive" ] ||
22 ! [ -f "$projdir/hooks/post-receive" ] ||
23 ! [ -x "$projdir/hooks/post-receive" ] ||
24 ! [ -f "$projdir/hooks/update" ] ||
25 ! [ -x "$projdir/hooks/update" ] ||
26 ! [ -d "$projdir/objects" ] ||
27 ! [ -d "$projdir/info" ]
28 then
29 echo "Incorrectly set up project: $1" >&2
30 exit 1
33 umask 002
35 relocate=\
36 '# Make sure the current directory is where we expect to be
37 [ "${GIT_DIR+set}" != "set" ] || cd "${GIT_DIR:-.}" || exit 1
38 case "${PWD%/*}" in */worktrees)
39 # Gah!
41 # But it COULD just be a coincidence...
42 [ -s commondir ] && [ -s HEAD ] &&
43 _cmndir= && read -r _cmndir <commondir 2>/dev/null &&
44 [ -n "$_cmndir" ] && [ -d "$_cmndir" ]
45 then
46 # ...it is not, fix it!
47 cd "$_cmndir" || exit 1
49 esac
50 [ "${GIT_DIR+set}" != "set" ] || GIT_DIR="."'
52 write_mob_hook() {
53 echo '#!'@shbin@
54 printf '%s\n' "$relocate"
55 echo "cd .. && GIT_DIR=. GIROCCO_PERSONAL_MOB=1 exec hooks/$1"
58 mkdir -p "$projdir/refs/mob" "$projdir/mob/refs" "$projdir/mob/hooks"
59 chmod 02775 "$projdir/refs" "$projdir/refs/mob" \
60 "$projdir/mob" "$projdir/mob/refs" "$projdir/mob/hooks" ||
61 echo "Warning: could not chmod 02775 on all dirs"
63 for hook in pre-receive post-receive; do
64 if ! [ -x "$projdir/mob/hooks/$hook" ]; then
65 write_mob_hook "$hook" >"$projdir/mob/hooks/$hook"
66 chmod 0775 "$projdir/mob/hooks/$hook"
68 done
69 [ -x "$projdir/mob/hooks/update" ] || ln -sfn ../../hooks/update "$projdir/mob/hooks/update"
71 [ -d "$projdir/mob/refs/heads" ] || ln -sfn ../../refs/mob "$projdir/mob/refs/heads"
72 [ -d "$projdir/mob/refs/mob" ] || ln -sfn ../../refs/mob "$projdir/mob/refs/mob"
74 [ -L "$projdir/mob/packed-refs" ] || ln -sfn ../packed-refs.mob "$projdir/mob/packed-refs"
75 [ -d "$projdir/mob/objects" ] || ln -sfn ../objects "$projdir/mob/objects"
76 [ -d "$projdir/mob/info" ] || ln -sfn ../info "$projdir/mob/info"
77 [ -f "$projdir/mob/description" ] || ln -sfn ../description "$projdir/mob/description"
78 [ -f "$projdir/mob/config" ] || ln -sfn ../config "$projdir/mob/config"
80 cp -p -f "$projdir/HEAD" "$projdir/mob/HEAD.$$"
81 mv -f "$projdir/mob/HEAD.$$" "$projdir/mob/HEAD"
82 rm -f "$projdir/mob/HEAD.$$"
84 git --git-dir="$projdir" for-each-ref --format='%(objectname) %(refname)' >"$projdir/packed-refs.mob.$$" || :
85 if [ -s "$projdir/packed-refs.mob.$$" ]; then
86 mv -f "$projdir/packed-refs.mob.$$" "$projdir/packed-refs.mob"
88 rm -f "$projdir/packed-refs.mob.$$"
90 exit 0