all repos

mugit @ dc62a68

🐮 git server that your cow will love

mugit/internal/git/tree.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
git: add all helpers ..., 4 months ago
1
package git
2
3
import (
4
	"fmt"
5
6
	"github.com/go-git/go-git/v5/plumbing/object"
7
)
8
9
type NiceTree struct {
10
	Name      string
11
	Mode      string
12
	Size      int64
13
	IsFile    bool
14
	IsSubtree bool
15
}
16
17
func makeNiceTree(t *object.Tree) []NiceTree {
18
	nts := []NiceTree{}
19
	for _, e := range t.Entries {
20
		mode, _ := e.Mode.ToOSFileMode()
21
		sz, _ := t.Size(e.Name)
22
		nts = append(nts, NiceTree{
23
			Name:   e.Name,
24
			Mode:   mode.String(),
25
			IsFile: e.Mode.IsFile(),
26
			Size:   sz,
27
		})
28
	}
29
	return nts
30
}
31
32
func (g *Repo) FileTree(path string) ([]NiceTree, error) {
33
	c, err := g.r.CommitObject(g.h)
34
	if err != nil {
35
		return nil, fmt.Errorf("commit object: %w", err)
36
	}
37
38
	files := []NiceTree{}
39
	tree, err := c.Tree()
40
	if err != nil {
41
		return nil, fmt.Errorf("file tree: %w", err)
42
	}
43
44
	if path == "" {
45
		files = makeNiceTree(tree)
46
	} else {
47
		o, err := tree.FindEntry(path)
48
		if err != nil {
49
			return nil, err
50
		}
51
52
		if !o.Mode.IsFile() {
53
			subtree, err := tree.Tree(path)
54
			if err != nil {
55
				return nil, err
56
			}
57
			files = makeNiceTree(subtree)
58
		}
59
	}
60
61
	return files, nil
62
}