From 6fb90b6fc4b3f63b48627958f6a42e2b1d8ea291 Mon Sep 17 00:00:00 2001 From: ZauberNerd Date: Sat, 5 Mar 2022 00:24:33 +0000 Subject: [PATCH] src/os: Add UserHomeDir() function to os package This commit adds the `UserHomeDir()` function to the `os` package. --- src/os/file.go | 27 +++++++++++++++++++++++++++ src/os/os_anyos_test.go | 18 ++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/os/file.go b/src/os/file.go index 2f72c892..9a4c3091 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -12,6 +12,7 @@ package os import ( "errors" "io" + "runtime" "syscall" ) @@ -259,3 +260,29 @@ func Getwd() (string, error) { func TempDir() string { return tempDir() } + +// UserHomeDir returns the current user's home directory. +// +// On Unix, including macOS, it returns the $HOME environment variable. +// On Windows, it returns %USERPROFILE%. +// On Plan 9, it returns the $home environment variable. +func UserHomeDir() (string, error) { + env, enverr := "HOME", "$HOME" + switch runtime.GOOS { + case "windows": + env, enverr = "USERPROFILE", "%userprofile%" + case "plan9": + env, enverr = "home", "$home" + } + if v := Getenv(env); v != "" { + return v, nil + } + // On some geese the home directory is not always defined. + switch runtime.GOOS { + case "android": + return "/sdcard", nil + case "ios": + return "/", nil + } + return "", errors.New(enverr + " is not defined") +} diff --git a/src/os/os_anyos_test.go b/src/os/os_anyos_test.go index 0002f072..643c5bd9 100644 --- a/src/os/os_anyos_test.go +++ b/src/os/os_anyos_test.go @@ -253,3 +253,21 @@ func TestRenameFailed(t *testing.T) { t.Errorf("rename %q, %q: expected %T, got %T %v", from, to, new(LinkError), err, err) } } + +func TestUserHomeDir(t *testing.T) { + dir, err := UserHomeDir() + if dir == "" && err == nil { + t.Fatal("UserHomeDir returned an empty string but no error") + } + if err != nil { + t.Logf("UserHomeDir failed: %v", err) + return + } + fi, err := Stat(dir) + if err != nil { + t.Fatal(err) + } + if !fi.IsDir() { + t.Fatalf("dir %s is not directory; type = %v", dir, fi.Mode()) + } +}