refined how ResourcePath in paths package works

now works more like the standard filepath.Join() function
This commit is contained in:
JetSetIlly 2021-10-03 06:53:37 +01:00
parent 130bd32c7f
commit 0025d2ee3a
20 changed files with 83 additions and 84 deletions

View file

@ -50,7 +50,7 @@ func newPreferences(dsm *Disassembly) (*Preferences, error) {
p.mirrorOrigin = memorymap.OriginCartFxxxMirror
// save server using the prefs package
pth, err := paths.ResourcePath("", prefs.DefaultPrefsFile)
pth, err := paths.ResourcePath(prefs.DefaultPrefsFile)
if err != nil {
return nil, err
}

View file

@ -414,7 +414,7 @@ func play(md *modalflag.Modes, sync *mainSync) error {
func debug(md *modalflag.Modes, sync *mainSync) error {
md.NewMode()
defInitScript, err := paths.ResourcePath("", defaultInitScript)
defInitScript, err := paths.ResourcePath(defaultInitScript)
if err != nil {
return err
}

View file

@ -84,7 +84,7 @@ func NewPreferences() (*Preferences, error) {
p.SetDefaults()
// save server using the prefs package
pth, err := paths.ResourcePath("", prefs.DefaultPrefsFile)
pth, err := paths.ResourcePath(prefs.DefaultPrefsFile)
if err != nil {
return nil, err
}

View file

@ -36,7 +36,7 @@ func NewPreferences() (*Preferences, error) {
p.SetDefaults()
// save server using the prefs package
pth, err := paths.ResourcePath("", prefs.DefaultPrefsFile)
pth, err := paths.ResourcePath(prefs.DefaultPrefsFile)
if err != nil {
return nil, err
}

View file

@ -67,7 +67,7 @@ func newPreferences(img *SdlImgui) (*preferences, error) {
p.superchargerNotifications.Set(true)
// setup preferences
pth, err := paths.ResourcePath("", prefs.DefaultPrefsFile)
pth, err := paths.ResourcePath(prefs.DefaultPrefsFile)
if err != nil {
return nil, err
}
@ -139,7 +139,7 @@ func (p *preferences) setWindowPreferences(isPlayMode bool) error {
}
// setup preferences
pth, err := paths.ResourcePath("", prefs.DefaultPrefsFile)
pth, err := paths.ResourcePath(prefs.DefaultPrefsFile)
if err != nil {
return err
}

View file

@ -137,7 +137,7 @@ func NewSdlImgui(tv *television.Television) (*SdlImgui, error) {
return nil, curated.Errorf("sdlimgui: %v", err)
}
iniPath, err := paths.ResourcePath("", imguiIniFile)
iniPath, err := paths.ResourcePath(imguiIniFile)
if err != nil {
return nil, curated.Errorf("sdlimgui: %v", err)
}

View file

@ -45,7 +45,7 @@ func newPreferences() (*Preferences, error) {
p.ID.SetMaxLen(MaxIDLength)
// save server using the prefs package
pth, err := paths.ResourcePath("", prefs.DefaultPrefsFile)
pth, err := paths.ResourcePath(prefs.DefaultPrefsFile)
if err != nil {
return nil, err
}

View file

@ -75,7 +75,7 @@ func loadBIOS(path string) ([]uint8, error) {
// the emulator's resource path
for _, b := range biosFile {
p, err := paths.ResourcePath("", b)
p, err := paths.ResourcePath(b)
if err != nil {
return nil, err
}

View file

@ -83,7 +83,7 @@ func NewPreferences() (*Preferences, error) {
p.SetDefaults()
// setup preferences and load from disk
pth, err := paths.ResourcePath("", prefs.DefaultPrefsFile)
pth, err := paths.ResourcePath(prefs.DefaultPrefsFile)
if err != nil {
return nil, err
}

View file

@ -60,7 +60,7 @@ func newEeprom() *EEPROM {
// Read EEPROM data from disk.
func (ee *EEPROM) Read() {
fn, err := paths.ResourcePath("", saveKeyPath)
fn, err := paths.ResourcePath(saveKeyPath)
if err != nil {
logger.Logf("savekey", "could not load eeprom file (%s)", err)
return
@ -98,7 +98,7 @@ func (ee *EEPROM) Read() {
// Write EEPROM data to disk.
func (ee *EEPROM) Write() {
fn, err := paths.ResourcePath("", saveKeyPath)
fn, err := paths.ResourcePath(saveKeyPath)
if err != nil {
logger.Logf("savekey", "could not write eeprom file (%s)", err)
return

View file

@ -57,7 +57,7 @@ func newPreferences() (*Preferences, error) {
p := &Preferences{}
// save server using the prefs package
pth, err := paths.ResourcePath("", prefs.DefaultPrefsFile)
pth, err := paths.ResourcePath(prefs.DefaultPrefsFile)
if err != nil {
return nil, curated.Errorf("revision: %v", err)
}

View file

@ -37,7 +37,7 @@ func newPreferences() (*Preferences, error) {
p := &Preferences{}
// save server using the prefs package
pth, err := paths.ResourcePath("", prefs.DefaultPrefsFile)
pth, err := paths.ResourcePath(prefs.DefaultPrefsFile)
if err != nil {
return nil, curated.Errorf("hiscore: %v", err)
}

View file

@ -18,28 +18,8 @@
package paths
import (
"os"
"path/filepath"
"github.com/jetsetilly/gopher2600/paths/fs"
)
const gopherConfigDir = ".gopher2600"
// the non-release version of getBasePath looks for and if necessary creates
// the gopherConfigDir (and child directories) in the current working
// directory.
func getBasePath(subPth string) (string, error) {
pth := filepath.Join(gopherConfigDir, subPth)
if _, err := os.Stat(pth); err == nil {
return pth, nil
}
if err := fs.MkdirAll(pth, 0700); err != nil {
return "", err
}
return pth, nil
func baseResourcePath() (string, error) {
return gopherConfigDir, nil
}

View file

@ -15,26 +15,33 @@
package paths
import "path/filepath"
import (
"os"
"path/filepath"
// ResourcePath returns the resource string (representing the resource to be
// loaded) prepended with OS/build specific paths.
//
// The function takes care of creation of all folders necessary to reach the
// end of sub-path. It does not otherwise touch or create the file.
//
// Either subPth or file can be empty, depending on context.
func ResourcePath(subPth string, file string) (string, error) {
var pth []string
"github.com/jetsetilly/gopher2600/paths/fs"
)
basePath, err := getBasePath(subPth)
// ResourcePath prepends the supplied path with a with OS/build specific base
// paths
//
// The function creates all folders necessary to reach the end of sub-path. It
// does not otherwise touch or create the file.
func ResourcePath(path ...string) (string, error) {
b, err := baseResourcePath()
if err != nil {
return "", err
}
pth = make([]string, 0)
pth = append(pth, basePath)
pth = append(pth, file)
p := filepath.Join(b, filepath.Join(path...))
return filepath.Join(pth...), nil
if _, err := os.Stat(p); err == nil {
return p, nil
}
if err := fs.MkdirAll(filepath.Dir(p), 0700); err != nil {
return "", err
}
return p, nil
}

View file

@ -22,7 +22,7 @@ import (
"github.com/jetsetilly/gopher2600/test"
)
func TestPaths(t *testing.T) {
func TestResourcePath(t *testing.T) {
pth, err := paths.ResourcePath("foo/bar", "baz")
test.Equate(t, err, nil)
test.Equate(t, pth, ".gopher2600/foo/bar/baz")
@ -39,3 +39,25 @@ func TestPaths(t *testing.T) {
test.Equate(t, err, nil)
test.Equate(t, pth, ".gopher2600")
}
func TestResourceFile(t *testing.T) {
pth, err := paths.ResourcePath("foo/bar", "baz")
test.Equate(t, err, nil)
test.Equate(t, pth, ".gopher2600/foo/bar/baz")
pth, err = paths.ResourcePath("foo", "bar", "baz")
test.Equate(t, err, nil)
test.Equate(t, pth, ".gopher2600/foo/bar/baz")
pth, err = paths.ResourcePath("foo/bar", "")
test.Equate(t, err, nil)
test.Equate(t, pth, ".gopher2600/foo/bar")
pth, err = paths.ResourcePath("", "baz")
test.Equate(t, err, nil)
test.Equate(t, pth, ".gopher2600/baz")
pth, err = paths.ResourcePath("", "")
test.Equate(t, err, nil)
test.Equate(t, pth, ".gopher2600")
}

View file

@ -21,31 +21,15 @@ package paths
import (
"os"
"path/filepath"
"github.com/jetsetilly/gopher2600/paths/fs"
)
const gopherConfigDir = "gopher2600"
// the release version of getBasePath looks for and if necessary creates the
// gopherConfigDir (and child directories) in the User's configuration
// directory, which is dependent on the host OS (see os.UserConfigDir()
// documentation for details).
func getBasePath(subPth string) (string, error) {
cnf, err := os.UserConfigDir()
func baseResourcePath() (string, error) {
p, err := os.UserConfigDir()
if err != nil {
return "", err
}
pth := filepath.Join(cnf, gopherConfigDir, subPth)
if _, err := os.Stat(pth); err == nil {
return pth, nil
}
if err := fs.MkdirAll(pth, 0700); err != nil {
return "", err
}
return pth, nil
return filepath.Join(p, gopherConfigDir), nil
}

View file

@ -33,8 +33,9 @@ const ansiClearLine = "\033[2K"
// the location of the regressionDB file and the location of any regression
// scripts. these should be wrapped by paths.ResourcePath().
const regressionDBFile = "regressionDB"
const regressionScripts = "regressionScripts"
const regressionPath = "regression"
const regressionDBFile = "db"
const regressionScripts = "scripts"
// Regressor is the generic entry type in the regressionDB.
type Regressor interface {
@ -75,7 +76,7 @@ func RegressList(output io.Writer) error {
return curated.Errorf("regression: list: io.Writer should not be nil (use a nopWriter)")
}
dbPth, err := paths.ResourcePath("", regressionDBFile)
dbPth, err := paths.ResourcePath(regressionPath, regressionDBFile)
if err != nil {
return curated.Errorf("regression: list: %v", err)
}
@ -98,7 +99,7 @@ func RegressAdd(output io.Writer, reg Regressor) error {
return curated.Errorf("regression: add: io.Writer should not be nil (use a nopWriter)")
}
dbPth, err := paths.ResourcePath("", regressionDBFile)
dbPth, err := paths.ResourcePath(regressionPath, regressionDBFile)
if err != nil {
return curated.Errorf("regression: add: %v", err)
}
@ -143,7 +144,7 @@ func RegressRedux(output io.Writer, confirmation io.Reader) error {
return nil
}
dbPth, err := paths.ResourcePath("", regressionDBFile)
dbPth, err := paths.ResourcePath(regressionPath, regressionDBFile)
if err != nil {
return curated.Errorf("regression: redux: %v", err)
}
@ -218,7 +219,7 @@ func RegressCleanup(output io.Writer, confirmation io.Reader) error {
return nil
}
dbPth, err := paths.ResourcePath("", regressionDBFile)
dbPth, err := paths.ResourcePath(regressionPath, regressionDBFile)
if err != nil {
return curated.Errorf("regression: cleanup: %v", err)
}
@ -256,7 +257,7 @@ func RegressCleanup(output io.Writer, confirmation io.Reader) error {
}
// gather list of files on disk in path
scriptPth, err := paths.ResourcePath("", regressionScripts)
scriptPth, err := paths.ResourcePath(regressionPath, regressionScripts)
if err != nil {
return curated.Errorf("regression: list: %v", err)
}
@ -280,7 +281,7 @@ func RegressCleanup(output io.Writer, confirmation io.Reader) error {
for _, e := range filesOnDisk {
found := false
n, err := paths.ResourcePath(regressionScripts, e.Name())
n, err := paths.ResourcePath(regressionPath, regressionScripts, e.Name())
if err != nil {
return curated.Errorf("regression: cleanup: %v", err)
}
@ -332,7 +333,7 @@ func RegressDelete(output io.Writer, confirmation io.Reader, key string) error {
return curated.Errorf("regression: delete: invalid key [%s]", key)
}
dbPth, err := paths.ResourcePath("", regressionDBFile)
dbPth, err := paths.ResourcePath(regressionPath, regressionDBFile)
if err != nil {
return curated.Errorf("regression: delete: %v", err)
}
@ -368,7 +369,7 @@ func RegressRun(output io.Writer, verbose bool, filterKeys []string) error {
return curated.Errorf("regression: run: io.Writer should not be nil (use a nopWriter)")
}
dbPth, err := paths.ResourcePath("", regressionDBFile)
dbPth, err := paths.ResourcePath(regressionPath, regressionDBFile)
if err != nil {
return curated.Errorf("regression: run: %v", err)
}

View file

@ -26,7 +26,12 @@ import (
func uniqueFilename(prepend string, cartload cartridgeloader.Loader) (string, error) {
f := paths.UniqueFilename(prepend, cartload.ShortName())
scrPth, err := paths.ResourcePath(regressionScripts, f)
scriptsPath, err := paths.ResourcePath(regressionPath, regressionScripts)
if err != nil {
return "", err
}
scrPth, err := paths.ResourcePath(scriptsPath, f)
if err != nil {
return "", err
}

View file

@ -50,7 +50,7 @@ func newPreferences(r *Rewind) (*Preferences, error) {
p.Freq.Set(snapshotFreq)
// save server using the prefs package
pth, err := paths.ResourcePath("", prefs.DefaultPrefsFile)
pth, err := paths.ResourcePath(prefs.DefaultPrefsFile)
if err != nil {
return nil, err
}

View file

@ -65,7 +65,7 @@ func AttachCartridge(vcs *hardware.VCS, cartload cartridgeloader.Loader) error {
return curated.Errorf("setup: %v", err)
}
dbPth, err := paths.ResourcePath("", setupDBFile)
dbPth, err := paths.ResourcePath(setupDBFile)
if err != nil {
return curated.Errorf("setup: %v", err)
}