in lib/grit/git-ruby/internal/pack.rb [200:242]
def find_object_in_index(idx, sha1)
slot = sha1.getord(0)
return nil if !slot
first, last = @offsets[slot,2]
while first < last
mid = (first + last) / 2
if @version == 2
midsha1 = idx[OffsetStart + (mid * SHA1Size), SHA1Size]
cmp = midsha1 <=> sha1
if cmp < 0
first = mid + 1
elsif cmp > 0
last = mid
else
pos = OffsetStart + (@size * (SHA1Size + CrcSize)) + (mid * OffsetSize)
offset = idx[pos, OffsetSize].unpack('N')[0]
if offset & 0x80000000 > 0
offset &= 0x7fffffff
pos = OffsetStart + (@size * (SHA1Size + CrcSize + OffsetSize)) + (offset * ExtendedOffsetSize)
words = idx[pos, ExtendedOffsetSize].unpack('NN')
offset = (words[0] << 32) | words[1]
end
return offset
end
else
midsha1 = idx[SHA1Start + mid * EntrySize,SHA1Size]
cmp = midsha1 <=> sha1
if cmp < 0
first = mid + 1
elsif cmp > 0
last = mid
else
pos = OffsetStart + mid * EntrySize
offset = idx[pos,OffsetSize].unpack('N')[0]
return offset
end
end
end
nil
end