From 84aac13e64962806e5101abc461be50198ac5642 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 29 Mar 2026 15:10:21 +0000 Subject: object/fetch: Use proper errors --- object/fetch/exact_blob.go | 6 +++--- object/fetch/exact_blob_reader.go | 2 +- object/fetch/exact_commit.go | 6 +++--- object/fetch/exact_commit_reader.go | 2 +- object/fetch/exact_reader.go | 8 ++++---- object/fetch/exact_tag.go | 6 +++--- object/fetch/exact_tag_reader.go | 2 +- object/fetch/exact_tree.go | 6 +++--- object/fetch/exact_tree_reader.go | 2 +- object/fetch/object_errors.go | 19 +++++++++++++++++++ object/fetch/object_parse.go | 2 +- object/fetch/peel_to_blob.go | 6 +++--- object/fetch/peel_to_blob_id.go | 9 ++++----- object/fetch/peel_to_commit.go | 6 +++--- object/fetch/peel_to_commit_id.go | 9 ++++----- object/fetch/peel_to_tree.go | 6 +++--- object/fetch/peel_to_tree_id.go | 9 ++++----- 17 files changed, 61 insertions(+), 45 deletions(-) create mode 100644 object/fetch/object_errors.go (limited to 'object') diff --git a/object/fetch/exact_blob.go b/object/fetch/exact_blob.go index 8b0378ea..ef4b84fe 100644 --- a/object/fetch/exact_blob.go +++ b/object/fetch/exact_blob.go @@ -1,11 +1,11 @@ package fetch import ( - "fmt" - + giterrors "codeberg.org/lindenii/furgit/errors" "codeberg.org/lindenii/furgit/object/blob" objectid "codeberg.org/lindenii/furgit/object/id" "codeberg.org/lindenii/furgit/object/stored" + objecttype "codeberg.org/lindenii/furgit/object/type" ) // ExactBlob reads, parses, and wraps the blob at id. @@ -19,7 +19,7 @@ func (r *Fetcher) ExactBlob(id objectid.ObjectID) (*stored.Stored[*blob.Blob], e blob, ok := parsed.(*blob.Blob) if !ok { - return nil, fmt.Errorf("object/fetch: expected blob object %s, got %v", id, parsed.ObjectType()) + return nil, &giterrors.ObjectTypeError{OID: id, Got: parsed.ObjectType(), Want: objecttype.TypeBlob} } return stored.New(id, blob), nil diff --git a/object/fetch/exact_blob_reader.go b/object/fetch/exact_blob_reader.go index ee0fc21a..4a313d3e 100644 --- a/object/fetch/exact_blob_reader.go +++ b/object/fetch/exact_blob_reader.go @@ -12,5 +12,5 @@ import ( // // Labels: Life-Parent, Close-Caller. func (r *Fetcher) ExactBlobReader(id objectid.ObjectID) (io.ReadCloser, int64, error) { - return r.exactReader(id, objecttype.TypeBlob, "blob") + return r.exactReader(id, objecttype.TypeBlob) } diff --git a/object/fetch/exact_commit.go b/object/fetch/exact_commit.go index 1b330e7d..9483b2b1 100644 --- a/object/fetch/exact_commit.go +++ b/object/fetch/exact_commit.go @@ -1,11 +1,11 @@ package fetch import ( - "fmt" - + giterrors "codeberg.org/lindenii/furgit/errors" "codeberg.org/lindenii/furgit/object/commit" objectid "codeberg.org/lindenii/furgit/object/id" "codeberg.org/lindenii/furgit/object/stored" + objecttype "codeberg.org/lindenii/furgit/object/type" ) // ExactCommit reads, parses, and wraps the commit at id. @@ -19,7 +19,7 @@ func (r *Fetcher) ExactCommit(id objectid.ObjectID) (*stored.Stored[*commit.Comm commit, ok := parsed.(*commit.Commit) if !ok { - return nil, fmt.Errorf("object/fetch: expected commit object %s, got %v", id, parsed.ObjectType()) + return nil, &giterrors.ObjectTypeError{OID: id, Got: parsed.ObjectType(), Want: objecttype.TypeCommit} } return stored.New(id, commit), nil diff --git a/object/fetch/exact_commit_reader.go b/object/fetch/exact_commit_reader.go index 484fd89f..14533a4d 100644 --- a/object/fetch/exact_commit_reader.go +++ b/object/fetch/exact_commit_reader.go @@ -14,5 +14,5 @@ import ( // // Labels: Life-Parent, Close-Caller. func (r *Fetcher) ExactCommitReader(id objectid.ObjectID) (io.ReadCloser, int64, error) { - return r.exactReader(id, objecttype.TypeCommit, "commit") + return r.exactReader(id, objecttype.TypeCommit) } diff --git a/object/fetch/exact_reader.go b/object/fetch/exact_reader.go index 54cf246c..d588480d 100644 --- a/object/fetch/exact_reader.go +++ b/object/fetch/exact_reader.go @@ -1,25 +1,25 @@ package fetch import ( - "fmt" "io" + giterrors "codeberg.org/lindenii/furgit/errors" objectid "codeberg.org/lindenii/furgit/object/id" objecttype "codeberg.org/lindenii/furgit/object/type" ) // exactReader reads one object's content stream and verifies that its header // type matches wantType. -func (r *Fetcher) exactReader(id objectid.ObjectID, wantType objecttype.Type, wantName string) (io.ReadCloser, int64, error) { +func (r *Fetcher) exactReader(id objectid.ObjectID, wantType objecttype.Type) (io.ReadCloser, int64, error) { gotType, size, rc, err := r.store.ReadReaderContent(id) if err != nil { - return nil, 0, err + return nil, 0, wrapObjectReadError(id, err) } if gotType != wantType { _ = rc.Close() - return nil, 0, fmt.Errorf("object/fetch: expected %s object %s, got %v", wantName, id, gotType) + return nil, 0, &giterrors.ObjectTypeError{OID: id, Got: gotType, Want: wantType} } return rc, size, nil diff --git a/object/fetch/exact_tag.go b/object/fetch/exact_tag.go index e50cc565..230e7d57 100644 --- a/object/fetch/exact_tag.go +++ b/object/fetch/exact_tag.go @@ -1,11 +1,11 @@ package fetch import ( - "fmt" - + giterrors "codeberg.org/lindenii/furgit/errors" objectid "codeberg.org/lindenii/furgit/object/id" "codeberg.org/lindenii/furgit/object/stored" "codeberg.org/lindenii/furgit/object/tag" + objecttype "codeberg.org/lindenii/furgit/object/type" ) // ExactTag reads, parses, and wraps the tag at id. @@ -19,7 +19,7 @@ func (r *Fetcher) ExactTag(id objectid.ObjectID) (*stored.Stored[*tag.Tag], erro tag, ok := parsed.(*tag.Tag) if !ok { - return nil, fmt.Errorf("object/fetch: expected tag object %s, got %v", id, parsed.ObjectType()) + return nil, &giterrors.ObjectTypeError{OID: id, Got: parsed.ObjectType(), Want: objecttype.TypeTag} } return stored.New(id, tag), nil diff --git a/object/fetch/exact_tag_reader.go b/object/fetch/exact_tag_reader.go index d5e4f2c4..bba83a64 100644 --- a/object/fetch/exact_tag_reader.go +++ b/object/fetch/exact_tag_reader.go @@ -14,5 +14,5 @@ import ( // // Labels: Life-Parent, Close-Caller. func (r *Fetcher) ExactTagReader(id objectid.ObjectID) (io.ReadCloser, int64, error) { - return r.exactReader(id, objecttype.TypeTag, "tag") + return r.exactReader(id, objecttype.TypeTag) } diff --git a/object/fetch/exact_tree.go b/object/fetch/exact_tree.go index 71d4c2b9..8bfc87ea 100644 --- a/object/fetch/exact_tree.go +++ b/object/fetch/exact_tree.go @@ -1,11 +1,11 @@ package fetch import ( - "fmt" - + giterrors "codeberg.org/lindenii/furgit/errors" objectid "codeberg.org/lindenii/furgit/object/id" "codeberg.org/lindenii/furgit/object/stored" "codeberg.org/lindenii/furgit/object/tree" + objecttype "codeberg.org/lindenii/furgit/object/type" ) // ExactTree reads, parses, and wraps the tree at id. @@ -19,7 +19,7 @@ func (r *Fetcher) ExactTree(id objectid.ObjectID) (*stored.Stored[*tree.Tree], e tree, ok := parsed.(*tree.Tree) if !ok { - return nil, fmt.Errorf("object/fetch: expected tree object %s, got %v", id, parsed.ObjectType()) + return nil, &giterrors.ObjectTypeError{OID: id, Got: parsed.ObjectType(), Want: objecttype.TypeTree} } return stored.New(id, tree), nil diff --git a/object/fetch/exact_tree_reader.go b/object/fetch/exact_tree_reader.go index d8fca5dc..3504b9b1 100644 --- a/object/fetch/exact_tree_reader.go +++ b/object/fetch/exact_tree_reader.go @@ -14,5 +14,5 @@ import ( // // Labels: Life-Parent, Close-Caller. func (r *Fetcher) ExactTreeReader(id objectid.ObjectID) (io.ReadCloser, int64, error) { - return r.exactReader(id, objecttype.TypeTree, "tree") + return r.exactReader(id, objecttype.TypeTree) } diff --git a/object/fetch/object_errors.go b/object/fetch/object_errors.go new file mode 100644 index 00000000..08de6f75 --- /dev/null +++ b/object/fetch/object_errors.go @@ -0,0 +1,19 @@ +package fetch + +import ( + stderrors "errors" + + giterrors "codeberg.org/lindenii/furgit/errors" + objectid "codeberg.org/lindenii/furgit/object/id" + objectstore "codeberg.org/lindenii/furgit/object/store" +) + +// wrapObjectReadError maps raw object-store lookup failures to fetcher-level +// object lookup errors. +func wrapObjectReadError(id objectid.ObjectID, err error) error { + if stderrors.Is(err, objectstore.ErrObjectNotFound) { + return &giterrors.ObjectMissingError{OID: id} + } + + return err +} diff --git a/object/fetch/object_parse.go b/object/fetch/object_parse.go index 35389ddf..0a61bb3d 100644 --- a/object/fetch/object_parse.go +++ b/object/fetch/object_parse.go @@ -10,7 +10,7 @@ import ( func (r *Fetcher) parseObject(id objectid.ObjectID) (object.Object, error) { ty, content, err := r.store.ReadBytesContent(id) if err != nil { - return nil, err + return nil, wrapObjectReadError(id, err) } parsed, err := object.ParseWithoutHeader(ty, content, id.Algorithm()) diff --git a/object/fetch/peel_to_blob.go b/object/fetch/peel_to_blob.go index eea1487c..adf86495 100644 --- a/object/fetch/peel_to_blob.go +++ b/object/fetch/peel_to_blob.go @@ -1,12 +1,12 @@ package fetch import ( - "fmt" - + giterrors "codeberg.org/lindenii/furgit/errors" "codeberg.org/lindenii/furgit/object/blob" objectid "codeberg.org/lindenii/furgit/object/id" "codeberg.org/lindenii/furgit/object/stored" "codeberg.org/lindenii/furgit/object/tag" + objecttype "codeberg.org/lindenii/furgit/object/type" ) // PeelToBlob peels tags until it reaches a blob. @@ -25,7 +25,7 @@ func (r *Fetcher) PeelToBlob(id objectid.ObjectID) (*stored.Stored[*blob.Blob], case *tag.Tag: id = parsed.Target default: - return nil, fmt.Errorf("object/fetch: expected blob-ish object %s, got %v", id, parsed.ObjectType()) + return nil, &giterrors.ObjectTypeError{OID: id, Got: parsed.ObjectType(), Want: objecttype.TypeBlob} } } } diff --git a/object/fetch/peel_to_blob_id.go b/object/fetch/peel_to_blob_id.go index 9d13f640..5b5da026 100644 --- a/object/fetch/peel_to_blob_id.go +++ b/object/fetch/peel_to_blob_id.go @@ -1,8 +1,7 @@ package fetch import ( - "fmt" - + giterrors "codeberg.org/lindenii/furgit/errors" objectid "codeberg.org/lindenii/furgit/object/id" objecttype "codeberg.org/lindenii/furgit/object/type" ) @@ -12,7 +11,7 @@ func (r *Fetcher) PeelToBlobID(id objectid.ObjectID) (objectid.ObjectID, error) for { ty, _, err := r.store.ReadHeader(id) if err != nil { - return objectid.ObjectID{}, err + return objectid.ObjectID{}, wrapObjectReadError(id, err) } switch ty { @@ -31,9 +30,9 @@ func (r *Fetcher) PeelToBlobID(id objectid.ObjectID) (objectid.ObjectID, error) objecttype.TypeFuture, objecttype.TypeOfsDelta, objecttype.TypeRefDelta: - return objectid.ObjectID{}, fmt.Errorf("object/fetch: expected blob-ish object %s, got %v", id, ty) + return objectid.ObjectID{}, &giterrors.ObjectTypeError{OID: id, Got: ty, Want: objecttype.TypeBlob} default: - return objectid.ObjectID{}, fmt.Errorf("object/fetch: expected blob-ish object %s, got %v", id, ty) + return objectid.ObjectID{}, &giterrors.ObjectTypeError{OID: id, Got: ty, Want: objecttype.TypeBlob} } } } diff --git a/object/fetch/peel_to_commit.go b/object/fetch/peel_to_commit.go index 4a88f6f4..e5fdce2b 100644 --- a/object/fetch/peel_to_commit.go +++ b/object/fetch/peel_to_commit.go @@ -1,12 +1,12 @@ package fetch import ( - "fmt" - + giterrors "codeberg.org/lindenii/furgit/errors" "codeberg.org/lindenii/furgit/object/commit" objectid "codeberg.org/lindenii/furgit/object/id" "codeberg.org/lindenii/furgit/object/stored" "codeberg.org/lindenii/furgit/object/tag" + objecttype "codeberg.org/lindenii/furgit/object/type" ) // PeelToCommit peels tags until it reaches a commit. @@ -25,7 +25,7 @@ func (r *Fetcher) PeelToCommit(id objectid.ObjectID) (*stored.Stored[*commit.Com case *tag.Tag: id = parsed.Target default: - return nil, fmt.Errorf("object/fetch: expected commit-ish object %s, got %v", id, parsed.ObjectType()) + return nil, &giterrors.ObjectTypeError{OID: id, Got: parsed.ObjectType(), Want: objecttype.TypeCommit} } } } diff --git a/object/fetch/peel_to_commit_id.go b/object/fetch/peel_to_commit_id.go index b6b257cf..e5a0766f 100644 --- a/object/fetch/peel_to_commit_id.go +++ b/object/fetch/peel_to_commit_id.go @@ -1,8 +1,7 @@ package fetch import ( - "fmt" - + giterrors "codeberg.org/lindenii/furgit/errors" objectid "codeberg.org/lindenii/furgit/object/id" objecttype "codeberg.org/lindenii/furgit/object/type" ) @@ -12,7 +11,7 @@ func (r *Fetcher) PeelToCommitID(id objectid.ObjectID) (objectid.ObjectID, error for { ty, _, err := r.store.ReadHeader(id) if err != nil { - return objectid.ObjectID{}, err + return objectid.ObjectID{}, wrapObjectReadError(id, err) } switch ty { @@ -31,9 +30,9 @@ func (r *Fetcher) PeelToCommitID(id objectid.ObjectID) (objectid.ObjectID, error objecttype.TypeFuture, objecttype.TypeOfsDelta, objecttype.TypeRefDelta: - return objectid.ObjectID{}, fmt.Errorf("object/fetch: expected commit-ish object %s, got %v", id, ty) + return objectid.ObjectID{}, &giterrors.ObjectTypeError{OID: id, Got: ty, Want: objecttype.TypeCommit} default: - return objectid.ObjectID{}, fmt.Errorf("object/fetch: expected commit-ish object %s, got %v", id, ty) + return objectid.ObjectID{}, &giterrors.ObjectTypeError{OID: id, Got: ty, Want: objecttype.TypeCommit} } } } diff --git a/object/fetch/peel_to_tree.go b/object/fetch/peel_to_tree.go index 5446eac0..adc87e6b 100644 --- a/object/fetch/peel_to_tree.go +++ b/object/fetch/peel_to_tree.go @@ -1,13 +1,13 @@ package fetch import ( - "fmt" - + giterrors "codeberg.org/lindenii/furgit/errors" "codeberg.org/lindenii/furgit/object/commit" objectid "codeberg.org/lindenii/furgit/object/id" "codeberg.org/lindenii/furgit/object/stored" "codeberg.org/lindenii/furgit/object/tag" "codeberg.org/lindenii/furgit/object/tree" + objecttype "codeberg.org/lindenii/furgit/object/type" ) // PeelToTree peels tags until it reaches a tree or commit. If it reaches a @@ -29,7 +29,7 @@ func (r *Fetcher) PeelToTree(id objectid.ObjectID) (*stored.Stored[*tree.Tree], case *tag.Tag: id = parsed.Target default: - return nil, fmt.Errorf("object/fetch: expected tree-ish object %s, got %v", id, parsed.ObjectType()) + return nil, &giterrors.ObjectTypeError{OID: id, Got: parsed.ObjectType(), Want: objecttype.TypeTree} } } } diff --git a/object/fetch/peel_to_tree_id.go b/object/fetch/peel_to_tree_id.go index 21dcfde4..5f951c04 100644 --- a/object/fetch/peel_to_tree_id.go +++ b/object/fetch/peel_to_tree_id.go @@ -1,8 +1,7 @@ package fetch import ( - "fmt" - + giterrors "codeberg.org/lindenii/furgit/errors" objectid "codeberg.org/lindenii/furgit/object/id" objecttype "codeberg.org/lindenii/furgit/object/type" ) @@ -13,7 +12,7 @@ func (r *Fetcher) PeelToTreeID(id objectid.ObjectID) (objectid.ObjectID, error) for { ty, _, err := r.store.ReadHeader(id) if err != nil { - return objectid.ObjectID{}, err + return objectid.ObjectID{}, wrapObjectReadError(id, err) } switch ty { @@ -38,9 +37,9 @@ func (r *Fetcher) PeelToTreeID(id objectid.ObjectID) (objectid.ObjectID, error) objecttype.TypeFuture, objecttype.TypeOfsDelta, objecttype.TypeRefDelta: - return objectid.ObjectID{}, fmt.Errorf("object/fetch: expected tree-ish object %s, got %v", id, ty) + return objectid.ObjectID{}, &giterrors.ObjectTypeError{OID: id, Got: ty, Want: objecttype.TypeTree} default: - return objectid.ObjectID{}, fmt.Errorf("object/fetch: expected tree-ish object %s, got %v", id, ty) + return objectid.ObjectID{}, &giterrors.ObjectTypeError{OID: id, Got: ty, Want: objecttype.TypeTree} } } } -- cgit v1.3.1-10-gc9f91