name-rev: fix names by dropping taggerdate workaround

Commit 7550424804 ("name-rev: include taggerdate in considering the best name", 2016-04-22) introduced the idea of using taggerdate in the criteria for selecting the best name. At the time, a certain commit in linux.git -- namely, aed06b9cfcab -- was being named by name-rev as v4.6-rc1~9^2~792 which, while correct, was very suboptimal. Some investigation found that tweaking the MERGE_TRAVERSAL_WEIGHT to lower it could give alternate answers such as v3.13-rc7~9^2~14^2~42 or v3.13~5^2~4^2~2^2~1^2~42 A manual solution involving looking at tagger dates came up with v3.13-rc1~65^2^2~42 which is much nicer. That workaround was then implemented in name-rev. Unfortunately, the taggerdate heuristic is causing bugs. I was pointed to a case in a private repository where name-rev reports a name of the form v2022.10.02~86 when users expected to see one of the form v2022.10.01~2 (I've modified the names and numbers a bit from the real testcase.) As you can probably guess, v2022.10.01 was created after v2022.10.02 (by a few hours), even though it pointed to an older commit. While the condition is unusual even in the repository in question, it is not the only problematic set of tags in that repository. The taggerdate logic is causing problems. Further, it turns out that this taggerdate heuristic isn't even helping anymore. Due to the fix to naming logic in 3656f84278 ("name-rev: prefer shorter names over following merges", 2021-12-04), we get improved names without the taggerdate heuristic. For the original commit of interest in linux.git, a modern git without the taggerdate heuristic still provides the same optimal answer of interest, namely: v3.13-rc1~65^2^2~42 So, the taggerdate is no longer providing benefit, and it is causing problems. Simply get rid of it. However, note that "taggerdate" as a variable is used to store things besides a taggerdate these days. Ever since commit ef1e74065c ("name-rev: favor describing with tags and use committer date to tiebreak", 2017-03-29), this has been used to store committer dates and there it is used as a fallback tiebreaker (as opposed to a primary criteria overriding effective distance calculations). We do not want to remove that fallback tiebreaker, so not all instances of "taggerdate" are removed in this change. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Elijah Newren committed Feb 9, 2023 at 09:11 UTC b2182a8730a2ad0a214f9118b5bd5d1f39c89544
2 files changed +9 -11
builtin/name-rev.c
+3 -11
@@ -108,19 +108,11 @@ static int is_better_name(struct rev_name *name,
108 int name_distance = effective_distance(name->distance, name->generation);
109 int new_distance = effective_distance(distance, generation);
110
111 - /*
112 - * When comparing names based on tags, prefer names
113 - * based on the older tag, even if it is farther away.
114 - */
111 + /* If both are tags, we prefer the nearer one. */
112 if (from_tag && name->from_tag)
116 - return (name->taggerdate > taggerdate ||
117 - (name->taggerdate == taggerdate &&
118 - name_distance > new_distance));
113 + return name_distance > new_distance;
114
120 - /*
121 - * We know that at least one of them is a non-tag at this point.
122 - * favor a tag over a non-tag.
123 - */
115 + /* Favor a tag over a non-tag. */
116 if (name->from_tag != from_tag)
117 return from_tag;
118
t/t6120-describe.sh
+6
@@ -657,4 +657,10 @@ test_expect_success 'setup: describe commits with disjoint bases 2' '
657
658 check_describe -C disjoint2 "B-3-gHASH" HEAD
659
660 +test_expect_success 'setup misleading taggerdates' '
661 + GIT_COMMITTER_DATE="2006-12-12 12:31" git tag -a -m "another tag" newer-tag-older-commit unique-file~1
662 +'
663 +
664 +check_describe newer-tag-older-commit~1 --contains unique-file~2
665 +
666 test_done