github.com/buildpack/pack@v0.5.0/internal/paths/paths.go (about) 1 package paths 2 3 import ( 4 "net/url" 5 "os" 6 "path/filepath" 7 "regexp" 8 "runtime" 9 "strings" 10 ) 11 12 var schemeRegexp = regexp.MustCompile(`^.+://.*`) 13 14 func IsURI(ref string) bool { 15 return schemeRegexp.MatchString(ref) 16 } 17 18 func IsDir(path string) (bool, error) { 19 fileInfo, err := os.Stat(path) 20 if err != nil { 21 return false, err 22 } 23 24 return fileInfo.IsDir(), nil 25 } 26 27 func FilePathToURI(path string) (string, error) { 28 var err error 29 if !filepath.IsAbs(path) { 30 path, err = filepath.Abs(path) 31 if err != nil { 32 return "", err 33 } 34 } 35 36 if runtime.GOOS == "windows" { 37 if strings.HasPrefix(path, `\\`) { 38 return "file://" + filepath.ToSlash(strings.TrimPrefix(path, `\\`)), nil 39 } 40 return "file:///" + filepath.ToSlash(path), nil 41 } 42 return "file://" + path, nil 43 } 44 45 // examples: 46 // 47 // - unix file: file://laptop/some%20dir/file.tgz 48 // 49 // - windows drive: file:///C:/Documents%20and%20Settings/file.tgz 50 // 51 // - windows share: file://laptop/My%20Documents/file.tgz 52 // 53 func URIToFilePath(uri string) (string, error) { 54 var ( 55 osPath string 56 err error 57 ) 58 59 osPath = filepath.FromSlash(strings.TrimPrefix(uri, "file://")) 60 61 if osPath, err = url.PathUnescape(osPath); err != nil { 62 return "", nil 63 } 64 65 if runtime.GOOS == "windows" { 66 if strings.HasPrefix(osPath, `\`) { 67 return strings.TrimPrefix(osPath, `\`), nil 68 } 69 return `\\` + osPath, nil 70 } 71 return osPath, nil 72 } 73 74 func ToAbsolute(uri, relativeTo string) (string, error) { 75 parsed, err := url.Parse(uri) 76 if err != nil { 77 return "", err 78 } 79 80 if parsed.Scheme == "" { 81 if !filepath.IsAbs(parsed.Path) { 82 absPath := filepath.Join(relativeTo, parsed.Path) 83 return FilePathToURI(absPath) 84 } 85 } 86 87 return uri, nil 88 }