Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,10 +171,11 @@
- `--gc:orc` is now 10% faster than previously for common workloads. If
you have trouble with its changed behavior, compile with `-d:nimOldOrc`.


- `os.FileInfo` (returned by `getFileInfo`) now contains `blockSize`,
determining preferred I/O block size for this file object.

- Added `os.getCacheDir()` to return platform specific cache directory.

- Added a simpler to use `io.readChars` overload.

- Added `**` to jsffi.
Expand Down
44 changes: 38 additions & 6 deletions lib/pure/os.nim
Original file line number Diff line number Diff line change
Expand Up @@ -922,9 +922,7 @@ proc getConfigDir*(): string {.rtl, extern: "nos$1",
## See also:
## * `getHomeDir proc <#getHomeDir>`_
## * `getTempDir proc <#getTempDir>`_
## * `expandTilde proc <#expandTilde,string>`_
## * `getCurrentDir proc <#getCurrentDir>`_
## * `setCurrentDir proc <#setCurrentDir,string>`_
## * `getCacheDir proc <#getCacheDir>`_
runnableExamples:
from std/strutils import endsWith
# See `getHomeDir` for behavior regarding trailing DirSep.
Expand All @@ -935,6 +933,42 @@ proc getConfigDir*(): string {.rtl, extern: "nos$1",
result = getEnv("XDG_CONFIG_HOME", getEnv("HOME") / ".config")
result.normalizePathEnd(trailingSep = defined(nimLegacyHomeDir))

proc getCacheDir*(): string =
## Returns the cache directory of the current user for applications.
##
## This makes use of the following environment variables:
##
## * On Windows: `getEnv("LOCALAPPDATA")`
##
## * On macOS: `getEnv("XDG_CACHE_HOME", getEnv("HOME") / "Library/Caches")`
##
## * On other platforms: `getEnv("XDG_CACHE_HOME", getEnv("HOME") / ".cache")`
##
## **See also:**
## * `getHomeDir proc <#getHomeDir>`_
## * `getTempDir proc <#getTempDir>`_
## * `getConfigDir proc <#getConfigDir>`_
# follows https://crates.io/crates/platform-dirs
when defined(windows):
result = getEnv("LOCALAPPDATA")
elif defined(osx):
result = getEnv("XDG_CACHE_HOME", getEnv("HOME") / "Library/Caches")
else:
result = getEnv("XDG_CACHE_HOME", getEnv("HOME") / ".cache")
result.normalizePathEnd(false)

proc getCacheDir*(app: string): string =
## Returns the cache directory for an application `app`.
##
## * On windows, this uses: `getCacheDir() / app / "cache"`
##
## * On other platforms, this uses: `getCacheDir() / app`
when defined(windows):
getCacheDir() / app / "cache"
else:
getCacheDir() / app
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that just the 1st overload is Ok, the user can make getCacheDir() / "app" themselves, but is just my opinion...

Copy link
Member Author

@timotheecour timotheecour May 30, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that would not be correct for windows; that's the point of this proc, make it portable (other libraries do this too)



when defined(windows):
type DWORD = uint32

Expand Down Expand Up @@ -972,9 +1006,7 @@ proc getTempDir*(): string {.rtl, extern: "nos$1",
## See also:
## * `getHomeDir proc <#getHomeDir>`_
## * `getConfigDir proc <#getConfigDir>`_
## * `expandTilde proc <#expandTilde,string>`_
## * `getCurrentDir proc <#getCurrentDir>`_
## * `setCurrentDir proc <#setCurrentDir,string>`_
## * `getCacheDir proc <#getCacheDir>`_
runnableExamples:
from std/strutils import endsWith
# See `getHomeDir` for behavior regarding trailing DirSep.
Expand Down
3 changes: 3 additions & 0 deletions tests/stdlib/tos.nim
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,9 @@ block getTempDir:
else:
doAssert getTempDir() == "/tmp"

block: # getCacheDir
doAssert getCacheDir().dirExists

block osenv:
block delEnv:
const dummyEnvVar = "DUMMY_ENV_VAR" # This env var wouldn't be likely to exist to begin with
Expand Down