github.com/tilt-dev/wat@v0.0.2-0.20180626175338-9349b638e250/os/ospath/ospath.go (about)

     1  package ospath
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  
     7  	"github.com/windmilleng/wat/data/pathutil"
     8  )
     9  
    10  func Child(dir string, file string) (string, bool) {
    11  	return pathutil.Child(theOsPathUtil, dir, file)
    12  }
    13  
    14  func RealChild(dir string, file string) (string, bool, error) {
    15  	realDir, err := RealAbs(dir)
    16  	if err != nil {
    17  		return "", false, err
    18  	}
    19  	realFile, err := RealAbs(file)
    20  	if err != nil {
    21  		return "", false, err
    22  	}
    23  
    24  	rel, isChild := Child(realDir, realFile)
    25  	return rel, isChild, nil
    26  }
    27  
    28  // Returns the absolute version of this path, resolving all symlinks.
    29  func RealAbs(path string) (string, error) {
    30  	// Make the path absolute first, so that we find any symlink parents.
    31  	absPath, err := filepath.Abs(path)
    32  	if err != nil {
    33  		return "", err
    34  	}
    35  
    36  	// Resolve the symlinks.
    37  	realPath, err := filepath.EvalSymlinks(absPath)
    38  	if err != nil {
    39  		return "", err
    40  	}
    41  
    42  	// Double-check we're still absolute.
    43  	return filepath.Abs(realPath)
    44  }
    45  
    46  // Like os.Getwd, but with all symlinks resolved.
    47  func Realwd() (string, error) {
    48  	path, err := os.Getwd()
    49  	if err != nil {
    50  		return "", err
    51  	}
    52  	return RealAbs(path)
    53  }
    54  
    55  func IsDir(path string) bool {
    56  	f, err := os.Stat(path)
    57  	if err != nil {
    58  		return false
    59  	}
    60  
    61  	return f.Mode().IsDir()
    62  }
    63  
    64  type osPathUtil struct{}
    65  
    66  func (p osPathUtil) Base(path string) string                  { return filepath.Base(path) }
    67  func (p osPathUtil) Dir(path string) string                   { return filepath.Dir(path) }
    68  func (p osPathUtil) Join(a, b string) string                  { return filepath.Join(a, b) }
    69  func (p osPathUtil) Match(pattern, path string) (bool, error) { return filepath.Match(pattern, path) }
    70  func (p osPathUtil) Separator() rune                          { return filepath.Separator }
    71  
    72  var theOsPathUtil = osPathUtil{}