diff --git a/internal/presets/linux_scan_test.go b/internal/presets/linux_scan_test.go index 41890790..f2daa442 100644 --- a/internal/presets/linux_scan_test.go +++ b/internal/presets/linux_scan_test.go @@ -288,6 +288,37 @@ func TestRetroDECKDetection(t *testing.T) { } } +// RetroDECK installed in a folder of the user's choosing, as a user had it: +// ~/Games/Retrodeck/retrodeck/saves. Its systems are found there too. +func TestRetroDECKDetection_ChosenFolder(t *testing.T) { + t.Setenv("XDG_DATA_HOME", "") + t.Setenv("XDG_CONFIG_HOME", "") + home := t.TempDir() + for _, system := range []string{"ps2", "snes"} { + p := filepath.Join(home, "Games", "Retrodeck", "retrodeck", "saves", system) + if err := os.MkdirAll(p, 0o777); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(p, "game.srm"), []byte("x"), 0o666); err != nil { + t.Fatal(err) + } + } + + sc := &Scanner{CacheFile: filepath.Join(t.TempDir(), "cache.json"), GOOS: "linux", HomeDir: home} + got := map[string]string{} + for _, d := range sc.Scan(nil) { + if strings.HasPrefix(d.ID, "retrodeck-") { + got[d.ID] = d.SavePath + } + } + for _, system := range []string{"ps2", "snes"} { + want := filepath.Join(home, "Games", "Retrodeck", "retrodeck", "saves", system) + if got["retrodeck-"+system] != want { + t.Errorf("%s: found at %q, want %q (all: %v)", system, got["retrodeck-"+system], want, got) + } + } +} + // TestPresetGlobPaths: SD-card style wildcard locations resolve through // filepath.Glob. func TestPresetGlobPaths(t *testing.T) { diff --git a/internal/presets/presets.go b/internal/presets/presets.go index dce33461..b11f6d50 100644 --- a/internal/presets/presets.go +++ b/internal/presets/presets.go @@ -189,13 +189,17 @@ var presetDefs = []preset{ }}, // RetroDECK keeps every system's saves in one tree as well: - // retrodeck/saves/, in the home folder, or on an SD card when it - // was moved there. + // retrodeck/saves/. Its folder is always named retrodeck, but it + // goes wherever the user chose: the home folder by default, a folder in + // it (~/Games/Retrodeck/retrodeck, as a user had it), or an SD card. {ID: "retrodeck", Name: "RetroDECK", Type: "emulator", IsWrapper: true, LinuxPath: []string{ "~/retrodeck/saves", + "~/*/retrodeck/saves", + "~/*/*/retrodeck/saves", "/run/media/*/retrodeck/saves", "/run/media/*/*/retrodeck/saves", + "/run/media/*/*/*/retrodeck/saves", }}, // Steam-emulator / repack wrappers (each subfolder = one game). These