forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
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 = 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 43func 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}