]> git.ipfire.org Git - thirdparty/git.git/commit
name-rev: use generation numbers if available
authorJacob Keller <jacob.keller@gmail.com>
Sat, 12 Mar 2022 00:00:15 +0000 (16:00 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 13 Mar 2022 18:39:29 +0000 (18:39 +0000)
commit2e8ea40fe3b9befc1420aed6defe8b48f302ca7b
tree2de8c91b788a26ea419d5676a1e3b73c93d47295
parent715d08a9e51251ad8290b181b6ac3b9e1f9719d7
name-rev: use generation numbers if available

If a commit in a sequence of linear history has a non-monotonically
increasing commit timestamp, git name-rev might not properly name the
commit.

This occurs because name-rev uses a heuristic of the commit date to
avoid searching down tags which lead to commits that are older than the
named commit. This is intended to avoid work on larger repositories.

This heuristic impacts git name-rev, and by extension git describe
--contains which is built on top of name-rev.

Further more, if --all or --annotate-stdin is used, the heuristic is not
enabled because the full history has to be analyzed anyways. This
results in some confusion if a user sees that --annotate-stdin works but
a normal name-rev does not.

If the repository has a commit graph, we can use the generation numbers
instead of using the commit dates. This is essentially the same check
except that generation numbers make it exact, where the commit date
heuristic could be incorrect due to clock errors.

Since we're extending the notion of cutoff to more than one variable,
create a series of functions for setting and checking the cutoff. This
avoids duplication and moves access of the global cutoff and
generation_cutoff to as few functions as possible.

Add several test cases including a test that covers the new commitGraph
behavior, as well as tests for --all and --annotate-stdin with and
without commitGraphs.

Signed-off-by: Jacob Keller <jacob.keller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/name-rev.c
t/t6120-describe.sh