diff options
Diffstat (limited to 'repository')
| -rw-r--r-- | repository/stored.go | 87 | ||||
| -rw-r--r-- | repository/stored_test.go | 14 | ||||
| -rw-r--r-- | repository/tree.go | 4 |
3 files changed, 33 insertions, 72 deletions
diff --git a/repository/stored.go b/repository/stored.go index ca782cea..92a3f0ad 100644 --- a/repository/stored.go +++ b/repository/stored.go @@ -10,86 +10,33 @@ import ( ) // ReadStored reads, parses, and wraps one object by ID. -// -//nolint:ireturn -func (repo *Repository) ReadStored(id objectid.ObjectID) (stored.StoredObject, error) { +func (repo *Repository) ReadStored(id objectid.ObjectID) (*stored.Stored[object.Object], error) { parsed, err := repo.readParsedObject(id) if err != nil { return nil, err } - switch parsed := parsed.(type) { - case *object.Blob: - return stored.NewStoredBlob(id, parsed), nil - case *object.Tree: - return stored.NewStoredTree(id, parsed), nil - case *object.Commit: - return stored.NewStoredCommit(id, parsed), nil - case *object.Tag: - return stored.NewStoredTag(id, parsed), nil - default: - return nil, fmt.Errorf("repository: unsupported parsed object type %T", parsed) - } + return stored.New(id, parsed), nil } // ReadStoredBlob reads and parses a blob object by ID. -func (repo *Repository) ReadStoredBlob(id objectid.ObjectID) (*stored.StoredBlob, error) { - s, err := repo.ReadStored(id) - if err != nil { - return nil, err - } - - blob, ok := s.(*stored.StoredBlob) - if !ok { - return nil, fmt.Errorf("repository: expected blob object %s, got %v", id, s.Object().ObjectType()) - } - - return blob, nil +func (repo *Repository) ReadStoredBlob(id objectid.ObjectID) (*stored.Stored[*object.Blob], error) { + return readStoredAs[*object.Blob](repo, id) } // ReadStoredTree reads and parses a tree object by ID. -func (repo *Repository) ReadStoredTree(id objectid.ObjectID) (*stored.StoredTree, error) { - s, err := repo.ReadStored(id) - if err != nil { - return nil, err - } - - tree, ok := s.(*stored.StoredTree) - if !ok { - return nil, fmt.Errorf("repository: expected tree object %s, got %v", id, s.Object().ObjectType()) - } - - return tree, nil +func (repo *Repository) ReadStoredTree(id objectid.ObjectID) (*stored.Stored[*object.Tree], error) { + return readStoredAs[*object.Tree](repo, id) } // ReadStoredCommit reads and parses a commit object by ID. -func (repo *Repository) ReadStoredCommit(id objectid.ObjectID) (*stored.StoredCommit, error) { - s, err := repo.ReadStored(id) - if err != nil { - return nil, err - } - - commit, ok := s.(*stored.StoredCommit) - if !ok { - return nil, fmt.Errorf("repository: expected commit object %s, got %v", id, s.Object().ObjectType()) - } - - return commit, nil +func (repo *Repository) ReadStoredCommit(id objectid.ObjectID) (*stored.Stored[*object.Commit], error) { + return readStoredAs[*object.Commit](repo, id) } // ReadStoredTag reads and parses a tag object by ID. -func (repo *Repository) ReadStoredTag(id objectid.ObjectID) (*stored.StoredTag, error) { - s, err := repo.ReadStored(id) - if err != nil { - return nil, err - } - - tag, ok := s.(*stored.StoredTag) - if !ok { - return nil, fmt.Errorf("repository: expected tag object %s, got %v", id, s.Object().ObjectType()) - } - - return tag, nil +func (repo *Repository) ReadStoredTag(id objectid.ObjectID) (*stored.Stored[*object.Tag], error) { + return readStoredAs[*object.Tag](repo, id) } // readParsedObject reads bytes content from storage and parses one object. @@ -113,3 +60,17 @@ func (repo *Repository) readParsedObject(id objectid.ObjectID) (object.Object, e return parsed, nil } + +func readStoredAs[T object.Object](repo *Repository, id objectid.ObjectID) (*stored.Stored[T], error) { + parsed, err := repo.readParsedObject(id) + if err != nil { + return nil, err + } + + typed, ok := parsed.(T) + if !ok { + return nil, fmt.Errorf("repository: expected %T object %s, got %v", *new(T), id, parsed.ObjectType()) + } + + return stored.New(id, typed), nil +} diff --git a/repository/stored_test.go b/repository/stored_test.go index cefb4cbe..fdae3f5a 100644 --- a/repository/stored_test.go +++ b/repository/stored_test.go @@ -33,8 +33,8 @@ func TestReadStoredTyped(t *testing.T) { t.Fatalf("blob ID = %s, want %s", blob.ID(), blobID) } - if string(blob.Blob().Data) != "commit-body\n" { - t.Fatalf("blob body = %q, want %q", blob.Blob().Data, "commit-body\n") + if string(blob.Object().Data) != "commit-body\n" { + t.Fatalf("blob body = %q, want %q", blob.Object().Data, "commit-body\n") } tree, err := repo.ReadStoredTree(treeID) @@ -46,8 +46,8 @@ func TestReadStoredTyped(t *testing.T) { t.Fatalf("tree ID = %s, want %s", tree.ID(), treeID) } - if len(tree.Tree().Entries) != 1 { - t.Fatalf("tree entries = %d, want 1", len(tree.Tree().Entries)) + if len(tree.Object().Entries) != 1 { + t.Fatalf("tree entries = %d, want 1", len(tree.Object().Entries)) } commit, err := repo.ReadStoredCommit(commitID) @@ -59,8 +59,8 @@ func TestReadStoredTyped(t *testing.T) { t.Fatalf("commit ID = %s, want %s", commit.ID(), commitID) } - if commit.Commit().Tree != treeID { - t.Fatalf("commit tree = %s, want %s", commit.Commit().Tree, treeID) + if commit.Object().Tree != treeID { + t.Fatalf("commit tree = %s, want %s", commit.Object().Tree, treeID) } }) } @@ -240,7 +240,7 @@ func TestReadStoredTreeMixedModes(t *testing.T) { } for name, wantMode := range expect { - entry := rootTree.Tree().Entry([]byte(name)) + entry := rootTree.Object().Entry([]byte(name)) if entry == nil { t.Fatalf("Entry(%q) returned nil", name) diff --git a/repository/tree.go b/repository/tree.go index ce3e96e4..c9d635ad 100644 --- a/repository/tree.go +++ b/repository/tree.go @@ -12,7 +12,7 @@ import ( // // parts must contain at least one path segment. Intermediate segments must be // tree entries. -func (repo *Repository) ResolveTreeEntry(tree *stored.StoredTree, parts [][]byte) (object.TreeEntry, error) { +func (repo *Repository) ResolveTreeEntry(tree *stored.Stored[*object.Tree], parts [][]byte) (object.TreeEntry, error) { if tree == nil { return object.TreeEntry{}, errors.New("repository: nil root tree") } @@ -28,7 +28,7 @@ func (repo *Repository) ResolveTreeEntry(tree *stored.StoredTree, parts [][]byte return object.TreeEntry{}, errors.New("repository: empty tree path segment") } - entry := current.Tree().Entry(part) + entry := current.Object().Entry(part) if entry == nil { return object.TreeEntry{}, fmt.Errorf("repository: tree entry %q not found", part) } |
