Skip to content

Commit 59d1808

Browse files
steadmongitster
authored andcommitted
describe: drop early return for max_candidates == 0
Before we even start the describe algorithm, we check to see if max_candidates is 0 and bail immediately if we did not find an exact match. This comes from 2c33f75 (Teach git-describe --exact-match to avoid expensive tag searches, 2008-02-24), since the the --exact-match option just sets max_candidates to 0. But this interacts badly with the --always option (ironically added only a week later in da2478d (describe --always: fall back to showing an abbreviated object name, 2008-03-02)). With --always, we'd still want to show the hash rather than calling die(). So this: git describe --exact-match --always and likewise: git describe --exact-match --candidates=0 has always been broken. But nobody ever noticed, because using those options together is rather unlikely. However, this bug became a lot easier to trigger with a301541 (describe: stop traversing when we run out of names, 2024-10-31). There we reduce max_candidates automatically based on the number of tags available. So in a repo with no tags (or one where --match finds no tags), max_candidates becomes 0, and --always will never show anything. So that early check for --exact-match's zero candidates needs to be adjusted. One way to do so is to have it check the "always" flag and handle it specially, producing the expected hash. But that would require duplicating the output code for "always". Instead, we'd prefer to just fall through to the normal algorithm, which should notice that we are not allowed to find any more candidates, stop looking, and then hit the regular "always" output code. Back when 2c33f75 was first done, this was a bad idea, since the normal algorithm kept looking for the max+1 candidate. But since 082a4d9 (describe: stop digging for max_candidates+1, 2024-10-31), we don't do that anymore, and the algorithm is essentially a noop. So we can drop the early return entirely, and the fact that max_candidates is 0 will let us quit early without any special casing. Reported-by: Josh Steadmon <[email protected]> Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent b8150bf commit 59d1808

File tree

2 files changed

+6
-2
lines changed

2 files changed

+6
-2
lines changed

builtin/describe.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,8 +336,6 @@ static void describe_commit(struct object_id *oid, struct strbuf *dst)
336336
return;
337337
}
338338

339-
if (!max_candidates)
340-
die(_("no tag exactly matches '%s'"), oid_to_hex(&cmit->object.oid));
341339
if (debug)
342340
fprintf(stderr, _("No exact match on refs or tags, searching to describe\n"));
343341

t/t6120-describe.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,4 +716,10 @@ test_expect_success 'describe --broken --dirty with a file with changed stat' '
716716
)
717717
'
718718

719+
test_expect_success '--always with no refs falls back to commit hash' '
720+
git rev-parse HEAD >expect &&
721+
git describe --no-abbrev --always --match=no-such-tag >actual &&
722+
test_cmp expect actual
723+
'
724+
719725
test_done

0 commit comments

Comments
 (0)