73 lines
1.4 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, path)
37
}
38
}
39
40
return files, nil
41
}
42
43
func (g *GitRepo) makeNiceTree(t *object.Tree, parent string) []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
var fpath string
51
if parent != "" {
52
fpath = fmt.Sprintf("%s/%s", parent, e.Name)
53
} else {
54
fpath = e.Name
55
}
56
lastCommit, err := g.LastCommitForPath(fpath)
57
if err != nil {
58
fmt.Println("error getting last commit time:", err)
59
continue
60
}
61
62
nts = append(nts, types.NiceTree{
63
Name: e.Name,
64
Mode: mode.String(),
65
IsFile: e.Mode.IsFile(),
66
Size: sz,
67
LastCommit: lastCommit,
68
})
69
70
}
71
72
return nts
73
}
74