aboutsummaryrefslogtreecommitdiff
path: root/commitquery/load.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-29 13:38:19 +0000
committerGravatar Runxi Yu2026-03-29 13:39:49 +0000
commit37707aada0157f255dbad920b917efb601184e12 (patch)
tree29f79d242c764de8d6f1e65bcc847e53f21cd646 /commitquery/load.go
parentcommitquery: Context has been gone long ago (diff)
signatureNo signature
commitquery: Reorganize
Diffstat (limited to 'commitquery/load.go')
-rw-r--r--commitquery/load.go57
1 files changed, 57 insertions, 0 deletions
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)
+}