diff options
| author | 2026-06-07 11:20:08 +0000 | |
|---|---|---|
| committer | 2026-06-07 11:20:08 +0000 | |
| commit | 37874d1a93ad09a24076ec7535154db3924c1a6a (patch) | |
| tree | e9c22e2b84f9cd11ec42fd30b73b328988c87dff /internal/testgit | |
| parent | internal/testgit: MkTreeEntry -> TreeEntry (diff) | |
| signature | No signature | |
internal/testgit: LsTree
Diffstat (limited to 'internal/testgit')
| -rw-r--r-- | internal/testgit/tree.go | 47 |
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 +} |
