git/list[1] front-page[2] threads[3] people[4] search[5] about
 

tag referring to a commit but not directly?

From
Junio C Hamano <junkio@cox.net>
Date
Jul 9, 2005, 10:00 UTC
Message-ID
<7v7jg0wb77.fsf@assigned-by-dhcp.cox.net>

I was playing with a tag that refers to another tag which refers to a commit, and found out that some things did not work as I expected.

Is it a PEBCAK on my part to expect tag-to-tag-to-commit to behave the same way as a bare commit (or a tag to commit), or is this just a bug? I think the following two would fix what I found, but I am not sure if I am using the "struct object" and friends the way they are expected to be used. I am uncertain about what the expected behaviour should be either for that matter; I admit that tags are new to me.

---

*** To find whom to ask about the thing I am butchering, I *** used the following pickaxe:

git-rev-list linus |
git-diff-tree --stdin -v -s \
-S'	if (obj->type == tag_type)
		obj = ((struct tag *)obj)->tagged;'
git-rev-list linus |
git-diff-tree --stdin -v -s \
-S'	/*
	 * Tag object? Look what it points to..
	 */
	if (object->type == tag_type) {'

------------ cd /opt/packrat/playpen/public/in-place/git/git.junio/ jit-diff 0:5 # - master: format-patch: fix skipping of blank-lines (take 2) # + 5: tag deref until we get non tag

diff --git a/commit.c b/commit.c
--- a/commit.c
+++ b/commit.c
@@ -52,8 +52,9 @@ struct commit *lookup_commit_reference(c
 
 	if (!obj)
 		return NULL;
-	if (obj->type == tag_type)
-		obj = ((struct tag *)obj)->tagged;
+	while (obj->type == tag_type)
+		obj = parse_object(((struct tag *)obj)->tagged->sha1);
+
 	return check_commit(obj, sha1);
 }
 
diff --git a/rev-list.c b/rev-list.c
--- a/rev-list.c
+++ b/rev-list.c
@@ -354,12 +354,12 @@ static struct commit *get_commit_referen
 	/*
 	 * Tag object? Look what it points to..
 	 */
-	if (object->type == tag_type) {
+	while (object->type == tag_type) {
 		struct tag *tag = (struct tag *) object;
 		object->flags |= flags;
 		if (tag_objects && !(object->flags & UNINTERESTING))
 			add_pending_object(object, tag->tag);
-		object = tag->tagged;
+		object = parse_object(tag->tagged->sha1);
 	}
 
 	/*

Compilation finished at Sat Jul  9 02:37:16
Next: Junio C Hamano
Message 1 of 3 in “tag referring to a commit but not directly?”
  1. Junio C HamanoJul 9, 2005
  2. Dereference tag repeatedly until we get a non-tag.Junio C Hamano, Jul 11, 2005
  3. Jon SeymourJul 11, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.