From 5893630f4aecf5365f953a161d5133f128374aff Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 7 Jun 2026 07:05:48 +0000 Subject: internal/testgit: Add helpers to prepare for commit testing --- internal/testgit/tree.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 internal/testgit/tree.go (limited to 'internal/testgit/tree.go') 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 +} -- cgit v1.3.1-10-gc9f91