From 6514c4d859b5909dd781c2d8c9910a2c0fec218a Mon Sep 17 00:00:00 2001 From: Felitendo Date: Sat, 8 Aug 2026 15:33:03 +0200 Subject: [PATCH] Trim the package cache by default, and split it from orphan removal CleanCache was off, so nothing ever pruned /var/cache/pacman/pkg - 23 GB on the machine this was found on, with three 3.2 GB copies of one package. Trimming only drops older versions of installed packages and cached versions of uninstalled ones, so the cost is downgrade depth, not working software. flatpak uninstall --unused moves from CleanCache to RemoveOrphans, where it belongs: unused runtimes are the Flatpak equivalent of orphaned packages, and removing installed software should not hide behind a flag named for cache trimming. RemoveOrphans stays off - 'orphaned' only means nothing depends on it, which is also true of something installed deliberately. The log now reports what a trim reclaimed, since a real paccache run says almost nothing and there was otherwise no way to tell it was working. --- Makefile | 2 +- README.md | 11 +++++++++-- res/config/cachy-auto-update.conf | 23 ++++++++++++++++++----- src/lib/config.sh | 2 +- src/lib/pkg_flatpak.sh | 5 ++++- src/lib/pkg_pacman.sh | 9 ++++++++- 6 files changed, 41 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 43ede36..7620aa9 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ # Overridable so a packager can pass the version it is actually building # (`make VERSION=$pkgver`). The literal below is the fallback for builds # straight from a checkout, and is what a release tag has to carry. -VERSION ?= 1.0.6 +VERSION ?= 1.0.7 PREFIX ?= /usr DESTDIR ?= diff --git a/README.md b/README.md index 1997eac..3c56370 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,15 @@ business rebuilding somebody's system before being asked. | Flatpak | system and per-user installations | | AppImages | via [Gear Lever](https://github.com/mijorus/gearlever), if installed | -`-git`/`-devel` AUR packages, cache trimming and orphan removal exist as -options but are off by default. +It also trims the pacman package cache after each run (`paccache`, keeping the +3 most recent versions), because otherwise `/var/cache/pacman/pkg` grows +forever — tens of gigabytes on a machine with a few large packages. Set +`KeepOldPackages=1` if disk space matters more than the ability to downgrade. + +`-git`/`-devel` AUR packages and orphan removal exist as options but are off by +default. Orphan removal deletes installed software, and "orphaned" only means +nothing else depends on it — which is also true of something installed +deliberately. ## When it holds back diff --git a/res/config/cachy-auto-update.conf b/res/config/cachy-auto-update.conf index 7f4b5ad..300db19 100644 --- a/res/config/cachy-auto-update.conf +++ b/res/config/cachy-auto-update.conf @@ -66,16 +66,29 @@ AutoResolveConflicts=yes IgnorePkg= # --------------------------------------------------------------------------- -# Housekeeping - all off by default +# Housekeeping # --------------------------------------------------------------------------- -# Trim the pacman package cache after an update. -CleanCache=no +# Trim the pacman package cache after an update: drop the older versions of +# installed packages, and every cached version of packages that are no longer +# installed. Nothing that is currently installed is ever touched, so this only +# costs the ability to downgrade further back than KeepOldPackages. +# Without it /var/cache/pacman/pkg grows forever - tens of gigabytes on a +# machine with a few large packages. +CleanCache=yes -# How many old versions per package to keep when CleanCache is on. +# How many old versions per package to keep when CleanCache is on. 3 is the +# Arch default and leaves room to downgrade. Set it to 1 if disk space matters +# more than that; on a machine with a handful of multi-gigabyte packages the +# difference is easily ten gigabytes. KeepOldPackages=3 -# Remove packages that were installed as dependencies and are no longer needed. +# Remove packages nothing depends on any more: pacman packages that were pulled +# in as dependencies and are now unreferenced, plus Flatpak runtimes no +# installed application uses. +# Off by default, and unlike CleanCache this one deletes installed software: +# "orphaned" only means no other package requires it, which is also true of +# something installed deliberately as a dependency of nothing. RemoveOrphans=no # --------------------------------------------------------------------------- diff --git a/src/lib/config.sh b/src/lib/config.sh index 59e63c8..ef7ba2a 100644 --- a/src/lib/config.sh +++ b/src/lib/config.sh @@ -96,7 +96,7 @@ cau_config_load() { CFG_APPIMAGE=no; cau_config_bool UpdateAppImages yes && CFG_APPIMAGE=yes CFG_DEVEL=no; cau_config_bool UpdateDevel no && CFG_DEVEL=yes CFG_RESOLVE_CONFLICTS=no; cau_config_bool AutoResolveConflicts yes && CFG_RESOLVE_CONFLICTS=yes - CFG_CLEAN_CACHE=no; cau_config_bool CleanCache no && CFG_CLEAN_CACHE=yes + CFG_CLEAN_CACHE=no; cau_config_bool CleanCache yes && CFG_CLEAN_CACHE=yes CFG_REMOVE_ORPHANS=no; cau_config_bool RemoveOrphans no && CFG_REMOVE_ORPHANS=yes CFG_NOTIFY_SUCCESS=no; cau_config_bool NotifyOnSuccess yes && CFG_NOTIFY_SUCCESS=yes CFG_NOTIFY_ERROR=no; cau_config_bool NotifyOnError yes && CFG_NOTIFY_ERROR=yes diff --git a/src/lib/pkg_flatpak.sh b/src/lib/pkg_flatpak.sh index a9e7b98..3451822 100644 --- a/src/lib/pkg_flatpak.sh +++ b/src/lib/pkg_flatpak.sh @@ -63,7 +63,10 @@ cau_flatpak_update() { fi done < <(cau_human_users) - if [[ $CFG_CLEAN_CACHE == yes ]]; then + # Unused runtimes are the Flatpak equivalent of orphaned packages - this is + # removal of installed software, not cache trimming, so it belongs behind + # RemoveOrphans rather than CleanCache. + if [[ $CFG_REMOVE_ORPHANS == yes ]]; then cau_run_logged flatpak uninstall --system --unused --noninteractive --assumeyes || true fi diff --git a/src/lib/pkg_pacman.sh b/src/lib/pkg_pacman.sh index 7cf6fc3..ee5e000 100644 --- a/src/lib/pkg_pacman.sh +++ b/src/lib/pkg_pacman.sh @@ -254,7 +254,14 @@ cau_pacman_cleanup() { fi if [[ $CFG_CLEAN_CACHE == yes ]] && cau_have paccache; then - cau_info "Trimming the package cache" + # paccache's dry run reports what a real run would reclaim; logging it + # first is the only way to tell afterwards whether trimming is doing + # anything, since the real run says little. + local reclaim + reclaim="$( { paccache -d --nocolor -k"$CFG_KEEP_OLD"; paccache -du --nocolor -k0; } 2>&1 \ + | grep -oE 'disk space saved: [^)]*' | paste -sd', ' -)" + + cau_info "Trimming the package cache (keeping $CFG_KEEP_OLD old version(s))${reclaim:+ - $reclaim}" cau_run_logged paccache -r --nocolor -k"$CFG_KEEP_OLD" || cau_warn "paccache -r failed" cau_run_logged paccache -ru --nocolor -k0 || cau_warn "paccache -ru failed" fi