builtin/describe.c: describe a blob
commit644eb60bd01a15f665b63774fd80e3b6316073a1
authorStefan Beller <sbeller@google.com>
Thu, 16 Nov 2017 02:00:39 +0000 (15 18:00 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 19 Dec 2017 19:17:16 +0000 (19 11:17 -0800)
tree67e1d0cd9e08fa002a71e25571eaa30ab8ff6efc
parent4dbc59a4cce418ff8428a9d2ecd67c34ca50db56
builtin/describe.c: describe a blob

Sometimes users are given a hash of an object and they want to
identify it further (ex.: Use verify-pack to find the largest blobs,
but what are these? or [1])

When describing commits, we try to anchor them to tags or refs, as these
are conceptually on a higher level than the commit. And if there is no ref
or tag that matches exactly, we're out of luck.  So we employ a heuristic
to make up a name for the commit. These names are ambiguous, there might
be different tags or refs to anchor to, and there might be different
path in the DAG to travel to arrive at the commit precisely.

When describing a blob, we want to describe the blob from a higher layer
as well, which is a tuple of (commit, deep/path) as the tree objects
involved are rather uninteresting.  The same blob can be referenced by
multiple commits, so how we decide which commit to use?  This patch
implements a rather naive approach on this: As there are no back pointers
from blobs to commits in which the blob occurs, we'll start walking from
any tips available, listing the blobs in-order of the commit and once we
found the blob, we'll take the first commit that listed the blob. For
example

  git describe --tags v0.99:Makefile
  conversion-901-g7672db20c2:Makefile

tells us the Makefile as it was in v0.99 was introduced in commit 7672db20.

The walking is performed in reverse order to show the introduction of a
blob rather than its last occurrence.

[1] https://stackoverflow.com/questions/223678/which-commit-has-this-blob

Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-describe.txt
builtin/describe.c
t/t6120-describe.sh