Skip to content

Commit

Permalink
os: add UserCacheDir
Browse files Browse the repository at this point in the history
Adds a function that returns an OS-dependent location
for user-specific cache data.

Fixes #22536

Change-Id: Ifff015452494571ad357fa2d945d66a5992c751d
Reviewed-on: https://go-review.googlesource.com/78835
Run-TryBot: Andrew Bonventre <andybons@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
  • Loading branch information
andybons committed Feb 13, 2018
1 parent 45ca979 commit 816154b
Showing 1 changed file with 49 additions and 0 deletions.
49 changes: 49 additions & 0 deletions src/os/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import (
"internal/poll"
"internal/testlog"
"io"
"runtime"
"syscall"
"time"
)
Expand Down Expand Up @@ -315,6 +316,54 @@ func TempDir() string {
return tempDir()
}

// UserCacheDir returns the default root directory to use for user-specific
// cached data. Users should create their own application-specific subdirectory
// within this one and use that.
//
// On Unix systems, it returns $XDG_CACHE_HOME as specified by
// https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html if
// non-empty, else $HOME/.cache.
// On Darwin, it returns $HOME/Library/Caches.
// On Windows, it returns %LocalAppData%.
// On Plan 9, it returns $home/lib/cache.
//
// If the location cannot be determined (for example, $HOME is not defined),
// then it will return an empty string.
func UserCacheDir() string {
var dir string

switch runtime.GOOS {
case "windows":
dir = Getenv("LocalAppData")

case "darwin":
dir = Getenv("HOME")
if dir == "" {
return ""
}
dir += "/Library/Caches"

case "plan9":
dir = Getenv("home")
if dir == "" {
return ""
}
dir += "/lib/cache"

default: // Unix
dir = Getenv("XDG_CACHE_HOME")
if dir == "" {
dir = Getenv("HOME")
if dir == "" {
return ""
}
dir += "/.cache"
}
}

return dir
}

// Chmod changes the mode of the named file to mode.
// If the file is a symbolic link, it changes the mode of the link's target.
// If there is an error, it will be of type *PathError.
Expand Down

0 comments on commit 816154b

Please sign in to comment.