]> git.ipfire.org Git - thirdparty/git.git/commit - sha1-name.c
for_each_abbrev: drop duplicate objects
authorJeff King <peff@peff.net>
Mon, 26 Sep 2016 12:00:33 +0000 (08:00 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 26 Sep 2016 18:46:41 +0000 (11:46 -0700)
commitfad6b9e5905f00654f394cac4093a052b7a3cfb6
tree36d8e08ad1132b9c28e5352afeabf885f64dd134
parent16ddcd403bdd74f47f3ae1a7e58a01e36e54a7d7
for_each_abbrev: drop duplicate objects

If an object appears multiple times in the object database
(e.g., in both loose and packed form, or in two separate
packs), the disambiguation machinery may see it more than
once. The get_short_sha1() function handles this already,
but for_each_abbrev() blindly fires the callback for each
instance it finds.

We can fix this by collecting the output in a sha1 array and
de-duplicating it.  As a bonus, the sort done for the
de-duplication means that our output will be stable,
regardless of the order in which the objects are found.

Note that the old code normalized the callback's output to
0/1 to store in the 1-bit ds->ambiguous flag (which both
halted the iteration and was returned from the
for_each_abbrev function). Now that we are using sha1_array,
we can return the real value. In practice, it doesn't matter
as the sole caller only ever returns 0.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sha1_name.c
t/t1512-rev-parse-disambiguation.sh