// os-util.go package utils import ( "fmt" "os" "os/user" "path" "path/filepath" "strings" ) func ExpandPath(sourcePath string) (expandedPath string, err error) { if strings.HasPrefix(sourcePath, "~") { var home, userName, remainder string slashPos := strings.IndexRune(sourcePath, '/') if slashPos > 0 { userName = sourcePath[1:slashPos] remainder = sourcePath[slashPos:] } else { userName = sourcePath[1:] } if len(userName) == 0 { home, err = os.UserHomeDir() if err != nil { return } } else { var userInfo *user.User userInfo, err = user.Lookup(userName) if err != nil { return } home = userInfo.HomeDir } expandedPath = os.ExpandEnv(path.Join(home, remainder)) } else { expandedPath = os.ExpandEnv(sourcePath) } return } func ExpandPathV(sourcePath string, maps ...map[string]string) (expandedPath string, err error) { var normalizedPath string if strings.HasPrefix(sourcePath, "~") { var home, userName, remainder string slashPos := strings.IndexRune(sourcePath, '/') if slashPos > 0 { userName = sourcePath[1:slashPos] remainder = sourcePath[slashPos:] } else { userName = sourcePath[1:] } if len(userName) == 0 { home, err = os.UserHomeDir() if err != nil { return } } else { var userInfo *user.User userInfo, err = user.Lookup(userName) if err != nil { return } home = userInfo.HomeDir } normalizedPath = path.Join(home, remainder) } else { normalizedPath = sourcePath } expandedPath = os.Expand(normalizedPath, func(name string) (value string) { var ok bool for _, vars := range maps { if value, ok = vars[name]; ok { break } } if !ok { value = os.Getenv(name) } return }) return } func ExpandRealPath(sourcePath string) (expandedRealPath string, err error) { var expandedPath string if expandedPath, err = ExpandPath(sourcePath); err == nil { if expandedPath, err = filepath.Abs(expandedPath); err == nil { expandedRealPath, err = filepath.EvalSymlinks(expandedPath) } } return } func GetProgramDirPath() (dir string, err error) { var exe string exe, err = os.Executable() if err == nil { exe, err = filepath.EvalSymlinks(exe) if err == nil { exe, err = filepath.Abs(exe) if err == nil { dir = filepath.Dir(exe) } } } return } func GetProgramPath() (exec string, err error) { var tmpExec string tmpExec, err = os.Executable() if err == nil { tmpExec, err = filepath.EvalSymlinks(tmpExec) if err == nil { exec, err = filepath.Abs(tmpExec) } } return } func MakeParentDir(filePath string) (dir string, err error) { dir = filepath.Dir(filePath) if !IsDirectory(dir) { if err1 := os.MkdirAll(dir, 0755); err1 != nil { err = fmt.Errorf("Can't make parent path of %#v: %v", filePath, err1) } } return } func ExpandFilePathAndMakeParent(specPath string) (expandedPath, expandedParent string, err error) { expandedPath, err = ExpandPath(specPath) if err == nil { expandedParent, err = MakeParentDir(expandedPath) } return } func ExpandFilePathAndMakeParentV(specPath string, maps ...map[string]string) (expandedPath, expandedParent string, err error) { expandedPath, err = ExpandPathV(specPath, maps...) if err == nil { expandedParent, err = MakeParentDir(expandedPath) } return } func MakeDir(dirPath string) (err error) { if !IsDirectory(dirPath) { if err1 := os.MkdirAll(dirPath, 0755); err1 != nil { err = fmt.Errorf("Can't make directory path %#v: %v", dirPath, err1) } } return } func ExpandDirPathAndMakeParent(specPath string) (expandedPath string, err error) { expandedPath, err = ExpandPath(specPath) if err == nil { err = MakeDir(expandedPath) } return }