diff --git a/backend/walk.go b/backend/walk.go index 17860c0..e39b576 100644 --- a/backend/walk.go +++ b/backend/walk.go @@ -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 } diff --git a/backend/walk_test.go b/backend/walk_test.go index ed0335a..9d80096 100644 --- a/backend/walk_test.go +++ b/backend/walk_test.go @@ -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")}, }, }, }, diff --git a/backend/walker.go b/backend/walker.go index 0b2fbcd..ec6dd24 100644 --- a/backend/walker.go +++ b/backend/walker.go @@ -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 {