Re: [PATCH 4/4] tag: "git tag" refuses to use HEAD as a tagname
- From
Rubén Justo <rjusto@gmail.com>
- Date
- Dec 2, 2024, 20:42 UTC
- Message-ID
- <ee2af264-8d4f-401d-893c-e08c30f5a9b6@gmail.com>
- In-Reply-To
- <20241202070714.3028549-5-gitster@pobox.com>
On Mon, Dec 02, 2024 at 04:07:14PM +0900, Junio C Hamano wrote:
Show 5 quoted lines
> Even though the plumbing level allows you to create refs/tags/HEAD > and refs/heads/HEAD, doing so makes it confusing within the context > of the UI Git Porcelain commands provides. Just like we prevent a > branch from getting called "HEAD" at the Porcelain layer (i.e. "git > branch" command), teach "git tag" to refuse to create a tag "HEAD".
This sounds like a good step in the right direction for me.
From the subject in this patch, I was worried that we were also preventing deletion. However, I have confirmed that we still allow the intuitive deletion of a tag named 'HEAD' with "git tag -d HEAD"; for example, in repositories where such a tag already exists.
Perhaps tangential, but a silly change like this hasn't broken any tests:
diff --git a/builtin/tag.c b/builtin/tag.c index 670e564178..b65f56e5b4 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -88,6 +88,8 @@ static int for_each_tag_name(const char **argv, each_tag_name_fn fn, for (p = argv; *p; p++) { strbuf_reset(&ref); + if (!strcmp(*p, "HEAD")) + die("Hi!"); strbuf_addf(&ref, "refs/tags/%s", *p); if (refs_read_ref(get_main_ref_store(the_repository), ref.buf, &oid)) { error(_("tag '%s' not found."), *p); Therefore, if the previous seems reasonable, perhaps we should add a test like: --- a/t/t7004-tag.sh +++ b/t/t7004-tag.sh @@ -97,6 +97,11 @@ test_expect_success 'HEAD is forbidden as a tagname' ' test_must_fail git tag -a -m "useless" HEAD ' +test_expect_success 'allow deleting a tag named HEAD' ' + git update-ref refs/tags/HEAD HEAD && + git tag -d HEAD +' + test_expect_success 'creating a tag with --create-reflog should create reflog' ' git log -1 \ --format="format:tag: tagging %h (%s, %cd)%n" \ > > Helped-by: Jeff King <peff@peff.net> > Signed-off-by: Junio C Hamano <gitster@pobox.com> > --- > refs.c | 2 +- > t/t7004-tag.sh | 6 ++++++ > 2 files changed, 7 insertions(+), 1 deletion(-) > > diff --git a/refs.c b/refs.c > index a24bfe3845..01ef2a3093 100644 > --- a/refs.c > +++ b/refs.c > @@ -735,7 +735,7 @@ int check_branch_ref(struct strbuf *sb, const char *name) > > int check_tag_ref(struct strbuf *sb, const char *name) > { > - if (name[0] == '-') > + if (name[0] == '-' || !strcmp(name, "HEAD")) > return -1; > > strbuf_reset(sb); > diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh > index b1316e62f4..2082ce63f7 100755 > --- a/t/t7004-tag.sh > +++ b/t/t7004-tag.sh > @@ -91,6 +91,12 @@ test_expect_success 'creating a tag using default HEAD should succeed' ' > test_must_fail git reflog exists refs/tags/mytag > ' > > +test_expect_success 'HEAD is forbidden as a tagname' ' > + test_when_finished "git tag -d HEAD || :" && I'm not considering this as a test for it :-) > + test_must_fail git tag HEAD && > + test_must_fail git tag -a -m "useless" HEAD > +' > + > test_expect_success 'creating a tag with --create-reflog should create reflog' ' > git log -1 \ > --format="format:tag: tagging %h (%s, %cd)%n" \ > -- > 2.47.1-514-g9b43e7ecc4 >