Skip to content
  • Jeff King's avatar
    sha1-lookup: handle duplicate keys with GIT_USE_LOOKUP · 171bdaca
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    The sha1_entry_pos function tries to be smart about
    selecting the middle of a range for its binary search by
    looking at the value differences between the "lo" and "hi"
    constraints. However, it is unable to cope with entries with
    duplicate keys in the sorted list.
    
    We may hit a point in the search where both our "lo" and
    "hi" point to the same key. In this case, the range of
    values between our endpoints is 0, and trying to scale the
    difference between our key and the endpoints over that range
    is undefined (i.e., divide by zero). The current code
    catches this with an "assert(lov < hiv)".
    
    Moreover, after seeing that the first 20 byte of the key are
    the same, we will try to establish a value from the 21st
    byte. Which is nonsensical.
    
    Instead, we can detect the case that we are in a run of
    duplicates, and simply do a final comparison against any one
    of them (since they are all the same, it does not matter
    which). If the keys match, we have found our entry (or one
    of them, anyway).  If not, then we know that we do not need
    to look further, as we must be in a run of the duplicate
    key.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Acked-by: default avatarNicolas Pitre <nico@fluxnic.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    171bdaca