utils/os-util.go

173 lines
3.7 KiB
Go
Raw Normal View History

// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.
2024-02-16 15:51:28 +01:00
// 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
}