aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-04 08:26:56 +0800
committerGravatar Runxi Yu2026-03-04 08:59:53 +0800
commitab7501be34032fb9e5c48726a68ae90a917af9eb (patch)
tree20d005647569befea8133e953c3270e8fd2a2a5b /cmd
parent*: gofumpt (diff)
signatureNo signature
*: Lint
Diffstat (limited to 'cmd')
-rw-r--r--cmd/show-object/main.go25
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())