Add "lexical" sort to walker.go

This commit is contained in:
John W Higgins
2026-01-29 13:00:38 -08:00
parent 73e2df4105
commit bcf341bdaa
3 changed files with 26 additions and 4 deletions

View File

@@ -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
}

View File

@@ -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")},
},
},
},

View File

@@ -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 {