diff options
| -rw-r--r-- | cmd/show-object/main.go | 23 | ||||
| -rw-r--r-- | repository/stored.go | 87 | ||||
| -rw-r--r-- | repository/stored_test.go | 14 | ||||
| -rw-r--r-- | repository/tree.go | 4 |
4 files changed, 45 insertions, 83 deletions
diff --git a/cmd/show-object/main.go b/cmd/show-object/main.go index e92fa472..f8947384 100644 --- a/cmd/show-object/main.go +++ b/cmd/show-object/main.go @@ -8,6 +8,7 @@ import ( "os" "strings" + "codeberg.org/lindenii/furgit/object" "codeberg.org/lindenii/furgit/object/stored" "codeberg.org/lindenii/furgit/objectid" "codeberg.org/lindenii/furgit/objecttype" @@ -81,7 +82,7 @@ func resolveInput(repo *repository.Repository, input string) (objectid.ObjectID, return resolved.ID, nil } -func printStored(s stored.StoredObject) { +func printStored(s *stored.Stored[object.Object]) { var b strings.Builder id := s.ID() @@ -95,20 +96,20 @@ func printStored(s stored.StoredObject) { fmt.Fprintf(&b, "id: %s\n", id) fmt.Fprintf(&b, "type: %s\n", tyName) - switch s := s.(type) { - case *stored.StoredBlob: - blob := s.Blob() + switch obj := s.Object().(type) { + case *object.Blob: + blob := obj fmt.Fprintf(&b, "size: %d\n", len(blob.Data)) fmt.Fprintf(&b, "data: %q\n", string(blob.Data)) - case *stored.StoredTree: - tree := s.Tree() + case *object.Tree: + tree := obj fmt.Fprintf(&b, "entries: %d\n", len(tree.Entries)) for _, entry := range tree.Entries { fmt.Fprintf(&b, "%06o %s\t%s\n", entry.Mode, entry.ID, entry.Name) } - case *stored.StoredCommit: - commit := s.Commit() + case *object.Commit: + commit := obj fmt.Fprintf(&b, "tree: %s\n", commit.Tree) for _, parent := range commit.Parents { @@ -118,8 +119,8 @@ func printStored(s stored.StoredObject) { fmt.Fprintf(&b, "author: %s <%s>\n", commit.Author.Name, commit.Author.Email) fmt.Fprintf(&b, "committer: %s <%s>\n", commit.Committer.Name, commit.Committer.Email) fmt.Fprintf(&b, "message:\n%s\n", string(commit.Message)) - case *stored.StoredTag: - tag := s.Tag() + case *object.Tag: + tag := obj targetTy, ok := objecttype.Name(tag.TargetType) if !ok { @@ -135,7 +136,7 @@ func printStored(s stored.StoredObject) { fmt.Fprintf(&b, "message:\n%s\n", string(tag.Message)) default: - fmt.Fprintf(&b, "%#v\n", s.Object()) + fmt.Fprintf(&b, "%#v\n", obj) } _, _ = os.Stdout.WriteString(b.String()) 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) } |
