Something went wrong. Try again.
forked from tangled.org/core
Something went wrong. Try again.
1.6 kB · 80 lines
Go
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081package git
import ( "fmt" "time"
"github.com/go-git/go-git/v5/plumbing/object" "tangled.sh/tangled.sh/core/types")
func (g *GitRepo) FileTree(path string) ([]types.NiceTree, error) { c, err := g.r.CommitObject(g.h) if err != nil { return nil, fmt.Errorf("commit object: %w", err) }
files := []types.NiceTree{} tree, err := c.Tree() if err != nil { return nil, fmt.Errorf("file tree: %w", err) }
if path == "" { files = g.makeNiceTree(tree, "") } else { o, err := tree.FindEntry(path) if err != nil { return nil, err }
if !o.Mode.IsFile() { subtree, err := tree.Tree(path) if err != nil { return nil, err }
files = g.makeNiceTree(subtree, path) } }
return files, nil}
func (g *GitRepo) makeNiceTree(t *object.Tree, parent string) []types.NiceTree { nts := []types.NiceTree{}
for _, e := range t.Entries { mode, _ := e.Mode.ToOSFileMode() sz, _ := t.Size(e.Name)
var fpath string if parent != "" { fpath = fmt.Sprintf("%s/%s", parent, e.Name) } else { fpath = e.Name } lastCommit, err := g.LastCommitForPath(fpath) if err != nil { fmt.Println("error getting last commit time:", err) // We don't want to skip the file, so worst case lets just // populate it with "defaults". lastCommit = &types.LastCommitInfo{ Hash: g.h, Message: "", When: time.Now(), } }
nts = append(nts, types.NiceTree{ Name: e.Name, Mode: mode.String(), IsFile: e.Mode.IsFile(), Size: sz, LastCommit: lastCommit, })
}
return nts}