create-personal-mob-area: run pre-receive hook and handle push forks
[girocco.git] / bin / create-personal-mob-area
blobcad307dece0000f794c18d4edd28f840306a7ab8
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"
15 if [ ! -f "$projdir/HEAD" -o ! -f "$projdir/config" -o ! -f "$projdir/description" ] ||
16 [ ! -f "$projdir/hooks/update" -o ! -x "$projdir/hooks/update" ] ||
17 [ ! -f "$projdir/hooks/post-update" -o ! -x "$projdir/hooks/post-update" ] ||
18 [ ! -d "$projdir/objects" -o ! -d "$projdir/info" -o -L "$projdir/HEAD" ]; then
19 echo "Incorrectly set up project: $1" >&2
20 exit 1
23 umask 002
25 mkdir -p "$projdir/refs/mob" "$projdir/mob/refs" "$projdir/mob/hooks"
26 chmod 02775 "$projdir/refs" "$projdir/refs/mob" \
27 "$projdir/mob" "$projdir/mob/refs" "$projdir/mob/hooks" ||
28 echo "Warning: could not chmod 02775 on all dirs"
30 [ -x "$projdir/mob/hooks/update" ] || ln -sfn ../../hooks/update "$projdir/mob/hooks/update"
31 for hook in pre-receive post-update; do
32 if ! [ -x "$projdir/mob/hooks/$hook" ]; then
33 mh="$projdir/mob/hooks/$hook"
34 echo '#!/bin/sh' > "$mh.$$"
35 echo "cd .. && GIT_DIR=. exec hooks/$hook" >> "$mh.$$"
36 chmod 0775 "$mh.$$"
37 mv -f "$mh.$$" "$mh"
38 rm -f "$mh.$$"
40 done
42 [ -d "$projdir/mob/refs/heads" ] || ln -sfn ../../refs/mob "$projdir/mob/refs/heads"
43 [ -d "$projdir/mob/refs/mob" ] || ln -sfn ../../refs/mob "$projdir/mob/refs/mob"
45 [ -L "$projdir/mob/packed-refs" ] || ln -sfn ../packed-refs.mob "$projdir/mob/packed-refs"
46 [ -d "$projdir/mob/objects" ] || ln -sfn ../objects "$projdir/mob/objects"
47 [ -d "$projdir/mob/info" ] || ln -sfn ../info "$projdir/mob/info"
48 [ -f "$projdir/mob/description" ] || ln -sfn ../description "$projdir/mob/description"
49 [ -f "$projdir/mob/config" ] || ln -sfn ../config "$projdir/mob/config"
51 cp -p -f "$projdir/HEAD" "$projdir/mob/HEAD.$$"
52 mv -f "$projdir/mob/HEAD.$$" "$projdir/mob/HEAD"
53 rm -f "$projdir/mob/HEAD.$$"
55 git --git-dir="$projdir" show-ref > "$projdir/packed-refs.mob.$$" || :
56 if [ -s "$projdir/packed-refs.mob.$$" ]; then
57 mv -f "$projdir/packed-refs.mob.$$" "$projdir/packed-refs.mob"
59 rm -f "$projdir/packed-refs.mob.$$"
61 exit 0