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