66 lines
1.2 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 = g.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 = g.makeNiceTree(subtree)
37
}
38
}
39
40
return files, nil
41
}
42
43
func (g *GitRepo) 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
50
lastCommit, err := g.LastCommitTime(e.Name)
51
if err != nil {
52
continue
53
}
54
55
nts = append(nts, types.NiceTree{
56
Name: e.Name,
57
Mode: mode.String(),
58
IsFile: e.Mode.IsFile(),
59
Size: sz,
60
LastCommit: lastCommit,
61
})
62
63
}
64
65
return nts
66
}
67