diff options
Diffstat (limited to 'commitquery')
| -rw-r--r-- | commitquery/bits.go | 14 | ||||
| -rw-r--r-- | commitquery/load.go | 57 | ||||
| -rw-r--r-- | commitquery/marks.go | 13 | ||||
| -rw-r--r-- | commitquery/node.go | 14 | ||||
| -rw-r--r-- | commitquery/node_commit_time.go | 5 | ||||
| -rw-r--r-- | commitquery/node_compare.go (renamed from commitquery/compare.go) | 0 | ||||
| -rw-r--r-- | commitquery/node_generation.go (renamed from commitquery/generation.go) | 2 | ||||
| -rw-r--r-- | commitquery/node_id.go | 7 | ||||
| -rw-r--r-- | commitquery/node_index.go | 4 | ||||
| -rw-r--r-- | commitquery/node_new.go | 14 | ||||
| -rw-r--r-- | commitquery/node_paint_down_to_common.go (renamed from commitquery/paint.go) | 0 | ||||
| -rw-r--r-- | commitquery/node_parent.go (renamed from commitquery/parent.go) | 10 | ||||
| -rw-r--r-- | commitquery/node_populate.go (renamed from commitquery/populate.go) | 0 | ||||
| -rw-r--r-- | commitquery/oid.go | 101 | ||||
| -rw-r--r-- | commitquery/reduce.go | 4 | ||||
| -rw-r--r-- | commitquery/resolve.go | 39 |
16 files changed, 147 insertions, 137 deletions
diff --git a/commitquery/bits.go b/commitquery/bits.go deleted file mode 100644 index 36ffff29..00000000 --- a/commitquery/bits.go +++ /dev/null @@ -1,14 +0,0 @@ -package commitquery - -type markBits uint8 - -const ( - markLeft markBits = 1 << iota - markRight - markStale - markResult -) - -const ( - allMarks = markLeft | markRight | markStale | markResult -) diff --git a/commitquery/load.go b/commitquery/load.go index be39c7d9..076f3000 100644 --- a/commitquery/load.go +++ b/commitquery/load.go @@ -1,5 +1,15 @@ package commitquery +import ( + stderrors "errors" + + giterrors "codeberg.org/lindenii/furgit/errors" + commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read" + objectcommit "codeberg.org/lindenii/furgit/object/commit" + objectstore "codeberg.org/lindenii/furgit/object/store" + objecttype "codeberg.org/lindenii/furgit/object/type" +) + // ensureLoaded completes one node's metadata load if it has not been loaded yet. func (query *query) ensureLoaded(idx nodeIndex) error { if query.nodes[idx].loaded { @@ -12,3 +22,50 @@ func (query *query) ensureLoaded(idx nodeIndex) error { return query.loadByOID(idx) } + +// loadByOID populates one node from an object ID. +func (query *query) loadByOID(idx nodeIndex) error { + id := query.nodes[idx].id + + if query.graph != nil { + pos, err := query.graph.Lookup(id) + if err != nil { + if _, ok := stderrors.AsType[*commitgraphread.NotFoundError](err); !ok { + return err + } + } else { + return query.loadCommitAtGraphPos(idx, pos) + } + } + + ty, content, err := query.store.ReadBytesContent(id) + if err != nil { + if stderrors.Is(err, objectstore.ErrObjectNotFound) { + return &giterrors.ObjectMissingError{OID: id} + } + + return err + } + + if ty != objecttype.TypeCommit { + return &giterrors.ObjectTypeError{OID: id, Got: ty, Want: objecttype.TypeCommit} + } + + commitObj, err := objectcommit.Parse(content, id.Algorithm()) + if err != nil { + return err + } + + parents := make([]parentRef, 0, len(commitObj.Parents)) + for _, parentID := range commitObj.Parents { + parents = append(parents, parentRef{ID: parentID}) + } + + commit := commitData{ + ID: id, + Parents: parents, + CommitTime: commitObj.Committer.WhenUnix, + } + + return query.populateNode(idx, commit) +} diff --git a/commitquery/marks.go b/commitquery/marks.go index 43ca9f44..2d0b013f 100644 --- a/commitquery/marks.go +++ b/commitquery/marks.go @@ -87,3 +87,16 @@ func (query *query) collectMarkedResults() []nodeIndex { return out } + +type markBits uint8 + +const ( + markLeft markBits = 1 << iota + markRight + markStale + markResult +) + +const ( + allMarks = markLeft | markRight | markStale | markResult +) diff --git a/commitquery/node.go b/commitquery/node.go index d5f1d3cd..7432a719 100644 --- a/commitquery/node.go +++ b/commitquery/node.go @@ -5,9 +5,6 @@ import ( objectid "codeberg.org/lindenii/furgit/object/id" ) -// nodeIndex identifies one internal query node. -type nodeIndex int - // node stores one mutable commit traversal node. type node struct { id objectid.ObjectID @@ -26,14 +23,3 @@ type node struct { touchedPhase uint32 } - -// newNode allocates one empty internal node. -func (query *query) newNode(id objectid.ObjectID) nodeIndex { - count := len(query.nodes) - - idx := nodeIndex(count) - - query.nodes = append(query.nodes, node{id: id}) - - return idx -} diff --git a/commitquery/node_commit_time.go b/commitquery/node_commit_time.go new file mode 100644 index 00000000..3c42673d --- /dev/null +++ b/commitquery/node_commit_time.go @@ -0,0 +1,5 @@ +package commitquery + +func (query *query) commitTime(idx nodeIndex) int64 { + return query.nodes[idx].commitTime +} diff --git a/commitquery/compare.go b/commitquery/node_compare.go index 7ae984dc..7ae984dc 100644 --- a/commitquery/compare.go +++ b/commitquery/node_compare.go diff --git a/commitquery/generation.go b/commitquery/node_generation.go index 935da104..b04f3762 100644 --- a/commitquery/generation.go +++ b/commitquery/node_generation.go @@ -19,7 +19,7 @@ const ( generationInfinity = uint64(math.MaxUint64) ) -func compareByGeneration(query *query) func(nodeIndex, nodeIndex) int { +func (query *query) compareByGeneration() func(nodeIndex, nodeIndex) int { return func(left, right nodeIndex) int { leftGeneration := query.effectiveGeneration(left) rightGeneration := query.effectiveGeneration(right) diff --git a/commitquery/node_id.go b/commitquery/node_id.go new file mode 100644 index 00000000..c1d82f38 --- /dev/null +++ b/commitquery/node_id.go @@ -0,0 +1,7 @@ +package commitquery + +import objectid "codeberg.org/lindenii/furgit/object/id" + +func (query *query) id(idx nodeIndex) objectid.ObjectID { + return query.nodes[idx].id +} diff --git a/commitquery/node_index.go b/commitquery/node_index.go new file mode 100644 index 00000000..06122d62 --- /dev/null +++ b/commitquery/node_index.go @@ -0,0 +1,4 @@ +package commitquery + +// nodeIndex identifies one internal query node. +type nodeIndex int diff --git a/commitquery/node_new.go b/commitquery/node_new.go new file mode 100644 index 00000000..14a35262 --- /dev/null +++ b/commitquery/node_new.go @@ -0,0 +1,14 @@ +package commitquery + +import objectid "codeberg.org/lindenii/furgit/object/id" + +// newNode allocates one empty internal node. +func (query *query) newNode(id objectid.ObjectID) nodeIndex { + count := len(query.nodes) + + idx := nodeIndex(count) + + query.nodes = append(query.nodes, node{id: id}) + + return idx +} diff --git a/commitquery/paint.go b/commitquery/node_paint_down_to_common.go index 6bb1f489..6bb1f489 100644 --- a/commitquery/paint.go +++ b/commitquery/node_paint_down_to_common.go diff --git a/commitquery/parent.go b/commitquery/node_parent.go index fe0f4fba..17224701 100644 --- a/commitquery/parent.go +++ b/commitquery/node_parent.go @@ -5,6 +5,11 @@ import ( objectid "codeberg.org/lindenii/furgit/object/id" ) +// Parents returns resolved parent node indices for one internal node. +func (query *query) parents(idx nodeIndex) []nodeIndex { + return query.nodes[idx].parents +} + // parentRef references one commit parent. type parentRef struct { ID objectid.ObjectID @@ -12,11 +17,6 @@ type parentRef struct { HasGraphPos bool } -// Parents returns resolved parent node indices for one internal node. -func (query *query) parents(idx nodeIndex) []nodeIndex { - return query.nodes[idx].parents -} - // resolveParent resolves one parent descriptor to one internal node. func (query *query) resolveParent(parent parentRef) (nodeIndex, error) { if parent.HasGraphPos { diff --git a/commitquery/populate.go b/commitquery/node_populate.go index 26fb5629..26fb5629 100644 --- a/commitquery/populate.go +++ b/commitquery/node_populate.go diff --git a/commitquery/oid.go b/commitquery/oid.go deleted file mode 100644 index fd524dfb..00000000 --- a/commitquery/oid.go +++ /dev/null @@ -1,101 +0,0 @@ -package commitquery - -import ( - stderrors "errors" - - giterrors "codeberg.org/lindenii/furgit/errors" - commitgraphread "codeberg.org/lindenii/furgit/format/commitgraph/read" - "codeberg.org/lindenii/furgit/internal/peel" - objectcommit "codeberg.org/lindenii/furgit/object/commit" - objectid "codeberg.org/lindenii/furgit/object/id" - objectstore "codeberg.org/lindenii/furgit/object/store" - objecttype "codeberg.org/lindenii/furgit/object/type" -) - -func (query *query) id(idx nodeIndex) objectid.ObjectID { - return query.nodes[idx].id -} - -func (query *query) commitTime(idx nodeIndex) int64 { - return query.nodes[idx].commitTime -} - -func (query *query) resolveOID(id objectid.ObjectID) (nodeIndex, error) { - idx, ok := query.byOID[id] - if ok { - err := query.ensureLoaded(idx) - if err != nil { - return 0, err - } - - return idx, nil - } - - idx = query.newNode(id) - query.byOID[id] = idx - - err := query.loadByOID(idx) - if err != nil { - delete(query.byOID, id) - - return 0, err - } - - return idx, nil -} - -func (query *query) resolveCommitish(id objectid.ObjectID) (nodeIndex, error) { - commitID, err := peel.ToCommit(query.store, id) - if err != nil { - return 0, err - } - - return query.resolveOID(commitID) -} - -// loadByOID populates one node from an object ID. -func (query *query) loadByOID(idx nodeIndex) error { - id := query.nodes[idx].id - - if query.graph != nil { - pos, err := query.graph.Lookup(id) - if err != nil { - if _, ok := stderrors.AsType[*commitgraphread.NotFoundError](err); !ok { - return err - } - } else { - return query.loadCommitAtGraphPos(idx, pos) - } - } - - ty, content, err := query.store.ReadBytesContent(id) - if err != nil { - if stderrors.Is(err, objectstore.ErrObjectNotFound) { - return &giterrors.ObjectMissingError{OID: id} - } - - return err - } - - if ty != objecttype.TypeCommit { - return &giterrors.ObjectTypeError{OID: id, Got: ty, Want: objecttype.TypeCommit} - } - - commitObj, err := objectcommit.Parse(content, id.Algorithm()) - if err != nil { - return err - } - - parents := make([]parentRef, 0, len(commitObj.Parents)) - for _, parentID := range commitObj.Parents { - parents = append(parents, parentRef{ID: parentID}) - } - - commit := commitData{ - ID: id, - Parents: parents, - CommitTime: commitObj.Committer.WhenUnix, - } - - return query.populateNode(idx, commit) -} diff --git a/commitquery/reduce.go b/commitquery/reduce.go index f8a86f69..46c3bf39 100644 --- a/commitquery/reduce.go +++ b/commitquery/reduce.go @@ -74,7 +74,7 @@ func removeRedundantNoGen(query *query, candidates []nodeIndex) ([]nodeIndex, er func removeRedundantWithGen(query *query, candidates []nodeIndex) []nodeIndex { sorted := append([]nodeIndex(nil), candidates...) - slices.SortFunc(sorted, compareByGeneration(query)) + slices.SortFunc(sorted, query.compareByGeneration()) minGeneration := query.effectiveGeneration(sorted[0]) minGenPos := 0 @@ -97,7 +97,7 @@ func removeRedundantWithGen(query *query, candidates []nodeIndex) []nodeIndex { } } - slices.SortFunc(walkStart, compareByGeneration(query)) + slices.SortFunc(walkStart, query.compareByGeneration()) for _, idx := range walkStart { query.clearMarks(idx, markStale) diff --git a/commitquery/resolve.go b/commitquery/resolve.go new file mode 100644 index 00000000..cd6c3650 --- /dev/null +++ b/commitquery/resolve.go @@ -0,0 +1,39 @@ +package commitquery + +import ( + "codeberg.org/lindenii/furgit/internal/peel" + objectid "codeberg.org/lindenii/furgit/object/id" +) + +func (query *query) resolveOID(id objectid.ObjectID) (nodeIndex, error) { + idx, ok := query.byOID[id] + if ok { + err := query.ensureLoaded(idx) + if err != nil { + return 0, err + } + + return idx, nil + } + + idx = query.newNode(id) + query.byOID[id] = idx + + err := query.loadByOID(idx) + if err != nil { + delete(query.byOID, id) + + return 0, err + } + + return idx, nil +} + +func (query *query) resolveCommitish(id objectid.ObjectID) (nodeIndex, error) { + commitID, err := peel.ToCommit(query.store, id) + if err != nil { + return 0, err + } + + return query.resolveOID(commitID) +} |
