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

Re: name-rev does not show the shortest path

From
Jeff King <peff@peff.net>
Date
Aug 26, 2007, 09:23 UTC
Message-ID
<20070826092323.GB30474@coredump.intra.peff.net>
In-Reply-To
<Pine.LNX.4.64.0708251701150.16728@wbgn129.biozentrum.uni-wuerzburg.de>
On Sat, Aug 25, 2007 at 05:04:33PM +0200, Johannes Schindelin wrote:
Show 10 quoted lines
> I briefly looked into this, and did not find out why it is behaving that 
> way.  It _should_ pick the closer one with this code:
> 
>         } else if (name->merge_traversals > merge_traversals ||
>                         (name->merge_traversals == merge_traversals &&
>                          name->generation > generation)) {
> 
> However, it did not even get to that code in my tests.  I'll have to look 
> at that problem closer in a quiet moment (which I will not have for at 
> least another 24 hours).

It does execute that code, just not for the rev in question. We hit the third part of that conditional and stop recursing on a different rev, so we only touch our "interesting" rev one time.

That being said, I think this test is totally bogus. You're just looking at the generation and merge traversals from some tip. However, the tip _isn't_ the actual ref, but instead gets re-written as a string when we follow a merge. That string contains important generational information that is no longer taken into account, so you end up with things like "foo~999" with generation "3" is better than "bar~10" with generation "5".

Here is a patch (below) that tracks an absolute "distance to ref" and at least names the rev in question after v2.6.22-rc1. However, because it is now preferring "distance to ref" strictly over merge traversals, it seems to generate some obscenely long names:

0567a0c022d5b343370a343121f38fd89925de55 tags/v2.6.22-rc1~1^2^2^2~11^2~13^2~8^2~1^3~5

So perhaps there is a more sane metric, but I'd have to think about it more.

-Peff
---
diff --git a/builtin-name-rev.c b/builtin-name-rev.c
index 61eba34..c003e20 100644
--- a/builtin-name-rev.c
+++ b/builtin-name-rev.c
@@ -13,13 +13,14 @@ typedef struct rev_name {
 	const char *tip_name;
 	int merge_traversals;
 	int generation;
+	int distance;
 } rev_name;
 
 static long cutoff = LONG_MAX;
 
 static void name_rev(struct commit *commit,
 		const char *tip_name, int merge_traversals, int generation,
-		int deref)
+		int deref, int distance)
 {
 	struct rev_name *name = (struct rev_name *)commit->util;
 	struct commit_list *parents;
@@ -45,13 +46,16 @@ static void name_rev(struct commit *commit,
 		name = xmalloc(sizeof(rev_name));
 		commit->util = name;
 		goto copy_data;
-	} else if (name->merge_traversals > merge_traversals ||
-			(name->merge_traversals == merge_traversals &&
-			 name->generation > generation)) {
+	} else if (name->distance > distance ||
+			(name->distance == distance &&
+			 name->merge_traversals > merge_traversals ||
+			 (name->merge_traversals == merge_traversals &&
+			  name->generation > generation))) {
 copy_data:
 		name->tip_name = tip_name;
 		name->merge_traversals = merge_traversals;
 		name->generation = generation;
+		name->distance = distance;
 	} else
 		return;
 
@@ -75,10 +79,10 @@ copy_data:
 						parent_number);
 
 			name_rev(parents->item, new_name,
-				merge_traversals + 1 , 0, 0);
+				merge_traversals + 1 , 0, 0, distance + 1);
 		} else {
 			name_rev(parents->item, tip_name, merge_traversals,
-				generation + 1, 0);
+				generation + 1, 0, distance + 1);
 		}
 	}
 }
@@ -120,7 +124,7 @@ static int name_ref(const char *path, const unsigned char *sha1, int flags, void
 		else if (!prefixcmp(path, "refs/"))
 			path = path + 5;
 
-		name_rev(commit, xstrdup(path), 0, 0, deref);
+		name_rev(commit, xstrdup(path), 0, 0, deref, 0);
 	}
 	return 0;
 }
Previous: Johannes SchindelinNext: Johannes Schindelin
Message 7 of 13 in “name-rev does not show the shortest path”
  1. Uwe Kleine-KönigAug 23, 2007
  2. Julian PhillipsAug 24, 2007
  3. Uwe Kleine-KönigAug 24, 2007
  4. Julian PhillipsAug 24, 2007
  5. Junio C HamanoAug 24, 2007
  6. Johannes SchindelinAug 25, 2007
  7. Jeff KingAug 26, 2007
  8. Johannes SchindelinAug 26, 2007
  9. Jeff KingAug 27, 2007
  10. Johannes SchindelinAug 27, 2007
  11. Johannes SchindelinAug 27, 2007
  12. name-rev: Fix non-shortest descriptionJohannes Schindelin, Aug 27, 2007
  13. Uwe Kleine-KönigAug 27, 2007

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.