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  }