# [PATCH] hooks--update: allow deleting a tag through git push <remote> :<tag>

3 messages from 2007-11-07 to 2007-11-08. Participants: Gerrit Pape, Junio C Hamano.
Thread: https://gitlist.dev/t/10702

## Gerrit Pape, 2007-11-07 10:34

Subject: [PATCH] hooks--update: allow deleting a tag through git push <remote> :<tag>
Message-ID: <20071107103450.29849.qmail@c27a4ce40673ff.315fe32.mid.smarden.org>
URL: https://gitlist.dev/e/20071107103450.29849.qmail%40c27a4ce40673ff.315fe32.mid.smarden.org

```
The update hook interpretes deleting a tag, no matter if annotated or not,
through git push <remote> :<tag> as unannotated tag, and declines it by
default:

 $ 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'

With this patch deleting a tag is allowed unconditionally, just as
deleting a branch.

Signed-off-by: Gerrit Pape <pape@smarden.org>
---
 templates/hooks--update |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/templates/hooks--update b/templates/hooks--update
index 65e8c32..a109b1b 100644
--- a/templates/hooks--update
+++ b/templates/hooks--update
@@ -43,7 +43,7 @@ fi
 # --- Check types
 # if $newrev is 0000...0000, it's a commit to delete a branch
 if [ "$newrev" = "0000000000000000000000000000000000000000" ]; then
-	newrev_type=commit
+	newrev_type=delete
 else
 	newrev_type=$(git-cat-file -t $newrev)
 fi
@@ -58,13 +58,16 @@ case "$refname","$newrev_type" in
 			exit 1
 		fi
 		;;
+	refs/tags/*,delete)
+		# delete tag
+		;;
 	refs/tags/*,tag)
 		# annotated tag
 		;;
-	refs/heads/*,commit)
+	refs/heads/*,commit | refs/heads/*,delete)
 		# branch
 		;;
-	refs/remotes/*,commit)
+	refs/remotes/*,commit | refs/remotes/*,delete)
 		# tracking branch
 		;;
 	*)
-- 
1.5.3.5

```

## Junio C Hamano, 2007-11-08 00:54

Subject: Re: [PATCH] hooks--update: allow deleting a tag through git push <remote> :<tag>
Message-ID: <7v640d8skt.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7v640d8skt.fsf%40gitster.siamese.dyndns.org
In-Reply-To: <20071107103450.29849.qmail@c27a4ce40673ff.315fe32.mid.smarden.org>

```
Gerrit Pape <pape@smarden.org> writes:

> The update hook interpretes deleting a tag, no matter if annotated or not,
> through git push <remote> :<tag> as unannotated tag, and declines it by
> default:
> ...
> With this patch deleting a tag is allowed unconditionally, just as
> deleting a branch.
>
> Signed-off-by: Gerrit Pape <pape@smarden.org>
> ---
>  templates/hooks--update |    9 ++++++---
>  1 files changed, 6 insertions(+), 3 deletions(-)

Since you are allowing deletion for anything, wouldn't this be
much simpler, I wonder...

---

 templates/hooks--update |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/templates/hooks--update b/templates/hooks--update
index d8c7626..e12904a 100644
--- a/templates/hooks--update
+++ b/templates/hooks--update
@@ -41,9 +41,9 @@ if [ -z "$projectdesc" -o "$projectdesc" = "Unnamed repository; edit this file t
 fi
 
 # --- 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
-	newrev_type=commit
+	exit 0 ;# allow anything to be deleted
 else
 	newrev_type=$(git-cat-file -t $newrev)
 fi

```

## Gerrit Pape, 2007-11-08 09:47

Subject: [PATCH] hooks--update: decline deleting tags or branches by default, add config options
Message-ID: <20071108094739.22091.qmail@d736483bdc832c.315fe32.mid.smarden.org>
URL: https://gitlist.dev/e/20071108094739.22091.qmail%40d736483bdc832c.315fe32.mid.smarden.org
In-Reply-To: <7v640d8skt.fsf@gitster.siamese.dyndns.org>

```
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>
---

On Wed, Nov 07, 2007 at 04:54:42PM -0800, Junio C Hamano wrote:
> Since you are allowing deletion for anything, wouldn't this be
> much simpler, I wonder...

Yes, true.  But to be a good axample hook, I suggest to differentiate
this in the implementation, and to deny deleting tags, branches by
default.


 templates/hooks--update |   33 +++++++++++++++++++++++++++++++--
 1 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/templates/hooks--update b/templates/hooks--update
index 65e8c32..7d7c251 100644
--- a/templates/hooks--update
+++ b/templates/hooks--update
@@ -10,6 +10,12 @@
 # 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
@@ -32,6 +38,8 @@ fi
 
 # --- Config
 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
 projectdesc=$(sed -ne '1p' "$GIT_DIR/description")
@@ -41,9 +49,9 @@ if [ -z "$projectdesc" -o "$projectdesc" = "Unnamed repository; edit this file t
 fi
 
 # --- 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
-	newrev_type=commit
+	newrev_type=delete
 else
 	newrev_type=$(git-cat-file -t $newrev)
 fi
@@ -58,15 +66,36 @@ case "$refname","$newrev_type" in
 			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
-- 
1.5.3.5

```
