-
Notifications
You must be signed in to change notification settings - Fork 5
/
tree_node.go
125 lines (104 loc) · 2.7 KB
/
tree_node.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package versionmgr
import (
"bytes"
"context"
"fmt"
"github.com/jiaozifs/jiaozifs/models"
"github.com/jiaozifs/jiaozifs/versionmgr/merkletrie/noder"
)
var _ noder.Noder = (*TreeNode)(nil)
type TreeNode struct {
ctx context.Context
entry models.TreeEntry
treeNode *models.TreeNode
objectRepo models.IFileTreeRepo
}
func NewTreeNode(ctx context.Context, entry models.TreeEntry, object models.IFileTreeRepo) (*TreeNode, error) {
treeNode := EmptyRoot
if !entry.Equal(EmptyDirEntry) {
var err error
treeNode, err = object.TreeNode(ctx, entry.Hash)
if err != nil {
return nil, err
}
}
return &TreeNode{ctx: ctx, entry: entry, treeNode: treeNode, objectRepo: object}, nil
}
func (n TreeNode) Type() models.ObjectType {
return n.treeNode.Type
}
func (n TreeNode) Properties() models.Property {
return n.treeNode.Properties
}
func (n TreeNode) SubObjects() []models.TreeEntry {
return n.treeNode.SubObjects
}
func (n TreeNode) TreeNode() *models.TreeNode {
return n.treeNode
}
func (n TreeNode) Equal(other noder.Noder) bool {
return bytes.Equal(n.Hash(), other.Hash())
}
func (n TreeNode) SubDir(ctx context.Context, name string) (*TreeNode, error) {
for _, node := range n.treeNode.SubObjects {
if node.Name == name {
if node.IsDir {
return NewTreeNode(ctx, node, n.objectRepo)
}
return nil, fmt.Errorf("node is not directory")
}
}
return nil, ErrPathNotFound
}
func (n TreeNode) SubFile(ctx context.Context, name string) (*models.Blob, error) {
for _, node := range n.treeNode.SubObjects {
if node.Name == name {
if !node.IsDir {
return n.objectRepo.Blob(ctx, node.Hash)
}
return nil, fmt.Errorf("node is not blob")
}
}
return nil, ErrPathNotFound
}
func (n TreeNode) SubEntry(_ context.Context, name string) (models.TreeEntry, error) {
for _, node := range n.treeNode.SubObjects {
if node.Name == name {
return node, nil
}
}
return models.TreeEntry{}, ErrPathNotFound
}
func (n TreeNode) Hash() []byte {
return n.entry.Hash
}
func (n TreeNode) String() string {
return n.entry.Name + " " + n.entry.Hash.Hex()
}
func (n TreeNode) Name() string {
return n.entry.Name
}
func (n TreeNode) IsDir() bool {
return n.entry.IsDir
}
func (n TreeNode) Children() ([]noder.Noder, error) {
children := make([]noder.Noder, len(n.treeNode.SubObjects))
for i, sub := range n.treeNode.SubObjects {
var err error
children[i], err = NewTreeNode(n.ctx, sub, n.objectRepo)
if err != nil {
return nil, err
}
}
return children, nil
}
func (n TreeNode) NumChildren() (int, error) {
treeNode, err := n.objectRepo.TreeNode(n.ctx, n.Hash())
if err != nil {
return 0, err
}
return len(treeNode.SubObjects), nil
}
func (n TreeNode) Skip() bool {
return false
}