github.com/searchspring/haus@v0.1.8-0.20200414161854-a7ca8bb9ea93/fileutils/dir.go (about)

     1  package fileutils
     2  
     3  import(
     4  	"os"
     5  	"strings"
     6  	"path/filepath"
     7  	"fmt"
     8  )
     9  
    10  
    11  // expandTilde expands ~ to value of ENV HOME
    12  func expandTilde(f string) string {
    13  	if strings.HasPrefix(f, "~"+string(filepath.Separator)) {
    14  		return os.Getenv("HOME") + f[1:]
    15  	}
    16  	return f
    17  }
    18  
    19  // CreatePath check for path and create if it doesn't exist
    20  func CreatePath(path string) (string, error) {
    21  	// Get a abs path
    22  	absPath,err := filepath.Abs(expandTilde(path))
    23  	if err != nil {
    24  		return "", err
    25  	}
    26  	// check if path exists
    27  	stat,err := os.Stat(absPath)
    28  	// create path if it doesn't or throw error if it's not a dir 
    29  	if stat == nil && os.IsNotExist(err) {
    30  		err := os.MkdirAll(absPath, 0755)
    31  		if err != nil {
    32  			return "", err
    33  		}
    34  	} else if !stat.IsDir() {
    35  		err := fmt.Errorf("path: %#v exists but is not a directory\n", path)
    36  		return "", err
    37  	}
    38  
    39  	return absPath, nil
    40  }
    41  
    42  // CreateSymlink check for symlink and create it if doesn't exist
    43  func CreateSymlink(opath string, npath string) (string, error) {
    44  	// Get clean abs paths
    45  	cleanOpath := filepath.Clean(expandTilde(opath))
    46  	cleanNpath := filepath.Clean(expandTilde(npath))
    47  	stat,err := os.Lstat(cleanNpath)
    48  	if stat == nil {
    49  		// Create dir path for npath if it doesn't exist
    50  		dirNpath := filepath.Dir(cleanNpath)
    51  		err = nil
    52  		_,err = CreatePath(dirNpath)
    53  		if err != nil {
    54  			return "", fmt.Errorf("Cannot create dir path \n%#v\n for \n%#v\n : %s", dirNpath, cleanNpath, err)
    55  		}
    56  		// Symlink
    57  		err = os.Symlink(cleanOpath+"/",cleanNpath)
    58  		if err != nil {
    59  			return "",err
    60  		}
    61  	}
    62  	return cleanNpath, err
    63  }
    64