aboutsummaryrefslogtreecommitdiff
path: root/internal/testgit
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-06-07 11:20:08 +0000
committerGravatar Runxi Yu2026-06-07 11:20:08 +0000
commit37874d1a93ad09a24076ec7535154db3924c1a6a (patch)
treee9c22e2b84f9cd11ec42fd30b73b328988c87dff /internal/testgit
parentinternal/testgit: MkTreeEntry -> TreeEntry (diff)
signatureNo signature
internal/testgit: LsTree
Diffstat (limited to 'internal/testgit')
-rw-r--r--internal/testgit/tree.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/internal/testgit/tree.go b/internal/testgit/tree.go
index 77bea568..cf6ab1bf 100644
--- a/internal/testgit/tree.go
+++ b/internal/testgit/tree.go
@@ -40,3 +40,50 @@ func (repo *Repo) MkTree(tb testing.TB, entries []TreeEntry) (id.ObjectID, error
return treeID, nil
}
+
+// LsTree lists the top-level entries of a tree object in Git tree order.
+func (repo *Repo) LsTree(tb testing.TB, oid id.ObjectID) ([]TreeEntry, error) {
+ tb.Helper()
+
+ stdout, err := repo.run(tb, nil, "git", "ls-tree", "-z", "--full-tree", "--end-of-options", oid.String())
+ if err != nil {
+ return nil, fmt.Errorf("ls-tree: %w", err)
+ }
+
+ var entries []TreeEntry
+
+ for _, record := range bytes.Split(stdout, []byte{0}) {
+ if len(record) == 0 {
+ continue
+ }
+
+ meta, name, found := bytes.Cut(record, []byte{'\t'})
+ if !found {
+ return nil, fmt.Errorf("ls-tree: record %q has no tab separator", record)
+ }
+
+ fields := bytes.SplitN(meta, []byte{' '}, 3)
+ if len(fields) != 3 {
+ return nil, fmt.Errorf("ls-tree: record %q has malformed metadata", record)
+ }
+
+ ty, err := typ.Parse(string(fields[1]))
+ if err != nil {
+ return nil, fmt.Errorf("ls-tree: record %q: parse type: %w", record, err)
+ }
+
+ entryOID, err := repo.objectFormat.FromString(string(fields[2]))
+ if err != nil {
+ return nil, fmt.Errorf("ls-tree: record %q: parse oid: %w", record, err)
+ }
+
+ entries = append(entries, TreeEntry{
+ Mode: string(fields[0]),
+ Type: ty,
+ OID: entryOID,
+ Name: string(name),
+ })
+ }
+
+ return entries, nil
+}