Fast implementation of Git in pure Go codeberg.org/lindenii/furgit
git go
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

commitquery: Reorganize

Runxi Yu 37707aad 41f07c00

+147 -137
-14
commitquery/bits.go
··· 1 - package commitquery 2 - 3 - type markBits uint8 4 - 5 - const ( 6 - markLeft markBits = 1 << iota 7 - markRight 8 - markStale 9 - markResult 10 - ) 11 - 12 - const ( 13 - allMarks = markLeft | markRight | markStale | markResult 14 - )
commitquery/compare.go commitquery/node_compare.go
+1 -1
commitquery/generation.go commitquery/node_generation.go
··· 19 19 generationInfinity = uint64(math.MaxUint64) 20 20 ) 21 21 22 - func compareByGeneration(query *query) func(nodeIndex, nodeIndex) int { 22 + func (query *query) compareByGeneration() func(nodeIndex, nodeIndex) int { 23 23 return func(left, right nodeIndex) int { 24 24 leftGeneration := query.effectiveGeneration(left) 25 25 rightGeneration := query.effectiveGeneration(right)
+57
commitquery/load.go
··· 1 1 package commitquery 2 2 3 + import ( 4 + stderrors "errors" 5 + 6 + giterrors "codeberg.org/lindenii/furgit/errors" 7 + commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read" 8 + objectcommit "codeberg.org/lindenii/furgit/object/commit" 9 + objectstore "codeberg.org/lindenii/furgit/object/store" 10 + objecttype "codeberg.org/lindenii/furgit/object/type" 11 + ) 12 + 3 13 // ensureLoaded completes one node's metadata load if it has not been loaded yet. 4 14 func (query *query) ensureLoaded(idx nodeIndex) error { 5 15 if query.nodes[idx].loaded { ··· 12 22 13 23 return query.loadByOID(idx) 14 24 } 25 + 26 + // loadByOID populates one node from an object ID. 27 + func (query *query) loadByOID(idx nodeIndex) error { 28 + id := query.nodes[idx].id 29 + 30 + if query.graph != nil { 31 + pos, err := query.graph.Lookup(id) 32 + if err != nil { 33 + if _, ok := stderrors.AsType[*commitgraphread.NotFoundError](err); !ok { 34 + return err 35 + } 36 + } else { 37 + return query.loadCommitAtGraphPos(idx, pos) 38 + } 39 + } 40 + 41 + ty, content, err := query.store.ReadBytesContent(id) 42 + if err != nil { 43 + if stderrors.Is(err, objectstore.ErrObjectNotFound) { 44 + return &giterrors.ObjectMissingError{OID: id} 45 + } 46 + 47 + return err 48 + } 49 + 50 + if ty != objecttype.TypeCommit { 51 + return &giterrors.ObjectTypeError{OID: id, Got: ty, Want: objecttype.TypeCommit} 52 + } 53 + 54 + commitObj, err := objectcommit.Parse(content, id.Algorithm()) 55 + if err != nil { 56 + return err 57 + } 58 + 59 + parents := make([]parentRef, 0, len(commitObj.Parents)) 60 + for _, parentID := range commitObj.Parents { 61 + parents = append(parents, parentRef{ID: parentID}) 62 + } 63 + 64 + commit := commitData{ 65 + ID: id, 66 + Parents: parents, 67 + CommitTime: commitObj.Committer.WhenUnix, 68 + } 69 + 70 + return query.populateNode(idx, commit) 71 + }
+13
commitquery/marks.go
··· 87 87 88 88 return out 89 89 } 90 + 91 + type markBits uint8 92 + 93 + const ( 94 + markLeft markBits = 1 << iota 95 + markRight 96 + markStale 97 + markResult 98 + ) 99 + 100 + const ( 101 + allMarks = markLeft | markRight | markStale | markResult 102 + )
-14
commitquery/node.go
··· 5 5 objectid "codeberg.org/lindenii/furgit/object/id" 6 6 ) 7 7 8 - // nodeIndex identifies one internal query node. 9 - type nodeIndex int 10 - 11 8 // node stores one mutable commit traversal node. 12 9 type node struct { 13 10 id objectid.ObjectID ··· 26 23 27 24 touchedPhase uint32 28 25 } 29 - 30 - // newNode allocates one empty internal node. 31 - func (query *query) newNode(id objectid.ObjectID) nodeIndex { 32 - count := len(query.nodes) 33 - 34 - idx := nodeIndex(count) 35 - 36 - query.nodes = append(query.nodes, node{id: id}) 37 - 38 - return idx 39 - }
+5
commitquery/node_commit_time.go
··· 1 + package commitquery 2 + 3 + func (query *query) commitTime(idx nodeIndex) int64 { 4 + return query.nodes[idx].commitTime 5 + }
+7
commitquery/node_id.go
··· 1 + package commitquery 2 + 3 + import objectid "codeberg.org/lindenii/furgit/object/id" 4 + 5 + func (query *query) id(idx nodeIndex) objectid.ObjectID { 6 + return query.nodes[idx].id 7 + }
+4
commitquery/node_index.go
··· 1 + package commitquery 2 + 3 + // nodeIndex identifies one internal query node. 4 + type nodeIndex int
+14
commitquery/node_new.go
··· 1 + package commitquery 2 + 3 + import objectid "codeberg.org/lindenii/furgit/object/id" 4 + 5 + // newNode allocates one empty internal node. 6 + func (query *query) newNode(id objectid.ObjectID) nodeIndex { 7 + count := len(query.nodes) 8 + 9 + idx := nodeIndex(count) 10 + 11 + query.nodes = append(query.nodes, node{id: id}) 12 + 13 + return idx 14 + }
-101
commitquery/oid.go
··· 1 - package commitquery 2 - 3 - import ( 4 - stderrors "errors" 5 - 6 - giterrors "codeberg.org/lindenii/furgit/errors" 7 - commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read" 8 - "codeberg.org/lindenii/furgit/internal/peel" 9 - objectcommit "codeberg.org/lindenii/furgit/object/commit" 10 - objectid "codeberg.org/lindenii/furgit/object/id" 11 - objectstore "codeberg.org/lindenii/furgit/object/store" 12 - objecttype "codeberg.org/lindenii/furgit/object/type" 13 - ) 14 - 15 - func (query *query) id(idx nodeIndex) objectid.ObjectID { 16 - return query.nodes[idx].id 17 - } 18 - 19 - func (query *query) commitTime(idx nodeIndex) int64 { 20 - return query.nodes[idx].commitTime 21 - } 22 - 23 - func (query *query) resolveOID(id objectid.ObjectID) (nodeIndex, error) { 24 - idx, ok := query.byOID[id] 25 - if ok { 26 - err := query.ensureLoaded(idx) 27 - if err != nil { 28 - return 0, err 29 - } 30 - 31 - return idx, nil 32 - } 33 - 34 - idx = query.newNode(id) 35 - query.byOID[id] = idx 36 - 37 - err := query.loadByOID(idx) 38 - if err != nil { 39 - delete(query.byOID, id) 40 - 41 - return 0, err 42 - } 43 - 44 - return idx, nil 45 - } 46 - 47 - func (query *query) resolveCommitish(id objectid.ObjectID) (nodeIndex, error) { 48 - commitID, err := peel.ToCommit(query.store, id) 49 - if err != nil { 50 - return 0, err 51 - } 52 - 53 - return query.resolveOID(commitID) 54 - } 55 - 56 - // loadByOID populates one node from an object ID. 57 - func (query *query) loadByOID(idx nodeIndex) error { 58 - id := query.nodes[idx].id 59 - 60 - if query.graph != nil { 61 - pos, err := query.graph.Lookup(id) 62 - if err != nil { 63 - if _, ok := stderrors.AsType[*commitgraphread.NotFoundError](err); !ok { 64 - return err 65 - } 66 - } else { 67 - return query.loadCommitAtGraphPos(idx, pos) 68 - } 69 - } 70 - 71 - ty, content, err := query.store.ReadBytesContent(id) 72 - if err != nil { 73 - if stderrors.Is(err, objectstore.ErrObjectNotFound) { 74 - return &giterrors.ObjectMissingError{OID: id} 75 - } 76 - 77 - return err 78 - } 79 - 80 - if ty != objecttype.TypeCommit { 81 - return &giterrors.ObjectTypeError{OID: id, Got: ty, Want: objecttype.TypeCommit} 82 - } 83 - 84 - commitObj, err := objectcommit.Parse(content, id.Algorithm()) 85 - if err != nil { 86 - return err 87 - } 88 - 89 - parents := make([]parentRef, 0, len(commitObj.Parents)) 90 - for _, parentID := range commitObj.Parents { 91 - parents = append(parents, parentRef{ID: parentID}) 92 - } 93 - 94 - commit := commitData{ 95 - ID: id, 96 - Parents: parents, 97 - CommitTime: commitObj.Committer.WhenUnix, 98 - } 99 - 100 - return query.populateNode(idx, commit) 101 - }
commitquery/paint.go commitquery/node_paint_down_to_common.go
+5 -5
commitquery/parent.go commitquery/node_parent.go
··· 5 5 objectid "codeberg.org/lindenii/furgit/object/id" 6 6 ) 7 7 8 + // Parents returns resolved parent node indices for one internal node. 9 + func (query *query) parents(idx nodeIndex) []nodeIndex { 10 + return query.nodes[idx].parents 11 + } 12 + 8 13 // parentRef references one commit parent. 9 14 type parentRef struct { 10 15 ID objectid.ObjectID 11 16 GraphPos commitgraphread.Position 12 17 HasGraphPos bool 13 - } 14 - 15 - // Parents returns resolved parent node indices for one internal node. 16 - func (query *query) parents(idx nodeIndex) []nodeIndex { 17 - return query.nodes[idx].parents 18 18 } 19 19 20 20 // resolveParent resolves one parent descriptor to one internal node.
commitquery/populate.go commitquery/node_populate.go
+2 -2
commitquery/reduce.go
··· 74 74 75 75 func removeRedundantWithGen(query *query, candidates []nodeIndex) []nodeIndex { 76 76 sorted := append([]nodeIndex(nil), candidates...) 77 - slices.SortFunc(sorted, compareByGeneration(query)) 77 + slices.SortFunc(sorted, query.compareByGeneration()) 78 78 79 79 minGeneration := query.effectiveGeneration(sorted[0]) 80 80 minGenPos := 0 ··· 97 97 } 98 98 } 99 99 100 - slices.SortFunc(walkStart, compareByGeneration(query)) 100 + slices.SortFunc(walkStart, query.compareByGeneration()) 101 101 102 102 for _, idx := range walkStart { 103 103 query.clearMarks(idx, markStale)
+39
commitquery/resolve.go
··· 1 + package commitquery 2 + 3 + import ( 4 + "codeberg.org/lindenii/furgit/internal/peel" 5 + objectid "codeberg.org/lindenii/furgit/object/id" 6 + ) 7 + 8 + func (query *query) resolveOID(id objectid.ObjectID) (nodeIndex, error) { 9 + idx, ok := query.byOID[id] 10 + if ok { 11 + err := query.ensureLoaded(idx) 12 + if err != nil { 13 + return 0, err 14 + } 15 + 16 + return idx, nil 17 + } 18 + 19 + idx = query.newNode(id) 20 + query.byOID[id] = idx 21 + 22 + err := query.loadByOID(idx) 23 + if err != nil { 24 + delete(query.byOID, id) 25 + 26 + return 0, err 27 + } 28 + 29 + return idx, nil 30 + } 31 + 32 + func (query *query) resolveCommitish(id objectid.ObjectID) (nodeIndex, error) { 33 + commitID, err := peel.ToCommit(query.store, id) 34 + if err != nil { 35 + return 0, err 36 + } 37 + 38 + return query.resolveOID(commitID) 39 + }