fix(install): keep the package store across an upgrade
All checks were successful
bootstrap / cfree-fixpoint (push) Successful in 22s
ci / build-and-test (push) Successful in 3m0s
commit-lint / conventional-commits (push) Successful in 2s
docs / build-and-deploy (push) Successful in 33s

The install root is not only the artifact: `ludic add` caches fetched packages
in <root>/store, keyed by content hash. install_staged moved the whole root
aside and replaced it, so re-running the installer — which is exactly what
`ludic upgrade` does — deleted the cache and forced every project to refetch.

The store is moved into the staged tree before the swap. Nothing else in the
root is preserved, because everything else is the toolchain and should be
replaced.

Verified by staging an install, planting a store entry, upgrading, and reading
the entry back.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-05 23:40:05 +03:00
parent 6588c9d4ae
commit 470971bf70
2 changed files with 13 additions and 0 deletions

View file

@ -0,0 +1,6 @@
bump: patch
type: fix
An upgrade keeps the package store. The installer replaces the whole install
root, and `ludic add` caches packages in `~/.ludic/store` — so re-running the
one-liner deleted every package a project had fetched. The store is carried
across now; everything else in the root belongs to the toolchain and is replaced.

View file

@ -182,6 +182,13 @@ install_staged() {
if [ -d "$INSTALL_DIR" ]; then if [ -d "$INSTALL_DIR" ]; then
rm -rf "${INSTALL_DIR}.old" rm -rf "${INSTALL_DIR}.old"
mv "$INSTALL_DIR" "${INSTALL_DIR}.old" mv "$INSTALL_DIR" "${INSTALL_DIR}.old"
# The install root is not only the artifact: `ludic add` caches packages in
# <root>/store, which is the user's data and takes a network round trip to
# rebuild. Carry it across rather than replacing the directory out from under
# it. (Anything else here is part of the toolchain and should be replaced.)
if [ -d "${INSTALL_DIR}.old/store" ]; then
mv "${INSTALL_DIR}.old/store" "${_staged}/store" || warn "could not carry the package store across"
fi
fi fi
mv "$_staged" "$INSTALL_DIR" mv "$_staged" "$INSTALL_DIR"
rm -rf "${INSTALL_DIR}.old" rm -rf "${INSTALL_DIR}.old"