3 The Cache
dxtr edited this page 2026-10-16 14:31:15 +02:00

The Cache

The cache is stift/ in the directory UIOP's xdg-cache-home names: ~/.cache/stift/ on Linux, %LOCALAPPDATA%\cache\stift\ on Windows. It holds:

Directory What it holds
git/HOST/PATH.git/ A bare repository for each project, with its branches and tags
src/NAME@COMMIT/ The files of one commit, never changed once made
setup/KEY.lisp The setup file of one build list
fasl/IMPLEMENTATION/KEY/NAME/ The fasls of one build list, for one implementation

A commit ID fixes the whole tree, so a fork and its original share the checkout of a commit they share. The files are checked out with the line endings the repository has, on every system: Git for Windows would turn them into CR LF by default, which would change every string that spans lines. stift clean deletes the read-only files git makes, which Windows otherwise refuses to delete.

Sharing it

Any number of processes and threads may use the cache at once. A checkout is made in a temporary directory and renamed into place, so it appears whole or not at all; two fetches into one repository wait for each other's locks on refs, for up to a minute.

stift never collects its repositories' garbage, so a commit that a force-push removed from its repository stays in the cache for the stiftfiles that pin it. A fresh cache cannot fetch such a commit.

Environment variables

Variable What it does
STIFT_CACHE Moves the cache
STIFT_OFFLINE Any value but 0 or empty: never use the network, as --offline
STIFT_GIT The git program, git by default
STIFT_WORKSPACE The stiftwork to work in, or off for none; unset, stift looks for one (see Workspaces)

Cleaning it

stift clean deletes the repositories, checkouts, setup files and fasls; stift clean --fasls only the fasls. stift fetches and compiles again what it needs next.