Fast implementation of Git in pure Go
1package read
2
3import (
4 "bytes"
5 "encoding/binary"
6
7 "codeberg.org/lindenii/furgit/internal/intconv"
8 "codeberg.org/lindenii/furgit/objectid"
9)
10
11func layerLookup(layer *layer, oid objectid.ObjectID) (uint32, bool) {
12 hashSize := oid.Size()
13 first := int(oid.RawBytes()[0])
14
15 var lo uint32
16 if first > 0 {
17 lo = binary.BigEndian.Uint32(layer.chunkOIDFanout[(first-1)*4 : first*4])
18 }
19
20 hi := binary.BigEndian.Uint32(layer.chunkOIDFanout[first*4 : (first+1)*4])
21 if hi == 0 || lo >= hi {
22 return 0, false
23 }
24
25 target := oid.RawBytes()
26 left := int(lo)
27
28 right := int(hi) - 1
29 for left <= right {
30 mid := left + (right-left)/2
31 start := mid * hashSize
32 end := start + hashSize
33
34 current := layer.chunkOIDLookup[start:end]
35
36 cmp := bytes.Compare(current, target)
37 switch {
38 case cmp == 0:
39 pos, err := intconv.IntToUint32(mid)
40 if err != nil {
41 return 0, false
42 }
43
44 return pos, true
45 case cmp < 0:
46 left = mid + 1
47 default:
48 right = mid - 1
49 }
50 }
51
52 return 0, false
53}