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