forked from
tangled.org/core
fork
Configure Feed
Select the types of activity you want to include in your feed.
Monorepo for Tangled
fork
Configure Feed
Select the types of activity you want to include in your feed.
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}