shithub: furgit

Download patch

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
+}
--