[v2] paccache: Support cleaning many thousands of candidates

Message ID 20200602052758.4817-1-lb.workbox@gmail.com
State New
Headers show
Series
  • [v2] paccache: Support cleaning many thousands of candidates
Related show

Commit Message

Leonid Bloch June 2, 2020, 5:27 a.m. UTC
In situations when there are many thousands of candidates for deletion,
paccache returns an "Argument list too long" error at the freed space
calculation stage, because the expansion of the ${candidates[@]} array
becomes too long for Bash.

This commit fixes that problem, by getting the @SIZECMD@ arguments via
`printf '%s\0' "${candidates[@]}" | xargs -0`, similarly to what is done
for the (re)moving commands below.

Signed-off-by: Leonid Bloch <lb.workbox@gmail.com>
---
 src/paccache.sh.in | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Patch

diff --git a/src/paccache.sh.in b/src/paccache.sh.in
index af901f4..1311fd7 100644
--- a/src/paccache.sh.in
+++ b/src/paccache.sh.in
@@ -391,7 +391,8 @@  candidates=("${candtemp[@]}")
 unset candtemp
 
 # do this before we destroy anything
-totalsaved=$(@SIZECMD@ "${candidates[@]}" | awk '{ sum += $1 } END { print sum }')
+totalsaved=$(printf '%s\0' "${candidates[@]}" | xargs -0 @SIZECMD@ |
+		awk '{ sum += $1 } END { print sum }')
 
 # Exit immediately if a pipeline returns non-zero.
 set -o errexit