package util import ( "os/exec" "path/filepath" "runtime" "strings" ) // UsingCygwinGit indicates whether we believe the host's git utility is from // Cygwin (expects Windows paths as /cygdrive/c/dir/file) or not (expects paths // in host-native format). var UsingCygwinGit = isUsingCygwinGit() func isUsingCygwinGit() bool { if runtime.GOOS == "windows" { // If we find the cygpath utility (which translates between UNIX-style and // Windows-style paths) in the same directory as git, assume we're using // Cygwin. cygpath, err := exec.LookPath("cygpath") if err != nil { return false } var git string git, err = exec.LookPath("git") if err == nil && filepath.Dir(cygpath) == filepath.Dir(git) { return true } } return false } // ToSlashCygwin converts a path to a format suitable for sending to a Cygwin // binary - `/dir/file` on UNIX-style systems; `c:\dir\file` on Windows without // Cygwin; `/cygdrive/c/dir/file` on Windows with Cygwin. func ToSlashCygwin(path string) (string, error) { cmd := exec.Command("cygpath", path) out, err := cmd.Output() return strings.TrimRight(string(out), "\n"), err }