From ad880cd26c9a6e4739d9ced8c5a076bccaceb999 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 29 Mar 2026 13:31:16 +0000 Subject: cmd/show-object: Split files --- cmd/show-object/main.go | 123 --------------------------------------------- cmd/show-object/print.go | 74 +++++++++++++++++++++++++++ cmd/show-object/resolve.go | 22 ++++++++ cmd/show-object/run.go | 45 +++++++++++++++++ 4 files changed, 141 insertions(+), 123 deletions(-) create mode 100644 cmd/show-object/print.go create mode 100644 cmd/show-object/resolve.go create mode 100644 cmd/show-object/run.go diff --git a/cmd/show-object/main.go b/cmd/show-object/main.go index b254ad52..8fdffac8 100644 --- a/cmd/show-object/main.go +++ b/cmd/show-object/main.go @@ -3,19 +3,7 @@ package main import ( "flag" - "fmt" "log" - "os" - "strings" - - "codeberg.org/lindenii/furgit/object" - "codeberg.org/lindenii/furgit/object/blob" - "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" - "codeberg.org/lindenii/furgit/repository" ) func main() { @@ -33,114 +21,3 @@ func main() { log.Fatalf("run: %v", err) } } - -func run(repoPath, name *string) error { - root, err := os.OpenRoot(*repoPath) - if err != nil { - return fmt.Errorf("open repo root: %w", err) - } - - defer func() { _ = root.Close() }() - - repo, err := repository.Open(root) - if err != nil { - return fmt.Errorf("open repository: %w", err) - } - - id, err := resolveInput(repo, *name) - if err != nil { - _ = repo.Close() - - return fmt.Errorf("resolve %q: %w", *name, err) - } - - s, err := repo.Fetcher().ExactObject(id) - if err != nil { - _ = repo.Close() - - return fmt.Errorf("read object %s: %w", id, err) - } - - printStored(s) - - err = repo.Close() - if err != nil { - return fmt.Errorf("close repository: %w", err) - } - - return nil -} - -func resolveInput(repo *repository.Repository, input string) (objectid.ObjectID, error) { - id, err := objectid.ParseHex(repo.Algorithm(), strings.TrimSpace(input)) - if err == nil { - return id, nil - } - - resolved, err := repo.Refs().ResolveToDetached(input) - if err != nil { - return objectid.ObjectID{}, err - } - - return resolved.ID, nil -} - -func printStored(s *stored.Stored[object.Object]) { - var b strings.Builder - - id := s.ID() - ty := s.Object().ObjectType() - - tyName, ok := ty.Name() - if !ok { - tyName = fmt.Sprintf("type %d", ty) - } - - fmt.Fprintf(&b, "id: %s\n", id) - fmt.Fprintf(&b, "type: %s\n", tyName) - - switch obj := s.Object().(type) { - case *blob.Blob: - blob := obj - fmt.Fprintf(&b, "size: %d\n", len(blob.Data)) - fmt.Fprintf(&b, "data: %q\n", string(blob.Data)) - case *tree.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 *commit.Commit: - commit := obj - fmt.Fprintf(&b, "tree: %s\n", commit.Tree) - - for _, parent := range commit.Parents { - fmt.Fprintf(&b, "parent: %s\n", parent) - } - - 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 *tag.Tag: - tag := obj - - targetTy, ok := tag.TargetType.Name() - if !ok { - targetTy = fmt.Sprintf("type %d", tag.TargetType) - } - - fmt.Fprintf(&b, "target: %s (%s)\n", tag.Target, targetTy) - fmt.Fprintf(&b, "name: %s\n", tag.Name) - - if tag.Tagger != nil { - fmt.Fprintf(&b, "tagger: %s <%s>\n", tag.Tagger.Name, tag.Tagger.Email) - } - - fmt.Fprintf(&b, "message:\n%s\n", string(tag.Message)) - default: - fmt.Fprintf(&b, "%#v\n", obj) - } - - _, _ = os.Stdout.WriteString(b.String()) -} diff --git a/cmd/show-object/print.go b/cmd/show-object/print.go new file mode 100644 index 00000000..75484f73 --- /dev/null +++ b/cmd/show-object/print.go @@ -0,0 +1,74 @@ +package main + +import ( + "fmt" + "os" + "strings" + + "codeberg.org/lindenii/furgit/object" + "codeberg.org/lindenii/furgit/object/blob" + "codeberg.org/lindenii/furgit/object/commit" + "codeberg.org/lindenii/furgit/object/stored" + "codeberg.org/lindenii/furgit/object/tag" + "codeberg.org/lindenii/furgit/object/tree" +) + +func printStored(s *stored.Stored[object.Object]) { + var b strings.Builder + + id := s.ID() + ty := s.Object().ObjectType() + + tyName, ok := ty.Name() + if !ok { + tyName = fmt.Sprintf("type %d", ty) + } + + fmt.Fprintf(&b, "id: %s\n", id) + fmt.Fprintf(&b, "type: %s\n", tyName) + + switch obj := s.Object().(type) { + case *blob.Blob: + blob := obj + fmt.Fprintf(&b, "size: %d\n", len(blob.Data)) + fmt.Fprintf(&b, "data: %q\n", string(blob.Data)) + case *tree.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 *commit.Commit: + commit := obj + fmt.Fprintf(&b, "tree: %s\n", commit.Tree) + + for _, parent := range commit.Parents { + fmt.Fprintf(&b, "parent: %s\n", parent) + } + + 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 *tag.Tag: + tag := obj + + targetTy, ok := tag.TargetType.Name() + if !ok { + targetTy = fmt.Sprintf("type %d", tag.TargetType) + } + + fmt.Fprintf(&b, "target: %s (%s)\n", tag.Target, targetTy) + fmt.Fprintf(&b, "name: %s\n", tag.Name) + + if tag.Tagger != nil { + fmt.Fprintf(&b, "tagger: %s <%s>\n", tag.Tagger.Name, tag.Tagger.Email) + } + + fmt.Fprintf(&b, "message:\n%s\n", string(tag.Message)) + default: + fmt.Fprintf(&b, "%#v\n", obj) + } + + _, _ = os.Stdout.WriteString(b.String()) +} diff --git a/cmd/show-object/resolve.go b/cmd/show-object/resolve.go new file mode 100644 index 00000000..eaf2c102 --- /dev/null +++ b/cmd/show-object/resolve.go @@ -0,0 +1,22 @@ +package main + +import ( + "strings" + + objectid "codeberg.org/lindenii/furgit/object/id" + "codeberg.org/lindenii/furgit/repository" +) + +func resolveInput(repo *repository.Repository, input string) (objectid.ObjectID, error) { + id, err := objectid.ParseHex(repo.Algorithm(), strings.TrimSpace(input)) + if err == nil { + return id, nil + } + + resolved, err := repo.Refs().ResolveToDetached(input) + if err != nil { + return objectid.ObjectID{}, err + } + + return resolved.ID, nil +} diff --git a/cmd/show-object/run.go b/cmd/show-object/run.go new file mode 100644 index 00000000..f1a6fc6d --- /dev/null +++ b/cmd/show-object/run.go @@ -0,0 +1,45 @@ +package main + +import ( + "fmt" + "os" + + "codeberg.org/lindenii/furgit/repository" +) + +func run(repoPath, name *string) error { + root, err := os.OpenRoot(*repoPath) + if err != nil { + return fmt.Errorf("open repo root: %w", err) + } + + defer func() { _ = root.Close() }() + + repo, err := repository.Open(root) + if err != nil { + return fmt.Errorf("open repository: %w", err) + } + + id, err := resolveInput(repo, *name) + if err != nil { + _ = repo.Close() + + return fmt.Errorf("resolve %q: %w", *name, err) + } + + s, err := repo.Fetcher().ExactObject(id) + if err != nil { + _ = repo.Close() + + return fmt.Errorf("read object %s: %w", id, err) + } + + printStored(s) + + err = repo.Close() + if err != nil { + return fmt.Errorf("close repository: %w", err) + } + + return nil +} -- cgit v1.3.1-10-gc9f91