diff --git a/.gitignore b/.gitignore index dc0daa9..52d5d04 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ vendor bin .vscode sshcode +sshcode.exe \ No newline at end of file diff --git a/README.md b/README.md index dddd19e..802b704 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ We currently support: - Linux - MacOS - WSL +- Windows Git Bash (MINGW64) - Requires rsync for Windows. To install rsync download it [here](http://repo.msys2.org/msys/x86_64/rsync-3.1.3-1-x86_64.pkg.tar.xz) and run `tar xvf rsync-3.1.3-1-x86_64.pkg.tar.xz` on Git bash. Don't forget to copy the executable to a folder in the PATH ` cp usr/bin/rsync.exe /mingw64/bin`. For the remote server, we currently only support Linux `x86_64` (64-bit) servers with `glibc`. `musl` libc (which is most notably used by Alpine Linux) diff --git a/main.go b/main.go index 2a63211..b26a837 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,9 @@ import ( "fmt" "math/rand" "os" + "os/user" + "path/filepath" + "runtime" "strings" "time" @@ -77,6 +80,11 @@ func (c *rootCmd) Run(fl *flag.FlagSet) { dir = "~" } + // Get linux relative path if on windows + if runtime.GOOS == "windows" { + dir = relativeWindowsPath(dir) + } + err := sshCode(host, dir, options{ skipSync: c.skipSync, sshFlags: c.sshFlags, @@ -112,3 +120,24 @@ Arguments: helpTab, ) } + +func relativeWindowsPath(dir string) string { + usr, err := user.Current() + if err != nil { + flog.Error("Could not get user: %v", err) + return dir + } + rel, err := filepath.Rel(usr.HomeDir, dir) + if err != nil { + return dir + } + rel = "~/" + filepath.ToSlash(rel) + return rel +} + +// gitbashWindowsDir translates a directory similar to `C:\Users\username\path` to `~/path` for compatibility with Git bash. +func gitbashWindowsDir(dir string) (res string) { + res = filepath.ToSlash(dir) + res = "/" + strings.Replace(res, ":", "", -1) + return res +} diff --git a/settings.go b/settings.go index ad962a3..a3bd1cd 100644 --- a/settings.go +++ b/settings.go @@ -24,6 +24,9 @@ func configDir() (string, error) { path = os.ExpandEnv("$HOME/.config/Code/User/") case "darwin": path = os.ExpandEnv("$HOME/Library/Application Support/Code/User/") + case "windows": + // Can't use the filepath.Clean function to keep Linux format path that works well with gitbash + return gitbashWindowsDir(os.ExpandEnv("$HOME/.config/Code/User")), nil default: return "", xerrors.Errorf("unsupported platform: %s", runtime.GOOS) } @@ -39,6 +42,9 @@ func extensionsDir() (string, error) { switch runtime.GOOS { case "linux", "darwin": path = os.ExpandEnv("$HOME/.vscode/extensions/") + case "windows": + // Can't use the filepath.Clean function to keep Linux format path that works well with gitbash + return gitbashWindowsDir(os.ExpandEnv("$HOME/.vscode/extensions")), nil default: return "", xerrors.Errorf("unsupported platform: %s", runtime.GOOS) } diff --git a/sshcode.go b/sshcode.go index ad2235e..5235c1d 100644 --- a/sshcode.go +++ b/sshcode.go @@ -494,8 +494,8 @@ curl $curlflags https://codesrv-ci.cdr.sh/latest-linux ln latest-linux %v chmod +x %v`, codeServerPath, - filepath.Dir(codeServerPath), - filepath.Dir(codeServerPath), + filepath.ToSlash(filepath.Dir(codeServerPath)), + filepath.ToSlash(filepath.Dir(codeServerPath)), codeServerPath, codeServerPath, codeServerPath,