Skip to content

Commit b83fbbb

Browse files
committed
refrator: make tree node easy to use
1 parent 727a5bf commit b83fbbb

File tree

11 files changed

+304
-237
lines changed

11 files changed

+304
-237
lines changed

block/gs/adapter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ func (a *Adapter) Remove(ctx context.Context, obj block.ObjectPointer) error {
220220
}
221221
err = a.client.Bucket(bucket).Object(key).Delete(ctx)
222222
if err != nil {
223-
return fmt.Errorf("Object(%q).Delete: %w", key, err)
223+
return fmt.Errorf("object(%q).Delete: %w", key, err)
224224
}
225225
return nil
226226
}

controller/object_ctl.go

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,13 @@ func (oct ObjectController) HeadObject(ctx context.Context, w *api.JiaozifsRespo
7575
}
7676

7777
objRepo := oct.Repo.ObjectRepo()
78-
treeOp := versionmgr.NewTreeOp(oct.Repo.ObjectRepo())
79-
treeNode, err := objRepo.TreeNode(ctx, commit.TreeHash)
78+
treeOp, err := versionmgr.NewWorkTree(ctx, oct.Repo.ObjectRepo(), models.NewRootTreeEntry(commit.TreeHash))
8079
if err != nil {
8180
w.Error(err)
8281
return
8382
}
84-
existNodes, missingPath, err := treeOp.MatchPath(ctx, treeNode, params.Path)
83+
84+
existNodes, missingPath, err := treeOp.MatchPath(ctx, params.Path)
8585
if err != nil {
8686
w.Error(err)
8787
return
@@ -93,19 +93,19 @@ func (oct ObjectController) HeadObject(ctx context.Context, w *api.JiaozifsRespo
9393

9494
objectWithName := existNodes[len(existNodes)-1]
9595

96-
blob, err := objRepo.Blob(ctx, objectWithName.Node.Hash)
96+
blob, err := objRepo.Blob(ctx, objectWithName.Node().Hash)
9797
if err != nil {
9898
w.Error(err)
9999
return
100100
}
101101

102102
//lookup files
103-
etag := httputil.ETag(objectWithName.Node.Hash.Hex())
103+
etag := httputil.ETag(objectWithName.Node().Hash.Hex())
104104
w.Header().Set("ETag", etag)
105-
lastModified := httputil.HeaderTimestamp(objectWithName.Node.CreatedAt)
105+
lastModified := httputil.HeaderTimestamp(objectWithName.Node().CreatedAt)
106106
w.Header().Set("Last-Modified", lastModified)
107107
w.Header().Set("Accept-Ranges", "bytes")
108-
w.Header().Set("Content-Type", httputil.ExtensionsByType(objectWithName.Name))
108+
w.Header().Set("Content-Type", httputil.ExtensionsByType(objectWithName.Entry().Name))
109109
// for security, make sure the browser and any proxies en route don't cache the response
110110
w.Header().Set("Cache-Control", "no-store, must-revalidate")
111111
w.Header().Set("Expires", "0")
@@ -173,12 +173,6 @@ func (oct ObjectController) UploadObject(ctx context.Context, w *api.JiaozifsRes
173173

174174
var response api.ObjectStats
175175
err = oct.Repo.Transaction(ctx, func(dRepo models.IRepo) error {
176-
treeOp := versionmgr.TreeOp{Object: dRepo.ObjectRepo()}
177-
blob, err := treeOp.WriteBlob(ctx, oct.BlockAdapter, reader, r.ContentLength, block.PutOpts{})
178-
if err != nil {
179-
return err
180-
}
181-
182176
user, err := dRepo.UserRepo().Get(ctx, &models.GetUserParam{Name: utils.String(userName)})
183177
if err != nil {
184178
return err
@@ -200,12 +194,17 @@ func (oct ObjectController) UploadObject(ctx context.Context, w *api.JiaozifsRes
200194
return err
201195
}
202196

203-
workingTreeID, err := dRepo.ObjectRepo().TreeNode(ctx, stash.CurrentTree)
197+
workingTree, err := versionmgr.NewWorkTree(ctx, dRepo.ObjectRepo(), models.NewRootTreeEntry(stash.CurrentTree))
198+
if err != nil {
199+
return err
200+
}
201+
202+
blob, err := workingTree.WriteBlob(ctx, oct.BlockAdapter, reader, r.ContentLength, block.PutOpts{})
204203
if err != nil {
205204
return err
206205
}
207206

208-
newRoot, err := treeOp.AddLeaf(ctx, workingTreeID, params.Path, blob)
207+
err = workingTree.AddLeaf(ctx, params.Path, blob)
209208
if err != nil {
210209
return err
211210
}
@@ -218,7 +217,7 @@ func (oct ObjectController) UploadObject(ctx context.Context, w *api.JiaozifsRes
218217
ContentType: &contentType,
219218
Metadata: &api.ObjectUserMetadata{},
220219
}
221-
return dRepo.WipRepo().UpdateCurrentHash(ctx, stash.ID, newRoot.Hash)
220+
return dRepo.WipRepo().UpdateCurrentHash(ctx, stash.ID, workingTree.Root().Hash())
222221
})
223222

224223
if err != nil {

go.mod

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ require (
2121
github.com/getkin/kin-openapi v0.118.0
2222
github.com/go-chi/chi/v5 v5.0.10
2323
github.com/go-chi/cors v1.2.1
24-
github.com/go-git/go-git v4.7.0+incompatible
2524
github.com/go-git/go-git/v5 v5.10.1
2625
github.com/go-openapi/swag v0.22.4
2726
github.com/go-test/deep v1.1.0
@@ -87,16 +86,13 @@ require (
8786
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
8887
github.com/cespare/xxhash/v2 v2.2.0 // indirect
8988
github.com/containerd/continuity v0.3.0 // indirect
90-
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
9189
github.com/docker/cli v23.0.6+incompatible // indirect
9290
github.com/docker/docker v23.0.6+incompatible // indirect
9391
github.com/docker/go-connections v0.4.0 // indirect
9492
github.com/docker/go-units v0.5.0 // indirect
9593
github.com/dustin/go-humanize v1.0.1 // indirect
9694
github.com/fatih/color v1.15.0 // indirect
9795
github.com/fsnotify/fsnotify v1.6.0 // indirect
98-
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
99-
github.com/go-git/go-billy/v5 v5.5.0 // indirect
10096
github.com/go-openapi/jsonpointer v0.19.6 // indirect
10197
github.com/go-sql-driver/mysql v1.7.0 // indirect
10298
github.com/gogo/protobuf v1.3.2 // indirect
@@ -179,7 +175,6 @@ require (
179175
google.golang.org/grpc v1.58.3 // indirect
180176
google.golang.org/protobuf v1.31.0 // indirect
181177
gopkg.in/ini.v1 v1.67.0 // indirect
182-
gopkg.in/warnings.v0 v0.1.2 // indirect
183178
gopkg.in/yaml.v3 v3.0.1 // indirect
184179
mellium.im/sasl v0.3.1 // indirect
185180
)

go.sum

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t
133133
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
134134
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
135135
github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
136-
github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
137136
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
138137
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
139138
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@@ -170,12 +169,7 @@ github.com/go-chi/chi/v5 v5.0.10 h1:rLz5avzKpjqxrYwXNfmjkrYYXOyLJd37pz53UFHC6vk=
170169
github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
171170
github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4=
172171
github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58=
173-
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
174-
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
175172
github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU=
176-
github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
177-
github.com/go-git/go-git v4.7.0+incompatible h1:+W9rgGY4DOKKdX2x6HxSR7HNeTxqiKrOvKnuittYVdA=
178-
github.com/go-git/go-git v4.7.0+incompatible/go.mod h1:6+421e08gnZWn30y26Vchf7efgYLe4dl5OQbBSUXShE=
179173
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
180174
github.com/go-git/go-git/v5 v5.10.1 h1:tu8/D8i+TWxgKpzQ3Vc43e+kkhXqtsZCKI/egajKnxk=
181175
github.com/go-git/go-git/v5 v5.10.1/go.mod h1:uEuHjxkHap8kAl//V5F/nNWwqIYtP/402ddd05mp0wg=
@@ -368,7 +362,6 @@ github.com/oapi-codegen/nethttp-middleware v1.0.1 h1:ZWvwfnMU0eloHX1VEJmQscQm374
368362
github.com/oapi-codegen/nethttp-middleware v1.0.1/go.mod h1:P7xtAvpoqNB+5obR9qRCeefH7YlXWSK3KgPs/9WB8tE=
369363
github.com/oapi-codegen/runtime v1.1.0 h1:rJpoNUawn5XTvekgfkvSZr0RqEnoYpFkyvrzfWeFKWM=
370364
github.com/oapi-codegen/runtime v1.1.0/go.mod h1:BeSfBkWWWnAnGdyS+S/GnlbmHKzf8/hwkvelJZDeKA8=
371-
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
372365
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
373366
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
374367
github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=
@@ -841,8 +834,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV
841834
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
842835
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
843836
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
844-
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
845-
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
846837
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
847838
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
848839
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=

models/object.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package models
22

33
import (
4+
"bytes"
45
"context"
56
"time"
67

@@ -38,6 +39,17 @@ type TreeEntry struct {
3839
Hash hash.Hash `bun:"hash"`
3940
}
4041

42+
func NewRootTreeEntry(hash hash.Hash) TreeEntry {
43+
return TreeEntry{
44+
Name: "",
45+
Mode: filemode.Dir,
46+
Hash: hash,
47+
}
48+
}
49+
func (treeEntry TreeEntry) Equal(other TreeEntry) bool {
50+
return bytes.Equal(treeEntry.Hash, other.Hash) && treeEntry.Mode == other.Mode && treeEntry.Name == other.Name
51+
}
52+
4153
type Blob struct {
4254
bun.BaseModel `bun:"table:object"`
4355
Hash hash.Hash `bun:"hash,pk,type:bytea"`
@@ -188,6 +200,10 @@ func (commit *Commit) GetHash() (hash.Hash, error) {
188200
}
189201

190202
_, err = hasher.Write(commit.TreeHash)
203+
if err != nil {
204+
return nil, err
205+
}
206+
191207
for _, h := range commit.ParentHashes {
192208
_, err = hasher.Write(h)
193209
if err != nil {

versionmgr/commit.go

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -116,25 +116,24 @@ func (commitOp *CommitOp) DiffCommit(ctx context.Context, baseCommitID, toCommit
116116
return nil, err
117117
}
118118

119-
fromNode := &TreeNode{
120-
Ctx: ctx,
121-
TreeEntry: models.TreeEntry{
122-
Name: "",
123-
Mode: filemode.Dir,
124-
Hash: baseCommit.TreeHash,
125-
},
126-
Object: commitOp.Object,
119+
fromNode, err := NewTreeNode(ctx, models.TreeEntry{
120+
Name: "",
121+
Mode: filemode.Dir,
122+
Hash: baseCommit.TreeHash,
123+
}, commitOp.Object)
124+
if err != nil {
125+
return nil, err
127126
}
128127

129-
toNode := &TreeNode{
130-
Ctx: ctx,
131-
TreeEntry: models.TreeEntry{
132-
Name: "",
133-
Mode: filemode.Dir,
134-
Hash: toCommit.TreeHash,
135-
},
136-
Object: commitOp.Object,
128+
toNode, err := NewTreeNode(ctx, models.TreeEntry{
129+
Name: "",
130+
Mode: filemode.Dir,
131+
Hash: toCommit.TreeHash,
132+
}, commitOp.Object)
133+
if err != nil {
134+
return nil, err
137135
}
136+
138137
return merkletrie.DiffTreeContext(ctx, fromNode, toNode, func(a, b noder.Hasher) bool {
139138
return bytes.Equal(a.Hash(), b.Hash())
140139
})

versionmgr/commit_node.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,11 @@ func (c *CommitNode) Tree() (*TreeNode, error) {
2929
if err != nil {
3030
return nil, err
3131
}
32-
return &TreeNode{
33-
Ctx: c.Ctx,
34-
TreeEntry: models.TreeEntry{
35-
Name: "",
36-
Mode: filemode.Dir,
37-
Hash: treeNode.Hash,
38-
},
39-
Object: c.Object,
40-
}, nil
32+
return NewTreeNode(c.Ctx, models.TreeEntry{
33+
Name: "",
34+
Mode: filemode.Dir,
35+
Hash: treeNode.Hash,
36+
}, c.Object)
4137
}
4238

4339
// Parents return a CommitIter to the parent Commits.

versionmgr/commit_test.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ b/e.txt |e2
6868

6969
func makeUser(ctx context.Context, userRepo models.IUserRepo, name string) (*models.User, error) {
7070
user := &models.User{
71-
Name: "name",
71+
Name: name,
7272
Email: "xxx@gg.com",
7373
EncryptedPassword: "123",
7474
CurrentSignInAt: time.Time{},
@@ -120,9 +120,10 @@ func makeWip(ctx context.Context, wipRepo models.IWipRepo, repoID, refID uuid.UU
120120
}
121121
func makeRoot(ctx context.Context, objRepo models.IObjectRepo, testData string) (*models.TreeNode, error) {
122122
lines := strings.Split(testData, "\n")
123-
treeOp := NewTreeOp(objRepo)
124-
root := EmptyRoot
125-
var err error
123+
treeOp, err := NewWorkTree(ctx, objRepo, EmptyDirEntry)
124+
if err != nil {
125+
return nil, err
126+
}
126127
for _, line := range lines {
127128
if len(strings.TrimSpace(line)) == 0 {
128129
continue
@@ -138,10 +139,10 @@ func makeRoot(ctx context.Context, objRepo models.IObjectRepo, testData string)
138139
UpdatedAt: time.Now(),
139140
}
140141

141-
root, err = treeOp.AddLeaf(ctx, root, fullPath, blob)
142+
err = treeOp.AddLeaf(ctx, fullPath, blob)
142143
if err != nil {
143144
return nil, err
144145
}
145146
}
146-
return root, nil
147+
return treeOp.Root().TreeNode(), nil
147148
}

0 commit comments

Comments
 (0)