173 lines
3.7 KiB
Go
173 lines
3.7 KiB
Go
// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
|
|
// All rights reserved.
|
|
|
|
// 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
|
|
}
|