diff options
| author | 2026-03-04 08:26:56 +0800 | |
|---|---|---|
| committer | 2026-03-04 08:59:53 +0800 | |
| commit | ab7501be34032fb9e5c48726a68ae90a917af9eb (patch) | |
| tree | 20d005647569befea8133e953c3270e8fd2a2a5b /cmd/show-object | |
| parent | *: gofumpt (diff) | |
| signature | No signature | |
*: Lint
Diffstat (limited to 'cmd/show-object')
| -rw-r--r-- | cmd/show-object/main.go | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/cmd/show-object/main.go b/cmd/show-object/main.go index 6d27ffad..b3f5a9cd 100644 --- a/cmd/show-object/main.go +++ b/cmd/show-object/main.go @@ -16,13 +16,15 @@ import ( func main() { repoPath := flag.String("r", "", "path to git dir (.git or bare repo root)") name := flag.String("h", "", "reference name or object id") + flag.Parse() if *repoPath == "" || *name == "" { log.Fatal("must provide -r <repo> and -h <ref-or-object-id>") } - if err := run(repoPath, name); err != nil { + err := run(repoPath, name) + if err != nil { log.Fatalf("run: %v", err) } } @@ -32,6 +34,7 @@ func run(repoPath, name *string) error { if err != nil { return fmt.Errorf("open repo root: %w", err) } + defer func() { _ = root.Close() }() repo, err := repository.Open(root) @@ -42,17 +45,21 @@ func run(repoPath, name *string) error { id, err := resolveInput(repo, *name) if err != nil { _ = repo.Close() + return fmt.Errorf("resolve %q: %w", *name, err) } stored, err := repo.ReadStored(id) if err != nil { _ = repo.Close() + return fmt.Errorf("read object %s: %w", id, err) } printStored(stored) - if err := repo.Close(); err != nil { + + err = repo.Close() + if err != nil { return fmt.Errorf("close repository: %w", err) } @@ -60,13 +67,16 @@ func run(repoPath, name *string) error { } func resolveInput(repo *repository.Repository, input string) (objectid.ObjectID, error) { - if id, err := objectid.ParseHex(repo.Algorithm(), strings.TrimSpace(input)); err == nil { + id, err := objectid.ParseHex(repo.Algorithm(), strings.TrimSpace(input)) + if err == nil { return id, nil } + resolved, err := repo.Refs().ResolveFully(input) if err != nil { return objectid.ObjectID{}, err } + return resolved.ID, nil } @@ -75,10 +85,12 @@ func printStored(stored objectstored.StoredObject) { id := stored.ID() ty := stored.Object().ObjectType() + tyName, ok := objecttype.Name(ty) if !ok { tyName = fmt.Sprintf("type %d", ty) } + fmt.Fprintf(&b, "id: %s\n", id) fmt.Fprintf(&b, "type: %s\n", tyName) @@ -90,29 +102,36 @@ func printStored(stored objectstored.StoredObject) { case *objectstored.StoredTree: tree := stored.Tree() 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 *objectstored.StoredCommit: commit := stored.Commit() 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 *objectstored.StoredTag: tag := stored.Tag() + targetTy, ok := objecttype.Name(tag.TargetType) 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", stored.Object()) |
