vendor/github.com/spf13/afero/iofs.go
changeset 260 445e01aede7e
parent 256 6d9efbef00a9
--- a/vendor/github.com/spf13/afero/iofs.go	Tue Aug 23 22:33:28 2022 +0200
+++ b/vendor/github.com/spf13/afero/iofs.go	Tue Aug 23 22:39:43 2022 +0200
@@ -1,3 +1,4 @@
+//go:build go1.16
 // +build go1.16
 
 package afero
@@ -7,7 +8,10 @@
 	"io/fs"
 	"os"
 	"path"
+	"sort"
 	"time"
+
+	"github.com/spf13/afero/internal/common"
 )
 
 // IOFS adopts afero.Fs to stdlib io/fs.FS
@@ -66,14 +70,31 @@
 }
 
 func (iofs IOFS) ReadDir(name string) ([]fs.DirEntry, error) {
-	items, err := ReadDir(iofs.Fs, name)
+	f, err := iofs.Fs.Open(name)
 	if err != nil {
 		return nil, iofs.wrapError("readdir", name, err)
 	}
 
+	defer f.Close()
+
+	if rdf, ok := f.(fs.ReadDirFile); ok {
+		items, err := rdf.ReadDir(-1)
+		if err != nil {
+			return nil, iofs.wrapError("readdir", name, err)
+		}
+		sort.Slice(items, func(i, j int) bool { return items[i].Name() < items[j].Name() })
+		return items, nil
+	}
+
+	items, err := f.Readdir(-1)
+	if err != nil {
+		return nil, iofs.wrapError("readdir", name, err)
+	}
+	sort.Sort(byName(items))
+
 	ret := make([]fs.DirEntry, len(items))
 	for i := range items {
-		ret[i] = dirEntry{items[i]}
+		ret[i] = common.FileInfoDirEntry{FileInfo: items[i]}
 	}
 
 	return ret, nil
@@ -108,17 +129,6 @@
 	}
 }
 
-// dirEntry provides adapter from os.FileInfo to fs.DirEntry
-type dirEntry struct {
-	fs.FileInfo
-}
-
-var _ fs.DirEntry = dirEntry{}
-
-func (d dirEntry) Type() fs.FileMode { return d.FileInfo.Mode().Type() }
-
-func (d dirEntry) Info() (fs.FileInfo, error) { return d.FileInfo, nil }
-
 // readDirFile provides adapter from afero.File to fs.ReadDirFile needed for correct Open
 type readDirFile struct {
 	File
@@ -134,7 +144,7 @@
 
 	ret := make([]fs.DirEntry, len(items))
 	for i := range items {
-		ret[i] = dirEntry{items[i]}
+		ret[i] = common.FileInfoDirEntry{FileInfo: items[i]}
 	}
 
 	return ret, nil