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 = 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
43func (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}