diff options
Diffstat (limited to 'commitquery/query_load_by_oid.go')
| -rw-r--r-- | commitquery/query_load_by_oid.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/commitquery/query_load_by_oid.go b/commitquery/query_load_by_oid.go new file mode 100644 index 00000000..eb997b2d --- /dev/null +++ b/commitquery/query_load_by_oid.go @@ -0,0 +1,58 @@ +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" +) + +// 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) +} |
