Recursively walk argument paths looking for saves

This allows for pointing menagerie at the root of saves (eg,
ShooterGame/Saved) and it will find all the non-backup save files.
This commit is contained in:
Justin C. Miller
2021-08-23 19:21:56 -07:00
parent dd422543f5
commit 5e233a2ed0
2 changed files with 48 additions and 32 deletions

View File

@@ -7,6 +7,7 @@ import (
"os"
"strings"
"sync"
"time"
"github.com/fsnotify/fsnotify"
"github.com/jmoiron/sqlx"
@@ -273,13 +274,13 @@ func (l *Loader) watcher() {
for {
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatalf("Error creating file watcher: %s", err)
log.Fatalf("Error creating file watcher:\n%s", err)
}
for _, path := range l.saveFiles {
err = watcher.Add(path)
if err != nil {
log.Fatalf("Error watching %s: %s", path, err)
log.Fatalf("Error watching %s:\n%s", path, err)
}
}
@@ -287,16 +288,17 @@ func (l *Loader) watcher() {
case event := <-watcher.Events:
err = watcher.Close()
if err != nil {
log.Fatalf("Error closing watcher: %s", err)
log.Fatalf("Error closing watcher:\n%s", err)
}
time.Sleep(5 * time.Millisecond) // Wait for the rm/rename to finish
err = l.processSavefile(event.Name)
if err != nil {
log.Fatalf("Error reloading save %s: %s", err)
log.Fatalf("Error reloading save %s:\n%s", err)
}
case err := <-watcher.Errors:
log.Fatalf("Error watching save file: %s", err)
log.Fatalf("Error watching save file:\n%s", err)
}
}

68
main.go
View File

@@ -2,10 +2,11 @@ package main
import (
"fmt"
"io/fs"
"log"
"os"
"path"
"strings"
"path/filepath"
"regexp"
"github.com/spf13/pflag"
)
@@ -27,31 +28,9 @@ func main() {
os.Exit(1)
}
saves := make([]string, 0, len(args))
for _, savepath := range args {
info, err := os.Stat(savepath)
if err != nil {
log.Fatalf("%s: %s", savepath, err)
}
if !info.IsDir() {
saves = append(saves, savepath)
continue
}
entries, err := os.ReadDir(savepath)
if err != nil {
log.Fatalf("Directory %s: %s", savepath, err)
}
for _, ent := range entries {
if ent.IsDir() {
continue
}
if strings.HasSuffix(ent.Name(), ".ark") {
saves = append(saves, path.Join(savepath, ent.Name()))
}
}
saves, err := findFiles(args)
if err != nil {
log.Fatal(err)
}
log.Print("Menagerie starting.")
@@ -72,3 +51,38 @@ func main() {
runServer(loader, address)
}
func findFiles(paths []string) ([]string, error) {
savePattern := regexp.MustCompile("[A-Z][a-z]+(_P)?.ark$")
saves := make([]string, 0, len(paths))
for _, path := range paths {
info, err := os.Stat(path)
if err != nil {
return nil, err
}
if !info.IsDir() {
saves = append(saves, path)
continue
}
err = filepath.WalkDir(path, func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if !d.IsDir() && savePattern.MatchString(path) {
saves = append(saves, path)
}
return nil
})
if err != nil {
return nil, fmt.Errorf("Searching %s: %w", path, err)
}
}
return saves, nil
}