Browse Source

hooks--update: decline deleting tags or branches by default, add config options

Decline deleting tags or branches through git push <remote> :<ref> by
default, support config options hooks.allowdeletetag, hooks.allowdeletebranch
to override this per repository.

Before this patch the update hook interpreted deleting a tag, no matter if
annotated or not, through git push <remote> :<tag> as unannotated tag, and
declined it by default, but with an unappropriate error message:

 $ git push origin :atag
 deleting 'refs/tags/atag'
 *** The un-annotated tag, atag, is not allowed in this repository
 *** Use 'git tag [ -a | -s ]' for tags you want to propagate.
 ng refs/tags/atag hook declined
 error: hooks/update exited with error code 1
 error: hook declined to update refs/tags/atag
 error: failed to push to 'monolith:/git/qm/test-repo'

Signed-off-by: Gerrit Pape <pape@smarden.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Gerrit Pape 18 years ago committed by Junio C Hamano
parent
commit
ad7638b2ed
  1. 33
      templates/hooks--update

33
templates/hooks--update

@ -10,6 +10,12 @@
# hooks.allowunannotated # hooks.allowunannotated
# This boolean sets whether unannotated tags will be allowed into the # This boolean sets whether unannotated tags will be allowed into the
# repository. By default they won't be. # 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 # --- Command line
@ -32,6 +38,8 @@ fi


# --- Config # --- Config
allowunannotated=$(git-repo-config --bool hooks.allowunannotated) allowunannotated=$(git-repo-config --bool hooks.allowunannotated)
allowdeletebranch=$(git-repo-config --bool hooks.allowdeletebranch)
allowdeletetag=$(git-repo-config --bool hooks.allowdeletetag)


# check for no description # check for no description
projectdesc=$(sed -e '1q' "$GIT_DIR/description") projectdesc=$(sed -e '1q' "$GIT_DIR/description")
@ -41,9 +49,9 @@ if [ -z "$projectdesc" -o "$projectdesc" = "Unnamed repository; edit this file t
fi fi


# --- Check types # --- Check types
# if $newrev is 0000...0000, it's a commit to delete a branch # if $newrev is 0000...0000, it's a commit to delete a ref.
if [ "$newrev" = "0000000000000000000000000000000000000000" ]; then if [ "$newrev" = "0000000000000000000000000000000000000000" ]; then
newrev_type=commit newrev_type=delete
else else
newrev_type=$(git-cat-file -t $newrev) newrev_type=$(git-cat-file -t $newrev)
fi fi
@ -58,15 +66,36 @@ case "$refname","$newrev_type" in
exit 1 exit 1
fi 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) refs/tags/*,tag)
# annotated tag # annotated tag
;; ;;
refs/heads/*,commit) refs/heads/*,commit)
# branch # 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) refs/remotes/*,commit)
# tracking branch # 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?) # Anything else (is there anything else?)
echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2

Loading…
Cancel
Save