mirror of
https://github.com/git/git
synced 2024-08-28 20:20:07 +00:00
![Junio C Hamano](/assets/img/avatar_default.png)
We used to mark hooks we ship as samples by making them unexecutable, but some filesystems cannot tell what is executable and what is not. This makes it much more explicit. The hooks are suffixed with .sample (but now are made executable), so enabling it is still one step operation (instead of "chmod +x $hook", you would do "mv $hook.sample $hook") but now they won't get accidentally enabled on systems without executable bit. Signed-off-by: Junio C Hamano <gitster@pobox.com>
108 lines
2.8 KiB
Bash
Executable file
108 lines
2.8 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# An example hook script to blocks unannotated tags from entering.
|
|
# Called by git-receive-pack with arguments: refname sha1-old sha1-new
|
|
#
|
|
# To enable this hook, rename this file to "update".
|
|
#
|
|
# Config
|
|
# ------
|
|
# hooks.allowunannotated
|
|
# This boolean sets whether unannotated tags will be allowed into the
|
|
# repository. By default they won't be.
|
|
# hooks.allowdeletetag
|
|
# This boolean sets whether deleting tags will be allowed in the
|
|
# repository. By default they won't be.
|
|
# hooks.allowdeletebranch
|
|
# This boolean sets whether deleting branches will be allowed in the
|
|
# repository. By default they won't be.
|
|
#
|
|
|
|
# --- Command line
|
|
refname="$1"
|
|
oldrev="$2"
|
|
newrev="$3"
|
|
|
|
# --- Safety check
|
|
if [ -z "$GIT_DIR" ]; then
|
|
echo "Don't run this script from the command line." >&2
|
|
echo " (if you want, you could supply GIT_DIR then run" >&2
|
|
echo " $0 <ref> <oldrev> <newrev>)" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
|
|
echo "Usage: $0 <ref> <oldrev> <newrev>" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# --- Config
|
|
allowunannotated=$(git config --bool hooks.allowunannotated)
|
|
allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
|
|
allowdeletetag=$(git config --bool hooks.allowdeletetag)
|
|
|
|
# check for no description
|
|
projectdesc=$(sed -e '1q' "$GIT_DIR/description")
|
|
if [ -z "$projectdesc" -o "$projectdesc" = "Unnamed repository; edit this file to name it for gitweb." ]; then
|
|
echo "*** Project description file hasn't been set" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# --- Check types
|
|
# if $newrev is 0000...0000, it's a commit to delete a ref.
|
|
if [ "$newrev" = "0000000000000000000000000000000000000000" ]; then
|
|
newrev_type=delete
|
|
else
|
|
newrev_type=$(git-cat-file -t $newrev)
|
|
fi
|
|
|
|
case "$refname","$newrev_type" in
|
|
refs/tags/*,commit)
|
|
# un-annotated tag
|
|
short_refname=${refname##refs/tags/}
|
|
if [ "$allowunannotated" != "true" ]; then
|
|
echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
|
|
echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
refs/tags/*,delete)
|
|
# delete tag
|
|
if [ "$allowdeletetag" != "true" ]; then
|
|
echo "*** Deleting a tag is not allowed in this repository" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
refs/tags/*,tag)
|
|
# annotated tag
|
|
;;
|
|
refs/heads/*,commit)
|
|
# branch
|
|
;;
|
|
refs/heads/*,delete)
|
|
# delete branch
|
|
if [ "$allowdeletebranch" != "true" ]; then
|
|
echo "*** Deleting a branch is not allowed in this repository" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
refs/remotes/*,commit)
|
|
# tracking branch
|
|
;;
|
|
refs/remotes/*,delete)
|
|
# delete tracking branch
|
|
if [ "$allowdeletebranch" != "true" ]; then
|
|
echo "*** Deleting a tracking branch is not allowed in this repository" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
*)
|
|
# Anything else (is there anything else?)
|
|
echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# --- Finished
|
|
exit 0
|