aboutsummaryrefslogtreecommitdiff
path: root/cmd/index-pack/run.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-29 13:29:01 +0000
committerGravatar Runxi Yu2026-03-29 13:29:01 +0000
commit101fe6a0d74543bab7cb9876e3bea1f2d21a592a (patch)
treef52a89190764cf22cf1accf783f0235181e4cd84 /cmd/index-pack/run.go
parentformat/commitgraph: Trim redundant MT-Safe's (diff)
signatureNo signature
cmd/index-pack: Split files
Diffstat (limited to 'cmd/index-pack/run.go')
-rw-r--r--cmd/index-pack/run.go95
1 files changed, 95 insertions, 0 deletions
diff --git a/cmd/index-pack/run.go b/cmd/index-pack/run.go
new file mode 100644
index 00000000..80e1db25
--- /dev/null
+++ b/cmd/index-pack/run.go
@@ -0,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
+}