mirror of
https://github.com/versity/versitygw.git
synced 2026-02-06 10:20:43 +00:00
Add "lexical" sort to walker.go
This commit is contained in:
@@ -95,7 +95,7 @@ func Walk(ctx context.Context, fileSystem fs.FS, prefix, delimiter, marker strin
|
||||
}
|
||||
}
|
||||
|
||||
err := fs.WalkDir(fileSystem, root, func(path string, d fs.DirEntry, err error) error {
|
||||
err := WalkDir(fileSystem, root, func(path string, d fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -343,7 +343,7 @@ func WalkVersions(ctx context.Context, fileSystem fs.FS, prefix, delimiter, keyM
|
||||
|
||||
pastVersionIdMarker := versionIdMarker == ""
|
||||
|
||||
err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
|
||||
err := WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -410,6 +410,9 @@ func TestOrderWalk(t *testing.T) {
|
||||
"dir1/a/file3": {},
|
||||
"dir1/a.b/file1": {},
|
||||
"dir1/a.b/file2": {},
|
||||
"dir1/b": {},
|
||||
"dir1/b./a": {},
|
||||
"dir1/b..": {},
|
||||
},
|
||||
getobj: getObj,
|
||||
cases: []testcase{
|
||||
@@ -427,6 +430,10 @@ func TestOrderWalk(t *testing.T) {
|
||||
{Key: backend.GetPtrFromString("dir1/a/file1")},
|
||||
{Key: backend.GetPtrFromString("dir1/a/file2")},
|
||||
{Key: backend.GetPtrFromString("dir1/a/file3")},
|
||||
{Key: backend.GetPtrFromString("dir1/b")},
|
||||
{Key: backend.GetPtrFromString("dir1/b..")},
|
||||
{Key: backend.GetPtrFromString("dir1/b./")},
|
||||
{Key: backend.GetPtrFromString("dir1/b./a")},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -5,8 +5,10 @@
|
||||
package backend
|
||||
|
||||
import (
|
||||
"cmp"
|
||||
"io/fs"
|
||||
"path"
|
||||
"slices"
|
||||
)
|
||||
|
||||
// WalkDirFunc is the type of the function called by [WalkDir] to visit
|
||||
@@ -65,8 +67,7 @@ func walkDir(fsys fs.FS, name string, d fs.DirEntry, walkDirFn WalkDirFunc) erro
|
||||
// Successfully skipped directory.
|
||||
err = nil
|
||||
}
|
||||
// return errors.New("hi " + name)
|
||||
return err
|
||||
return err
|
||||
}
|
||||
|
||||
dirs, err := fs.ReadDir(fsys, name)
|
||||
@@ -81,6 +82,20 @@ func walkDir(fsys fs.FS, name string, d fs.DirEntry, walkDirFn WalkDirFunc) erro
|
||||
}
|
||||
}
|
||||
|
||||
sortFunc := func(a, b fs.DirEntry) int {
|
||||
aname := a.Name()
|
||||
bname := b.Name()
|
||||
if a.IsDir() {
|
||||
aname += "/"
|
||||
}
|
||||
if b.IsDir() {
|
||||
bname += "/"
|
||||
}
|
||||
return cmp.Compare(aname, bname)
|
||||
}
|
||||
|
||||
slices.SortFunc(dirs, sortFunc)
|
||||
|
||||
for _, d1 := range dirs {
|
||||
name1 := path.Join(name, d1.Name())
|
||||
if err := walkDir(fsys, name1, d1, walkDirFn); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user