diff options
author | Anirudh Oppiliappan <x@icyphox.sh> | 2022-12-11 21:16:42 +0530 |
---|---|---|
committer | Anirudh Oppiliappan <x@icyphox.sh> | 2022-12-11 21:16:42 +0530 |
commit | e0f34796a37666058dce61277bc546add707fb2e (patch) | |
tree | 6455616327b1eb91dfa9183bee955393a2e79e14 /git/tree.go | |
parent | ac6ca71f01885b3fff692b4b9ee36ed33965d396 (diff) | |
download | legit-e0f34796a37666058dce61277bc546add707fb2e.tar.gz legit-e0f34796a37666058dce61277bc546add707fb2e.tar.bz2 legit-e0f34796a37666058dce61277bc546add707fb2e.zip |
git: fix trees
Diffstat (limited to 'git/tree.go')
-rw-r--r-- | git/tree.go | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/git/tree.go b/git/tree.go new file mode 100644 index 0000000..0ef1f2f --- /dev/null +++ b/git/tree.go @@ -0,0 +1,64 @@ +package git + +import ( + "fmt" + + "github.com/go-git/go-git/v5/plumbing/object" +) + +func (g *GitRepo) FileTree(path string) ([]NiceTree, error) { + c, err := g.r.CommitObject(g.h) + if err != nil { + return nil, fmt.Errorf("commit object: %w", err) + } + + files := []NiceTree{} + tree, err := c.Tree() + if err != nil { + return nil, fmt.Errorf("file tree: %w", err) + } + + if path == "" { + files = makeNiceTree(tree.Entries) + } 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 = makeNiceTree(subtree.Entries) + } + } + + return files, nil +} + +// A nicer git tree representation. +type NiceTree struct { + Name string + Mode string + Size int64 + IsFile bool + IsSubtree bool +} + +func makeNiceTree(es []object.TreeEntry) []NiceTree { + nts := []NiceTree{} + + for _, e := range es { + mode, _ := e.Mode.ToOSFileMode() + nts = append(nts, NiceTree{ + Name: e.Name, + Mode: mode.String(), + IsFile: e.Mode.IsFile(), + }) + } + + return nts +} |