58 lines
1.0 kB
1
package git
2
3
import (
4
"fmt"
5
6
"github.com/go-git/go-git/v5/plumbing/object"
7
"github.com/sotangled/tangled/types"
8
)
9
10
func (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
43
func 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
}
59