ref: ad880cd26c9a6e4739d9ced8c5a076bccaceb999
parent: 6cff7528ae38a286fb56978a8d8f283ef342dfcb
author: Runxi Yu <runxiyu@umich.edu>
date: Sun Mar 29 09:31:16 EDT 2026
cmd/show-object: Split files
--- a/cmd/show-object/main.go
+++ b/cmd/show-object/main.go
@@ -3,19 +3,7 @@
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() {@@ -32,115 +20,4 @@
if err != nil { 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())
}
--- /dev/null
+++ b/cmd/show-object/print.go
@@ -1,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())
+}
--- /dev/null
+++ b/cmd/show-object/resolve.go
@@ -1,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
+}
--- /dev/null
+++ b/cmd/show-object/run.go
@@ -1,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
+}
--
⑨