mirror of
https://github.com/gotenberg/gotenberg.git
synced 2026-08-18 05:02:15 +01:00
fix(fs): get file by ext sorted by mod time
This commit is contained in:
@@ -4,7 +4,9 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
@@ -86,10 +88,15 @@ func (fs *FileSystem) MkdirAll() (string, error) {
|
|||||||
return path, nil
|
return path, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type fileWithModTime struct {
|
||||||
|
path string
|
||||||
|
modTime time.Time
|
||||||
|
}
|
||||||
|
|
||||||
// WalkDir walks through the root level of a directory and returns a list of
|
// WalkDir walks through the root level of a directory and returns a list of
|
||||||
// files paths that match the specified file extension.
|
// files paths that match the specified file extension.
|
||||||
func WalkDir(dir, ext string) ([]string, error) {
|
func WalkDir(dir, ext string) ([]string, error) {
|
||||||
var files []string
|
var files []fileWithModTime
|
||||||
err := filepath.Walk(dir, func(path string, info os.FileInfo, pathErr error) error {
|
err := filepath.Walk(dir, func(path string, info os.FileInfo, pathErr error) error {
|
||||||
if pathErr != nil {
|
if pathErr != nil {
|
||||||
return pathErr
|
return pathErr
|
||||||
@@ -98,11 +105,27 @@ func WalkDir(dir, ext string) ([]string, error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if strings.EqualFold(filepath.Ext(info.Name()), ext) {
|
if strings.EqualFold(filepath.Ext(info.Name()), ext) {
|
||||||
files = append(files, path)
|
files = append(files, fileWithModTime{
|
||||||
|
path: path,
|
||||||
|
modTime: info.ModTime(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
return files, err
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Slice(files, func(i, j int) bool {
|
||||||
|
return files[i].modTime.Before(files[j].modTime)
|
||||||
|
})
|
||||||
|
|
||||||
|
sortedPaths := make([]string, len(files))
|
||||||
|
for i, f := range files {
|
||||||
|
sortedPaths[i] = f.path
|
||||||
|
}
|
||||||
|
|
||||||
|
return sortedPaths, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Interface guards.
|
// Interface guards.
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ func TestWalkDir(t *testing.T) {
|
|||||||
expectError: true,
|
expectError: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
scenario: "find PDF files",
|
scenario: "find PDF files, sorted by mod time",
|
||||||
dir: func() string {
|
dir: func() string {
|
||||||
path := fmt.Sprintf("%s/a_directory", os.TempDir())
|
path := fmt.Sprintf("%s/a_directory", os.TempDir())
|
||||||
|
|
||||||
@@ -170,17 +170,27 @@ func TestWalkDir(t *testing.T) {
|
|||||||
t.Fatalf(fmt.Sprintf("expected no error but got: %v", err))
|
t.Fatalf(fmt.Sprintf("expected no error but got: %v", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
err = os.WriteFile(fmt.Sprintf("%s/a_foo_file.pdf", path), []byte{1}, 0o755)
|
err = os.WriteFile(fmt.Sprintf("%s/2.pdf", path), []byte{1}, 0o755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("expected no error but got: %v", err)
|
t.Fatalf("expected no error but got: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = os.WriteFile(fmt.Sprintf("%s/a_bar_file.PDF", path), []byte{1}, 0o755)
|
err = os.WriteFile(fmt.Sprintf("%s/1.PDF", path), []byte{1}, 0o755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("expected no error but got: %v", err)
|
t.Fatalf("expected no error but got: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = os.WriteFile(fmt.Sprintf("%s/a_baz_file.txt", path), []byte{1}, 0o755)
|
err = os.WriteFile(fmt.Sprintf("%s/3.txt", path), []byte{1}, 0o755)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("expected no error but got: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os.WriteFile(fmt.Sprintf("%s/10.pdf", path), []byte{1}, 0o755)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("expected no error but got: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os.WriteFile(fmt.Sprintf("%s/11.pdf", path), []byte{1}, 0o755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("expected no error but got: %v", err)
|
t.Fatalf("expected no error but got: %v", err)
|
||||||
}
|
}
|
||||||
@@ -189,7 +199,7 @@ func TestWalkDir(t *testing.T) {
|
|||||||
}(),
|
}(),
|
||||||
ext: ".pdf",
|
ext: ".pdf",
|
||||||
expectError: false,
|
expectError: false,
|
||||||
expectFiles: []string{"/tmp/a_directory/a_bar_file.PDF", "/tmp/a_directory/a_foo_file.pdf"},
|
expectFiles: []string{"/tmp/a_directory/2.pdf", "/tmp/a_directory/1.PDF", "/tmp/a_directory/10.pdf", "/tmp/a_directory/11.pdf"},
|
||||||
},
|
},
|
||||||
} {
|
} {
|
||||||
t.Run(tc.scenario, func(t *testing.T) {
|
t.Run(tc.scenario, func(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user