Don't depend on os/user anymore, which requires cgo

This commit is contained in:
Mitchell Hashimoto 2013-06-17 22:09:07 -07:00
parent 148d95def5
commit a6e0ea8bd2
4 changed files with 105 additions and 12 deletions

9
configfile.go Normal file
View File

@ -0,0 +1,9 @@
package main
// ConfigFile returns the default path to the configuration file. On
// Unix-like systems this is the ".packerconfig" file in the home directory.
// On Windows, this is the "packer.config" file in the application data
// directory.
func ConfigFile() (string, error) {
return configFile()
}

45
configfile_unix.go Normal file
View File

@ -0,0 +1,45 @@
// +build darwin freebsd linux netbsd openbsd
package main
import (
"bytes"
"errors"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
)
func configFile() (string, error) {
dir, err := configDir()
if err != nil {
return "", err
}
return filepath.Join(dir, ".packerconfig"), nil
}
func configDir() (string, error) {
// First prefer the HOME environmental variable
if home := os.Getenv("HOME"); home != "" {
log.Printf("Detected home directory from env var: %s", home)
return home, nil
}
// If that fails, try the shell
var stdout bytes.Buffer
cmd := exec.Command("sh", "-c", "eval echo ~$USER")
cmd.Stdout = &stdout
if err := cmd.Run(); err != nil {
return "", err
}
result := strings.TrimSpace(stdout.String())
if result == "" {
return "", errors.New("blank output")
}
return result, nil
}

37
configfile_windows.go Normal file
View File

@ -0,0 +1,37 @@
// +build windows
package main
import (
"path/filepath"
"syscall"
"unsafe"
)
var (
shell = syscall.MustLoadDLL("Shell32.dll")
getFolderPath = shell.MustFindProc("SHGetFolderPathW")
)
const CSIDL_APPDATA = 26
func configFile() (string, error) {
dir, err := configDir()
if err != nil {
return "", err
}
return filepath.Join(dir, "packer.config"), nil
}
func configDir() (string, error) {
b := make([]uint16, syscall.MAX_PATH)
// See: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181(v=vs.85).aspx
r, _, err := getFolderPath.Call(0, CSIDL_APPDATA, 0, 0, uintptr(unsafe.Pointer(&b[0])))
if uint32(r) != 0 {
return "", err
}
return syscall.UTF16ToString(b), nil
}

View File

@ -9,8 +9,6 @@ import (
"io/ioutil"
"log"
"os"
"os/user"
"path/filepath"
"runtime"
)
@ -82,19 +80,23 @@ func loadConfig() (*config, error) {
}
mustExist := true
configFile := os.Getenv("PACKER_CONFIG")
if configFile == "" {
u, err := user.Current()
if err != nil {
return nil, err
}
configFile = filepath.Join(u.HomeDir, ".packerconfig")
configFilePath := os.Getenv("PACKER_CONFIG")
if configFilePath == "" {
var err error
configFilePath, err = configFile()
mustExist = false
if err != nil {
log.Printf("Error detecing default config file path: %s", err)
}
}
log.Printf("Attempting to open config file: %s", configFile)
f, err := os.Open(configFile)
if configFilePath == "" {
return &config, nil
}
log.Printf("Attempting to open config file: %s", configFilePath)
f, err := os.Open(configFilePath)
if err != nil {
if !os.IsNotExist(err) {
return nil, err