Fast implementation of Git in pure Go
at master 67 lines 1.6 kB view raw
1package read 2 3import "codeberg.org/lindenii/furgit/commitgraph" 4 5// ParentRef references one parent position. 6type ParentRef struct { 7 Valid bool 8 Pos Position 9} 10 11func (reader *Reader) decodeParents(layer *layer, p1, p2 uint32) (ParentRef, ParentRef, []Position, error) { 12 parent1, err := reader.decodeSingleParent(p1) 13 if err != nil { 14 return ParentRef{}, ParentRef{}, nil, err 15 } 16 17 if p2 == commitgraph.ParentNone { 18 return parent1, ParentRef{}, nil, nil 19 } 20 21 if p2&commitgraph.ParentExtraMask == 0 { 22 parent2, err := reader.decodeSingleParent(p2) 23 if err != nil { 24 return ParentRef{}, ParentRef{}, nil, err 25 } 26 27 return parent1, parent2, nil, nil 28 } 29 30 edgeStart := p2 & commitgraph.ParentLastMask 31 32 parents, err := reader.decodeExtraEdgeList(layer, edgeStart) 33 if err != nil { 34 return ParentRef{}, ParentRef{}, nil, err 35 } 36 37 if len(parents) == 0 { 38 return ParentRef{}, ParentRef{}, nil, &MalformedError{Path: layer.path, Reason: "empty EDGE list"} 39 } 40 41 parent2 := ParentRef{Valid: true, Pos: parents[0]} 42 if len(parents) == 1 { 43 return parent1, parent2, nil, nil 44 } 45 46 return parent1, parent2, parents[1:], nil 47} 48 49func (reader *Reader) decodeSingleParent(raw uint32) (ParentRef, error) { 50 if raw == commitgraph.ParentNone { 51 return ParentRef{}, nil 52 } 53 54 if raw&commitgraph.ParentExtraMask != 0 { 55 return ParentRef{}, &MalformedError{ 56 Path: "commit-graph", 57 Reason: "unexpected EDGE marker in single-parent slot", 58 } 59 } 60 61 pos, err := reader.globalToPosition(raw) 62 if err != nil { 63 return ParentRef{}, err 64 } 65 66 return ParentRef{Valid: true, Pos: pos}, nil 67}