diff options
Diffstat (limited to 'commitquery/query_resolve_commitish.go')
| -rw-r--r-- | commitquery/query_resolve_commitish.go | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/commitquery/query_resolve_commitish.go b/commitquery/query_resolve_commitish.go index 1b91c8bd..a9ad8bb5 100644 --- a/commitquery/query_resolve_commitish.go +++ b/commitquery/query_resolve_commitish.go @@ -1,16 +1,39 @@ package commitquery import ( - "codeberg.org/lindenii/furgit/internal/peel" + stderrors "errors" + + giterrors "codeberg.org/lindenii/furgit/errors" + "codeberg.org/lindenii/furgit/object/commit" objectid "codeberg.org/lindenii/furgit/object/id" + objectstore "codeberg.org/lindenii/furgit/object/store" + "codeberg.org/lindenii/furgit/object/tag" + objecttype "codeberg.org/lindenii/furgit/object/type" ) // resolveCommitish peels one commit-ish object ID and resolves the commit. func (query *query) resolveCommitish(id objectid.ObjectID) (nodeIndex, error) { - commitID, err := peel.ToCommit(query.store, id) - if err != nil { - return 0, err - } + for { + obj, err := query.fetcher.ExactObject(id) + if err != nil { + if stderrors.Is(err, objectstore.ErrObjectNotFound) { + return 0, &giterrors.ObjectMissingError{OID: id} + } - return query.resolveOID(commitID) + return 0, err + } + + switch parsed := obj.Object().(type) { + case *commit.Commit: + return query.resolveOID(id) + case *tag.Tag: + id = parsed.Target + default: + return 0, &giterrors.ObjectTypeError{ + OID: id, + Got: parsed.ObjectType(), + Want: objecttype.TypeCommit, + } + } + } } |
