forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
1package git
2
3import (
4 "fmt"
5
6 "github.com/go-git/go-git/v5/plumbing/object"
7 "github.com/sotangled/tangled/types"
8)
9
10func (g *GitRepo) FileTree(path string) ([]types.NiceTree, error) {
11 c, err := g.r.CommitObject(g.h)
12 if err != nil {
13 return nil, fmt.Errorf("commit object: %w", err)
14 }
15
16 files := []types.NiceTree{}
17 tree, err := c.Tree()
18 if err != nil {
19 return nil, fmt.Errorf("file tree: %w", err)
20 }
21
22 if path == "" {
23 files = makeNiceTree(tree)
24 } else {
25 o, err := tree.FindEntry(path)
26 if err != nil {
27 return nil, err
28 }
29
30 if !o.Mode.IsFile() {
31 subtree, err := tree.Tree(path)
32 if err != nil {
33 return nil, err
34 }
35
36 files = makeNiceTree(subtree)
37 }
38 }
39
40 return files, nil
41}
42
43func makeNiceTree(t *object.Tree) []types.NiceTree {
44 nts := []types.NiceTree{}
45
46 for _, e := range t.Entries {
47 mode, _ := e.Mode.ToOSFileMode()
48 sz, _ := t.Size(e.Name)
49 nts = append(nts, types.NiceTree{
50 Name: e.Name,
51 Mode: mode.String(),
52 IsFile: e.Mode.IsFile(),
53 Size: sz,
54 })
55 }
56
57 return nts
58}