Permalink
Please sign in to comment.
Showing
with
180 additions
and 0 deletions.
5
Godeps/Godeps.json
8
Makefile
21
vendor/github.com/mitchellh/go-homedir/LICENSE
| @@ -0,0 +1,21 @@ | ||
| +The MIT License (MIT) | ||
| + | ||
| +Copyright (c) 2013 Mitchell Hashimoto | ||
| + | ||
| +Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| +of this software and associated documentation files (the "Software"), to deal | ||
| +in the Software without restriction, including without limitation the rights | ||
| +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| +copies of the Software, and to permit persons to whom the Software is | ||
| +furnished to do so, subject to the following conditions: | ||
| + | ||
| +The above copyright notice and this permission notice shall be included in | ||
| +all copies or substantial portions of the Software. | ||
| + | ||
| +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
| +THE SOFTWARE. |
14
vendor/github.com/mitchellh/go-homedir/README.md
| @@ -0,0 +1,14 @@ | ||
| +# go-homedir | ||
| + | ||
| +This is a Go library for detecting the user's home directory without | ||
| +the use of cgo, so the library can be used in cross-compilation environments. | ||
| + | ||
| +Usage is incredibly simple, just call `homedir.Dir()` to get the home directory | ||
| +for a user, and `homedir.Expand()` to expand the `~` in a path to the home | ||
| +directory. | ||
| + | ||
| +**Why not just use `os/user`?** The built-in `os/user` package requires | ||
| +cgo on Darwin systems. This means that any Go code that uses that package | ||
| +cannot cross compile. But 99% of the time the use for `os/user` is just to | ||
| +retrieve the home directory, which we can do for the current user without | ||
| +cgo. This library does that, enabling cross-compilation. |
132
vendor/github.com/mitchellh/go-homedir/homedir.go
| @@ -0,0 +1,132 @@ | ||
| +package homedir | ||
| + | ||
| +import ( | ||
| + "bytes" | ||
| + "errors" | ||
| + "os" | ||
| + "os/exec" | ||
| + "path/filepath" | ||
| + "runtime" | ||
| + "strconv" | ||
| + "strings" | ||
| + "sync" | ||
| +) | ||
| + | ||
| +// DisableCache will disable caching of the home directory. Caching is enabled | ||
| +// by default. | ||
| +var DisableCache bool | ||
| + | ||
| +var homedirCache string | ||
| +var cacheLock sync.RWMutex | ||
| + | ||
| +// Dir returns the home directory for the executing user. | ||
| +// | ||
| +// This uses an OS-specific method for discovering the home directory. | ||
| +// An error is returned if a home directory cannot be detected. | ||
| +func Dir() (string, error) { | ||
| + if !DisableCache { | ||
| + cacheLock.RLock() | ||
| + cached := homedirCache | ||
| + cacheLock.RUnlock() | ||
| + if cached != "" { | ||
| + return cached, nil | ||
| + } | ||
| + } | ||
| + | ||
| + cacheLock.Lock() | ||
| + defer cacheLock.Unlock() | ||
| + | ||
| + var result string | ||
| + var err error | ||
| + if runtime.GOOS == "windows" { | ||
| + result, err = dirWindows() | ||
| + } else { | ||
| + // Unix-like system, so just assume Unix | ||
| + result, err = dirUnix() | ||
| + } | ||
| + | ||
| + if err != nil { | ||
| + return "", err | ||
| + } | ||
| + homedirCache = result | ||
| + return result, nil | ||
| +} | ||
| + | ||
| +// Expand expands the path to include the home directory if the path | ||
| +// is prefixed with `~`. If it isn't prefixed with `~`, the path is | ||
| +// returned as-is. | ||
| +func Expand(path string) (string, error) { | ||
| + if len(path) == 0 { | ||
| + return path, nil | ||
| + } | ||
| + | ||
| + if path[0] != '~' { | ||
| + return path, nil | ||
| + } | ||
| + | ||
| + if len(path) > 1 && path[1] != '/' && path[1] != '\\' { | ||
| + return "", errors.New("cannot expand user-specific home dir") | ||
| + } | ||
| + | ||
| + dir, err := Dir() | ||
| + if err != nil { | ||
| + return "", err | ||
| + } | ||
| + | ||
| + return filepath.Join(dir, path[1:]), nil | ||
| +} | ||
| + | ||
| +func dirUnix() (string, error) { | ||
| + // First prefer the HOME environmental variable | ||
| + if home := os.Getenv("HOME"); home != "" { | ||
| + return home, nil | ||
| + } | ||
| + | ||
| + // If that fails, try getent | ||
| + var stdout bytes.Buffer | ||
| + cmd := exec.Command("getent", "passwd", strconv.Itoa(os.Getuid())) | ||
| + cmd.Stdout = &stdout | ||
| + if err := cmd.Run(); err != nil { | ||
| + // If "getent" is missing, ignore it | ||
| + if err == exec.ErrNotFound { | ||
| + return "", err | ||
| + } | ||
| + } else { | ||
| + if passwd := strings.TrimSpace(stdout.String()); passwd != "" { | ||
| + // username:password:uid:gid:gecos:home:shell | ||
| + passwdParts := strings.SplitN(passwd, ":", 7) | ||
| + if len(passwdParts) > 5 { | ||
| + return passwdParts[5], nil | ||
| + } | ||
| + } | ||
| + } | ||
| + | ||
| + // If all else fails, try the shell | ||
| + stdout.Reset() | ||
| + cmd = exec.Command("sh", "-c", "cd && pwd") | ||
| + cmd.Stdout = &stdout | ||
| + if err := cmd.Run(); err != nil { | ||
| + return "", err | ||
| + } | ||
| + | ||
| + result := strings.TrimSpace(stdout.String()) | ||
| + if result == "" { | ||
| + return "", errors.New("blank output when reading home directory") | ||
| + } | ||
| + | ||
| + return result, nil | ||
| +} | ||
| + | ||
| +func dirWindows() (string, error) { | ||
| + drive := os.Getenv("HOMEDRIVE") | ||
| + path := os.Getenv("HOMEPATH") | ||
| + home := drive + path | ||
| + if drive == "" || path == "" { | ||
| + home = os.Getenv("USERPROFILE") | ||
| + } | ||
| + if home == "" { | ||
| + return "", errors.New("HOMEDRIVE, HOMEPATH, and USERPROFILE are blank") | ||
| + } | ||
| + | ||
| + return home, nil | ||
| +} |
0 comments on commit
a5cd99c