aboutsummaryrefslogtreecommitdiff
path: root/internal/testgit/tree.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-06-07 07:05:48 +0000
committerGravatar Runxi Yu2026-06-07 07:05:48 +0000
commit5893630f4aecf5365f953a161d5133f128374aff (patch)
treeb26a52ad56406b8ef088cd24634f64ed599fea21 /internal/testgit/tree.go
parentUnify rules around errors.go or not (diff)
internal/testgit: Add helpers to prepare for commit testing
Diffstat (limited to 'internal/testgit/tree.go')
-rw-r--r--internal/testgit/tree.go41
1 files changed, 41 insertions, 0 deletions
diff --git a/internal/testgit/tree.go b/internal/testgit/tree.go
new file mode 100644
index 00000000..3f80d1c3
--- /dev/null
+++ b/internal/testgit/tree.go
@@ -0,0 +1,41 @@
+package testgit
+
+import (
+ "bytes"
+ "fmt"
+ "strings"
+ "testing"
+
+ "lindenii.org/go/furgit/object/id"
+ "lindenii.org/go/furgit/object/typ"
+)
+
+// MkTreeEntry is one entry of a tree built by [Repo.MkTree].
+type MkTreeEntry struct {
+ Mode string
+ Type typ.Type
+ OID id.ObjectID
+ Name string
+}
+
+// MkTree builds a tree object from entries and returns its object ID.
+func (repo *Repo) MkTree(tb testing.TB, entries []MkTreeEntry) (id.ObjectID, error) {
+ tb.Helper()
+
+ var stdin bytes.Buffer
+ for _, entry := range entries {
+ fmt.Fprintf(&stdin, "%s %s %s\t%s\n", entry.Mode, entry.Type.Name(), entry.OID.String(), entry.Name)
+ }
+
+ stdout, err := repo.Run(tb, &stdin, "git", "mktree")
+ if err != nil {
+ return id.ObjectID{}, fmt.Errorf("mktree: %w", err)
+ }
+
+ treeID, err := repo.objectFormat.FromString(strings.TrimSuffix(string(stdout), "\n"))
+ if err != nil {
+ return id.ObjectID{}, fmt.Errorf("parse git mktree output %q: %w", string(stdout), err)
+ }
+
+ return treeID, nil
+}