ref: 101fe6a0d74543bab7cb9876e3bea1f2d21a592a
parent: abce6092bf50a1878934e2b442c6781e6aff3fca
author: Runxi Yu <runxiyu@umich.edu>
date: Sun Mar 29 09:29:01 EDT 2026
cmd/index-pack: Split files
--- /dev/null
+++ b/cmd/index-pack/algorithm.go
@@ -1,0 +1,25 @@
+package main
+
+import (
+ "fmt"
+
+ objectid "codeberg.org/lindenii/furgit/object/id"
+ "codeberg.org/lindenii/furgit/repository"
+)
+
+func resolveAlgorithm(repo *repository.Repository, objectFormat string) (objectid.Algorithm, error) {+ if objectFormat != "" {+ algo, ok := objectid.ParseAlgorithm(objectFormat)
+ if !ok {+ return objectid.AlgorithmUnknown, fmt.Errorf("invalid object format %q", objectFormat)+ }
+
+ return algo, nil
+ }
+
+ if repo != nil {+ return repo.Algorithm(), nil
+ }
+
+ return objectid.AlgorithmSHA1, nil
+}
--- a/cmd/index-pack/main.go
+++ b/cmd/index-pack/main.go
@@ -3,15 +3,7 @@
import (
"flag"
- "fmt"
"log"
- "os"
- "path/filepath"
-
- "codeberg.org/lindenii/furgit/format/packfile/ingest"
- objectid "codeberg.org/lindenii/furgit/object/id"
- objectstore "codeberg.org/lindenii/furgit/object/store"
- "codeberg.org/lindenii/furgit/repository"
)
func main() {@@ -31,104 +23,4 @@
if err != nil { log.Fatalf("run: %v", err)}
-}
-
-func run(repoPath, destinationPath, objectFormat string, fixThin, writeRev bool) error {- var (
- algo objectid.Algorithm
- base objectstore.ReadingStore
- repo *repository.Repository
- )
-
- if repoPath != "" {- repoRoot, err := os.OpenRoot(repoPath)
- if err != nil {- return fmt.Errorf("open repo root: %w", err)- }
-
- defer func() { _ = repoRoot.Close() }()-
- repo, err = repository.Open(repoRoot)
- if err != nil {- return fmt.Errorf("open repository: %w", err)- }
-
- defer func() { _ = repo.Close() }()- }
-
- algo, err := resolveAlgorithm(repo, objectFormat)
- if err != nil {- return err
- }
-
- if fixThin {- if repo == nil {- return fmt.Errorf("fix-thin requires -r <repo>")- }
-
- if repo.Algorithm() != algo {- return fmt.Errorf("algorithm mismatch: repo=%s flag=%s", repo.Algorithm(), algo)- }
-
- base = repo.Objects()
- }
-
- absDestination, err := filepath.Abs(destinationPath)
- if err != nil {- return fmt.Errorf("absolute destination path: %w", err)- }
-
- destinationRoot, err := os.OpenRoot(absDestination)
- if err != nil {- return fmt.Errorf("open destination root: %w", err)- }
-
- defer func() { _ = destinationRoot.Close() }()-
- pending, err := ingest.Ingest(os.Stdin, algo, ingest.Options{- FixThin: fixThin,
- WriteRev: writeRev,
- Base: base,
- RequireTrailingEOF: true,
- })
- if err != nil {- return err
- }
-
- if pending.Header().ObjectCount == 0 {- discarded, err := pending.Discard()
- if err != nil {- return err
- }
-
- _, _ = fmt.Fprintf(os.Stdout, "pack\t%s\n", discarded.PackHash.String())
-
- return nil
- }
-
- result, err := pending.Continue(destinationRoot)
- if err != nil {- return err
- }
-
- _, _ = fmt.Fprintf(os.Stdout, "pack\t%s\n", result.PackHash.String())
-
- return nil
-}
-
-func resolveAlgorithm(repo *repository.Repository, objectFormat string) (objectid.Algorithm, error) {- if objectFormat != "" {- algo, ok := objectid.ParseAlgorithm(objectFormat)
- if !ok {- return objectid.AlgorithmUnknown, fmt.Errorf("invalid object format %q", objectFormat)- }
-
- return algo, nil
- }
-
- if repo != nil {- return repo.Algorithm(), nil
- }
-
- return objectid.AlgorithmSHA1, nil
}
--- /dev/null
+++ b/cmd/index-pack/run.go
@@ -1,0 +1,95 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "codeberg.org/lindenii/furgit/format/packfile/ingest"
+ objectid "codeberg.org/lindenii/furgit/object/id"
+ objectstore "codeberg.org/lindenii/furgit/object/store"
+ "codeberg.org/lindenii/furgit/repository"
+)
+
+func run(repoPath, destinationPath, objectFormat string, fixThin, writeRev bool) error {+ var (
+ algo objectid.Algorithm
+ base objectstore.ReadingStore
+ repo *repository.Repository
+ )
+
+ if repoPath != "" {+ repoRoot, err := os.OpenRoot(repoPath)
+ if err != nil {+ return fmt.Errorf("open repo root: %w", err)+ }
+
+ defer func() { _ = repoRoot.Close() }()+
+ repo, err = repository.Open(repoRoot)
+ if err != nil {+ return fmt.Errorf("open repository: %w", err)+ }
+
+ defer func() { _ = repo.Close() }()+ }
+
+ algo, err := resolveAlgorithm(repo, objectFormat)
+ if err != nil {+ return err
+ }
+
+ if fixThin {+ if repo == nil {+ return fmt.Errorf("fix-thin requires -r <repo>")+ }
+
+ if repo.Algorithm() != algo {+ return fmt.Errorf("algorithm mismatch: repo=%s flag=%s", repo.Algorithm(), algo)+ }
+
+ base = repo.Objects()
+ }
+
+ absDestination, err := filepath.Abs(destinationPath)
+ if err != nil {+ return fmt.Errorf("absolute destination path: %w", err)+ }
+
+ destinationRoot, err := os.OpenRoot(absDestination)
+ if err != nil {+ return fmt.Errorf("open destination root: %w", err)+ }
+
+ defer func() { _ = destinationRoot.Close() }()+
+ pending, err := ingest.Ingest(os.Stdin, algo, ingest.Options{+ FixThin: fixThin,
+ WriteRev: writeRev,
+ Base: base,
+ RequireTrailingEOF: true,
+ })
+ if err != nil {+ return err
+ }
+
+ if pending.Header().ObjectCount == 0 {+ discarded, err := pending.Discard()
+ if err != nil {+ return err
+ }
+
+ _, _ = fmt.Fprintf(os.Stdout, "pack\t%s\n", discarded.PackHash.String())
+
+ return nil
+ }
+
+ result, err := pending.Continue(destinationRoot)
+ if err != nil {+ return err
+ }
+
+ _, _ = fmt.Fprintf(os.Stdout, "pack\t%s\n", result.PackHash.String())
+
+ return nil
+}
--
⑨