From: Stephen Haberman Date: Wed, 12 Nov 2008 05:53:29 +0000 (-0600) Subject: Merge update-ensure-tag-in-branch itno update-allow-tags-branches. X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=729bdec77aa867f9e24156ed228b013a600d5730;p=git-central.git Merge update-ensure-tag-in-branch itno update-allow-tags-branches. --- diff --git a/server/update-allow-tags-branches b/server/update-allow-tags-branches index 23e736a..3714762 100644 --- a/server/update-allow-tags-branches +++ b/server/update-allow-tags-branches @@ -3,8 +3,6 @@ # 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, make this file executable by "chmod +x update". -# # Config # ------ # hooks.update-allow-tags-branches.unannotatedtag @@ -16,37 +14,23 @@ # hooks.update-allow-tags-branches.deletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. +# hooks.update-allow-tags-branches.nakedtag +# This boolean sets whether tags are allowed into the repo to commits +# that are not pointed to by a branch. By default they won't be. # +. $(dirname $0)/functions + # --- 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 )" >&2 - exit 1 -fi - -if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then - echo "Usage: $0 " >&2 - exit 1 -fi - # --- Config allowunannotatedtag=$(git config --bool hooks.update-allow-tags-branches.unannotatedtag) allowdeletebranch=$(git config --bool hooks.update-allow-tags-branches.deletebranch) allowdeletetag=$(git config --bool hooks.update-allow-tags-branches.deletetag) - -# 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 +allownakedtag=$(git config --bool hooks.update-allow-tags-branches.nakedtag) # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. @@ -61,20 +45,30 @@ case "$refname","$newrev_type" in # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotatedtag" != "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 + display_error_message "Unannotated tags ($short_refname) are not allowed" + exit 1 + fi + contains=$(git branch --contains "$newrev" | wc -l) + if [ $contains -eq 0 -a "$allownakedtag" != "true" ] ; then + display_error_message "The tag $short_refname is not included in any branch" exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then - echo "*** Deleting a tag is not allowed in this repository" >&2 + display_error_message "Deleting tags is not allowed" exit 1 fi ;; refs/tags/*,tag) # annotated tag + short_refname=${refname##refs/tags/} + contains=$(git branch --contains "$newrev" | wc -l) + if [ $contains -eq 0 -a "$allownakedtag" != "true" ] ; then + display_error_message "The tag $short_refname is not included in any branch" + exit 1 + fi ;; refs/heads/*,commit) # branch diff --git a/server/update-ensure-tag-in-branch b/server/update-ensure-tag-in-branch deleted file mode 100644 index 3c01543..0000000 --- a/server/update-ensure-tag-in-branch +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh -# -# Tags should only be allowed to point to commits that are within a branch. -# - -. $(dirname $0)/functions - -refname="$1" -oldrev="$2" -newrev="$3" - -# Only interested in tags -case "$refname" in - refs/tags/*) - short_refname=${refname##refs/tags/} - ;; - *) - exit 0 - ;; -esac - -# Except if they're getting deleted -if [ "$newrev" == "0000000000000000000000000000000000000000" ] ; then - exit 0 -fi - -contains=$(git branch --contains "$newrev" | wc -l) -if [ $contains -eq 0 ] ; then - display_error_message "The tag $short_refname is not included in any branch." - exit 1 -fi - diff --git a/tests/t3100-ensure-tag-in-branch.sh b/tests/t3100-ensure-tag-in-branch.sh deleted file mode 100644 index 55b8621..0000000 --- a/tests/t3100-ensure-tag-in-branch.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh - -test_description='server update tags in branch check' - -. ./test-lib.sh - -test_expect_success 'setup' ' - echo "setup" >a && - git add a && - git commit -m "setup" && - git clone ./. server && - rm -fr server/.git/hooks && - git remote add origin ./server -' - -install_update_hook 'update-ensure-tag-in-branch' - -test_expect_success 'push only tag fails' ' - echo "$test_name" >a && - git commit -a -m "$test_name moved master" && - git tag -a -m "tagged move as r1" r1 && - ! git push --tags 2>push.err && - cat push.err | grep "The tag r1 is not included in any branch." && - - # But now it works if we push the commit first - git push && - git push --tags -' - -test_expect_success 'push works if done at the same time' ' - echo "$test_name" >a && - git commit -a -m "$test_name moved master" && - git tag -a -m "tagged move as r2" r2 && - git push origin master r2 -' - -test_expect_success 'moving branch back and deleting tag works' ' - git reset --hard HEAD^ && - git push --force origin master:master :r2 -' - -test_done - diff --git a/tests/t3100-update-allow-tags-branches.sh b/tests/t3100-update-allow-tags-branches.sh new file mode 100644 index 0000000..ecac232 --- /dev/null +++ b/tests/t3100-update-allow-tags-branches.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +test_description='server update allow tags and branches' + +. ./test-lib.sh + +test_expect_success 'setup' ' + echo "setup" >a && + git add a && + git commit -m "setup" && + git clone ./. server && + rm -fr server/.git/hooks && + git remote add origin ./server +' + +install_update_hook 'update-allow-tags-branches' + +test_expect_success 'push only tag fails' ' + echo "$test_name" >a && + git commit -a -m "$test_name moved master" && + git tag -a -m "tagged move as r1" r1 && + ! git push --tags 2>push.err && + cat push.err | grep "The tag r1 is not included in any branch" && + + # But now it works if we push the commit first + git push && + git push --tags +' + +test_expect_success 'push works if done at the same time' ' + echo "$test_name" >a && + git commit -a -m "$test_name moved master" && + git tag -a -m "tagged move as r2" r2 && + git push origin master r2 +' + +test_expect_success 'moving branch back and deleting tag works' ' + GIT_DIR=./server/.git git config hooks.update-allow-tags-branches.deletetag true + git reset --hard HEAD^ && + git push --force origin master:master :r2 +' + +test_done +