mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-11-30 10:10:21 +00:00
50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
package parser
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
func normalizePath(path string) string {
|
|
// use lower case, as Windows file systems will almost always be case insensitive
|
|
return strings.ToLower(strings.Replace(path, "\\", "/", -1))
|
|
}
|
|
|
|
func getPkgPath(fname string, isDir bool) (string, error) {
|
|
// path.IsAbs doesn't work properly on Windows; use filepath.IsAbs instead
|
|
if !filepath.IsAbs(fname) {
|
|
pwd, err := os.Getwd()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
fname = path.Join(pwd, fname)
|
|
}
|
|
|
|
fname = normalizePath(fname)
|
|
|
|
gopath := os.Getenv("GOPATH")
|
|
if gopath == "" {
|
|
var err error
|
|
gopath, err = getDefaultGoPath()
|
|
if err != nil {
|
|
return "", fmt.Errorf("cannot determine GOPATH: %s", err)
|
|
}
|
|
}
|
|
|
|
for _, p := range strings.Split(os.Getenv("GOPATH"), ";") {
|
|
prefix := path.Join(normalizePath(p), "src") + "/"
|
|
if rel := strings.TrimPrefix(fname, prefix); rel != fname {
|
|
if !isDir {
|
|
return path.Dir(rel), nil
|
|
} else {
|
|
return path.Clean(rel), nil
|
|
}
|
|
}
|
|
}
|
|
|
|
return "", fmt.Errorf("file '%v' is not in GOPATH", fname)
|
|
}
|