From def8985dcdefff0a101370f04d8ddd2267ebfbad Mon Sep 17 00:00:00 2001 From: Christopher Allen Lane Date: Mon, 4 Jul 2022 16:55:57 -0400 Subject: [PATCH] fix: Windows support Fix an issue whereby the installer installed cheatsheets into the wrong directory on Windows. This occurred because previously `path.Join` was used where `path/filepath.Join` should have been used. This matters, because the former always uses `/` as the path separator, whereas the latter will use `/` or `\` as is appropriate for the runtime environment. This should resolve bullet point 4 in #665. --- cmd/cheat/cmd_edit.go | 10 +++++----- cmd/cheat/cmd_init.go | 8 ++++---- internal/config/config_test.go | 6 +++--- internal/config/paths.go | 10 +++++----- internal/installer/run.go | 10 ++++++---- internal/sheet/copy.go | 4 ++-- 6 files changed, 25 insertions(+), 23 deletions(-) diff --git a/cmd/cheat/cmd_edit.go b/cmd/cheat/cmd_edit.go index 7ab2b0e..ee17399 100644 --- a/cmd/cheat/cmd_edit.go +++ b/cmd/cheat/cmd_edit.go @@ -4,7 +4,7 @@ import ( "fmt" "os" "os/exec" - "path" + "path/filepath" "strings" "github.com/cheat/cheat/internal/cheatpath" @@ -58,10 +58,10 @@ func cmdEdit(opts map[string]interface{}, conf config.Config) { } // compute the new edit path - editpath = path.Join(writepath.Path, sheet.Title) + editpath = filepath.Join(writepath.Path, sheet.Title) // create any necessary subdirectories - dirs := path.Dir(editpath) + dirs := filepath.Dir(editpath) if dirs != "." { if err := os.MkdirAll(dirs, 0755); err != nil { fmt.Fprintf(os.Stderr, "failed to create directory: %s, %v\n", dirs, err) @@ -87,10 +87,10 @@ func cmdEdit(opts map[string]interface{}, conf config.Config) { } // compute the new edit path - editpath = path.Join(writepath.Path, cheatsheet) + editpath = filepath.Join(writepath.Path, cheatsheet) // create any necessary subdirectories - dirs := path.Dir(editpath) + dirs := filepath.Dir(editpath) if dirs != "." { if err := os.MkdirAll(dirs, 0755); err != nil { fmt.Fprintf(os.Stderr, "failed to create directory: %s, %v\n", dirs, err) diff --git a/cmd/cheat/cmd_init.go b/cmd/cheat/cmd_init.go index 1c2891e..47bdde7 100644 --- a/cmd/cheat/cmd_init.go +++ b/cmd/cheat/cmd_init.go @@ -3,7 +3,7 @@ package main import ( "fmt" "os" - "path" + "path/filepath" "runtime" "strings" @@ -42,11 +42,11 @@ func cmdInit() { // determine the appropriate paths for config data and (optional) community // cheatsheets based on the user's platform confpath := confpaths[0] - confdir := path.Dir(confpath) + confdir := filepath.Dir(confpath) // create paths for community and personal cheatsheets - community := path.Join(confdir, "/cheatsheets/community") - personal := path.Join(confdir, "/cheatsheets/personal") + community := filepath.Join(confdir, "cheatsheets", "community") + personal := filepath.Join(confdir, "cheatsheets", "personal") // template the above paths into the default configs configs = strings.Replace(configs, "COMMUNITY_PATH", community, -1) diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 084312f..9bb7f31 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -39,17 +39,17 @@ func TestConfigSuccessful(t *testing.T) { // assert that the cheatpaths are correct want := []cheatpath.Cheatpath{ cheatpath.Cheatpath{ - Path: filepath.Join(home, ".dotfiles/cheat/community"), + Path: filepath.Join(home, ".dotfiles", "cheat", "community"), ReadOnly: true, Tags: []string{"community"}, }, cheatpath.Cheatpath{ - Path: filepath.Join(home, ".dotfiles/cheat/work"), + Path: filepath.Join(home, ".dotfiles", "cheat", "work"), ReadOnly: false, Tags: []string{"work"}, }, cheatpath.Cheatpath{ - Path: filepath.Join(home, ".dotfiles/cheat/personal"), + Path: filepath.Join(home, ".dotfiles", "cheat", "personal"), ReadOnly: false, Tags: []string{"personal"}, }, diff --git a/internal/config/paths.go b/internal/config/paths.go index 8ce34bc..7818fbd 100644 --- a/internal/config/paths.go +++ b/internal/config/paths.go @@ -33,20 +33,20 @@ func Paths( // don't include the `XDG_CONFIG_HOME` path if that envvar is not set if xdgpath, ok := envvars["XDG_CONFIG_HOME"]; ok { - paths = append(paths, filepath.Join(xdgpath, "/cheat/conf.yml")) + paths = append(paths, filepath.Join(xdgpath, "cheat", "conf.yml")) } paths = append(paths, []string{ - filepath.Join(home, ".config/cheat/conf.yml"), - filepath.Join(home, ".cheat/conf.yml"), + filepath.Join(home, ".config", "cheat", "conf.yml"), + filepath.Join(home, ".cheat", "conf.yml"), "/etc/cheat/conf.yml", }...) return paths, nil case "windows": return []string{ - filepath.Join(envvars["APPDATA"], "/cheat/conf.yml"), - filepath.Join(envvars["PROGRAMDATA"], "/cheat/conf.yml"), + filepath.Join(envvars["APPDATA"], "cheat", "conf.yml"), + filepath.Join(envvars["PROGRAMDATA"], "cheat", "conf.yml"), }, nil default: return []string{}, fmt.Errorf("unsupported os: %s", sys) diff --git a/internal/installer/run.go b/internal/installer/run.go index 50267bf..02133b6 100644 --- a/internal/installer/run.go +++ b/internal/installer/run.go @@ -3,7 +3,7 @@ package installer import ( "fmt" "os" - "path" + "path/filepath" "strings" "github.com/cheat/cheat/internal/config" @@ -14,11 +14,11 @@ func Run(configs string, confpath string) error { // determine the appropriate paths for config data and (optional) community // cheatsheets based on the user's platform - confdir := path.Dir(confpath) + confdir := filepath.Dir(confpath) // create paths for community and personal cheatsheets - community := path.Join(confdir, "/cheatsheets/community") - personal := path.Join(confdir, "/cheatsheets/personal") + community := filepath.Join(confdir, "cheatsheets", "community") + personal := filepath.Join(confdir, "cheatsheets", "personal") // template the above paths into the default configs configs = strings.Replace(configs, "COMMUNITY_PATH", community, -1) @@ -36,11 +36,13 @@ func Run(configs string, confpath string) error { // clone the community cheatsheets if so instructed if yes { // clone the community cheatsheets + fmt.Printf("Cloning community cheatsheets to %s.\n", community) if err := clone(community); err != nil { return fmt.Errorf("failed to clone cheatsheets: %v", err) } // also create a directory for personal cheatsheets + fmt.Printf("Cloning personal cheatsheets to %s.\n", personal) if err := os.MkdirAll(personal, os.ModePerm); err != nil { return fmt.Errorf("failed to create directory: %v", err) } diff --git a/internal/sheet/copy.go b/internal/sheet/copy.go index 30a206f..47cf491 100644 --- a/internal/sheet/copy.go +++ b/internal/sheet/copy.go @@ -4,7 +4,7 @@ import ( "fmt" "io" "os" - "path" + "path/filepath" ) // Copy copies a cheatsheet to a new location @@ -22,7 +22,7 @@ func (s *Sheet) Copy(dest string) error { defer infile.Close() // create any necessary subdirectories - dirs := path.Dir(dest) + dirs := filepath.Dir(dest) if dirs != "." { if err := os.MkdirAll(dirs, 0755); err != nil { return fmt.Errorf("failed to create directory: %s, %v", dirs, err)