mirror of
https://github.com/justinian/menagerie.git
synced 2025-12-11 00:54:33 -08:00
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:
12
loader.go
12
loader.go
@@ -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
68
main.go
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user