Skip to content

Commit 899193b

Browse files
authored
feat: walk with node (#142)
* feat: walk with node
1 parent fdff8c8 commit 899193b

File tree

5 files changed

+51
-35
lines changed

5 files changed

+51
-35
lines changed

controller/object_ctl.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -456,11 +456,11 @@ func (oct ObjectController) GetFiles(ctx context.Context, w *api.JiaozifsRespons
456456
return
457457
}
458458

459-
files, err := workTree.GetFiles(ctx, utils.StringValue(params.Pattern))
459+
treeManifest, err := workTree.GetTreeManifest(ctx, utils.StringValue(params.Pattern))
460460
if err != nil {
461461
w.Error(err)
462462
return
463463
}
464464

465-
w.JSON(files)
465+
w.JSON(treeManifest.FileList)
466466
}

versionmgr/files_walk.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ type nodeWithPath struct {
2121
path string
2222
}
2323

24-
func (wk FileWalk) Walk(ctx context.Context, fn func(path string) error) error {
24+
func (wk FileWalk) Walk(ctx context.Context, fn func(blob *models.Blob, path string) error) error {
2525
cache := list.New()
2626
cache.PushFront(nodeWithPath{wk.curNode, ""})
2727
for {
@@ -47,7 +47,13 @@ func (wk FileWalk) Walk(ctx context.Context, fn func(path string) error) error {
4747
if subNodes[i].IsDir {
4848
continue
4949
}
50-
err := fn(path.Join(curNode.path, subNodes[i].Name))
50+
51+
blob, err := wk.object.Blob(ctx, subNodes[i].Hash)
52+
if err != nil {
53+
return err
54+
}
55+
56+
err = fn(blob, path.Join(curNode.path, subNodes[i].Name))
5157
if err != nil {
5258
return err
5359
}

versionmgr/files_walk_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func TestFileWalk_Walk(t *testing.T) {
3737
curNode: workTree.root,
3838
}
3939
var paths []string
40-
err = wk.Walk(ctx, func(path string) error {
40+
err = wk.Walk(ctx, func(_ *models.Blob, path string) error {
4141
fmt.Println(path)
4242
paths = append(paths, path)
4343
return nil

versionmgr/worktree.go

+15-5
Original file line numberDiff line numberDiff line change
@@ -443,23 +443,33 @@ func (workTree *WorkTree) Ls(ctx context.Context, pattern string) ([]FullTreeEnt
443443
return workTree.getFullEntry(ctx, lastNode.Node().SubObjects)
444444
}
445445

446-
func (workTree *WorkTree) GetFiles(ctx context.Context, pattern string) ([]string, error) {
446+
type TreeManifest struct {
447+
Size int64 `json:"size"`
448+
FileList []string `json:"file_list"`
449+
}
450+
451+
func (workTree *WorkTree) GetTreeManifest(ctx context.Context, pattern string) (TreeManifest, error) {
447452
//todo match all files, it maybe slow maybe need a new algo like filepath.Glob
448453
wk := FileWalk{curNode: workTree.root, object: workTree.object}
449-
files := make([]string, 0)
450454
g, err := glob.Compile(pattern)
451455
if err != nil {
452-
return files, err
456+
return TreeManifest{}, err
453457
}
454458

455-
err = wk.Walk(ctx, func(path string) error {
459+
files := make([]string, 0)
460+
var size int64
461+
err = wk.Walk(ctx, func(blob *models.Blob, path string) error {
456462
fmt.Println(path)
457463
if g.Match(path) {
464+
size += blob.Size
458465
files = append(files, path)
459466
}
460467
return nil
461468
})
462-
return files, err
469+
return TreeManifest{
470+
Size: size,
471+
FileList: files,
472+
}, err
463473
}
464474

465475
func (workTree *WorkTree) getFullEntry(ctx context.Context, treeEntries []models.TreeEntry) ([]FullTreeEntry, error) {

versionmgr/worktree_test.go

+25-25
Original file line numberDiff line numberDiff line change
@@ -177,52 +177,52 @@ func TestWorkTreeGetFiles(t *testing.T) {
177177
}
178178

179179
t.Run("all", func(t *testing.T) {
180-
newPaths, err := workTree.GetFiles(ctx, "*")
180+
manifest, err := workTree.GetTreeManifest(ctx, "*")
181181
require.NoError(t, err)
182-
require.Equal(t, 7, len(newPaths))
183-
require.Equal(t, "a.txt", newPaths[0])
184-
require.Equal(t, "a/b/c.txt", newPaths[1])
185-
require.Equal(t, "a/b/d.txt", newPaths[2])
186-
require.Equal(t, "ff/b/c.txt", newPaths[3])
187-
require.Equal(t, "ff/b/d.txt", newPaths[4])
188-
require.Equal(t, "ff/b/e.jpg", newPaths[5])
189-
require.Equal(t, "ff/b/f.jpg", newPaths[6])
182+
require.Equal(t, 7, len(manifest.FileList))
183+
require.Equal(t, "a.txt", manifest.FileList[0])
184+
require.Equal(t, "a/b/c.txt", manifest.FileList[1])
185+
require.Equal(t, "a/b/d.txt", manifest.FileList[2])
186+
require.Equal(t, "ff/b/c.txt", manifest.FileList[3])
187+
require.Equal(t, "ff/b/d.txt", manifest.FileList[4])
188+
require.Equal(t, "ff/b/e.jpg", manifest.FileList[5])
189+
require.Equal(t, "ff/b/f.jpg", manifest.FileList[6])
190190
})
191191

192192
t.Run("single file", func(t *testing.T) {
193-
newPaths, err := workTree.GetFiles(ctx, "a/b/d.txt")
193+
manifest, err := workTree.GetTreeManifest(ctx, "a/b/d.txt")
194194
require.NoError(t, err)
195-
require.Equal(t, 1, len(newPaths))
196-
require.Equal(t, "a/b/d.txt", newPaths[0])
195+
require.Equal(t, 1, len(manifest.FileList))
196+
require.Equal(t, "a/b/d.txt", manifest.FileList[0])
197197
})
198198

199199
t.Run("single path", func(t *testing.T) {
200-
newPaths, err := workTree.GetFiles(ctx, "a")
200+
manifest, err := workTree.GetTreeManifest(ctx, "a")
201201
require.NoError(t, err)
202-
require.Equal(t, 0, len(newPaths))
202+
require.Equal(t, 0, len(manifest.FileList))
203203
})
204204

205205
t.Run("ext match", func(t *testing.T) {
206-
newPaths, err := workTree.GetFiles(ctx, "*.jpg")
206+
manifest, err := workTree.GetTreeManifest(ctx, "*.jpg")
207207
require.NoError(t, err)
208-
require.Equal(t, 2, len(newPaths))
209-
require.Equal(t, "ff/b/e.jpg", newPaths[0])
210-
require.Equal(t, "ff/b/f.jpg", newPaths[1])
208+
require.Equal(t, 2, len(manifest.FileList))
209+
require.Equal(t, "ff/b/e.jpg", manifest.FileList[0])
210+
require.Equal(t, "ff/b/f.jpg", manifest.FileList[1])
211211
})
212212

213213
t.Run("filename match", func(t *testing.T) {
214-
newPaths, err := workTree.GetFiles(ctx, "*/e.jpg")
214+
manifest, err := workTree.GetTreeManifest(ctx, "*/e.jpg")
215215
require.NoError(t, err)
216-
require.Equal(t, 1, len(newPaths))
217-
require.Equal(t, "ff/b/e.jpg", newPaths[0])
216+
require.Equal(t, 1, len(manifest.FileList))
217+
require.Equal(t, "ff/b/e.jpg", manifest.FileList[0])
218218
})
219219

220220
t.Run("sub", func(t *testing.T) {
221-
newPaths, err := workTree.GetFiles(ctx, "a/*")
221+
manifest, err := workTree.GetTreeManifest(ctx, "a/*")
222222
require.NoError(t, err)
223-
require.Equal(t, 2, len(newPaths))
224-
require.Equal(t, "a/b/c.txt", newPaths[0])
225-
require.Equal(t, "a/b/d.txt", newPaths[1])
223+
require.Equal(t, 2, len(manifest.FileList))
224+
require.Equal(t, "a/b/c.txt", manifest.FileList[0])
225+
require.Equal(t, "a/b/d.txt", manifest.FileList[1])
226226
})
227227

228228
}

0 commit comments

Comments
 (0)