[pacman-dev] [PATCH] paccache: adding the possibility for multiple cachedirs

silent boatman thesilentboatman at gmail.com
Sun Aug 24 21:07:43 EDT 2014


Either by specifing several -c parameters or only
one -c parameter with a comma separated value.
One charedir could for example be for the official arch packages
and one for the aur.

Signed-off-by: Maxim Andersson <thesilentboatman at gmail.com>
---
 contrib/paccache.sh.in | 89 +++++++++++++++++++++++++++++---------------------
 1 file changed, 51 insertions(+), 38 deletions(-)

diff --git a/contrib/paccache.sh.in b/contrib/paccache.sh.in
index 039ac8a..2170d76 100644
--- a/contrib/paccache.sh.in
+++ b/contrib/paccache.sh.in
@@ -23,9 +23,9 @@ shopt -s extglob
 declare -r myname='paccache'
 declare -r myver='@PACKAGE_VERSION@'

-declare -a candidates=() cmdopts=() whitelist=() blacklist=()
+declare -a cachedirs=() candidates=() cmdopts=() whitelist=() blacklist=()
 declare -i delete=0 dryrun=0 filecount=0 move=0 needsroot=0
totalsaved=0 verbose=0
-declare    cachedir=@localstatedir@/cache/pacman/pkg delim=$'\n'
keep=3 movedir= scanarch=
+declare    delim=$'\n' keep=3 movedir= scanarch=

 USE_COLOR='y'

@@ -159,25 +159,25 @@ A flexible pacman cache cleaning utility.
 Usage: ${myname} <operation> [options] [targets...]

   Operations:
-    -d, --dryrun          perform a dry run, only finding candidate packages.
-    -m, --move <dir>      move candidate packages to "dir".
-    -r, --remove          remove candidate packages.
+    -d, --dryrun           perform a dry run, only finding candidate packages.
+    -m, --move <dir>       move candidate packages to "dir".
+    -r, --remove           remove candidate packages.

   Options:
-    -a, --arch <arch>     scan for "arch" (default: all architectures).
-    -c, --cachedir <dir>  scan "dir" for packages.
-                          (default: @localstatedir@/cache/pacman/pkg).
-    -f, --force           apply force to mv(1) and rm(1) operations.
-    -h, --help            display this help message and exit.
-    -i, --ignore <pkgs>   ignore "pkgs", comma-separated.
Alternatively, specify
-                          "-" to read package names from stdin, newline-
-                          delimited.
-    -k, --keep <num>      keep "num" of each package in the cache (default: 3).
-    --nocolor             remove color from output.
-    -u, --uninstalled     target uninstalled packages.
-    -v, --verbose         increase verbosity. specify up to 3 times.
-    -z, --null            use null delimiters for candidate names (only with -v
-                          and -vv).
+    -a, --arch <arch>      scan for "arch" (default: all architectures).
+    -c, --cachedir <dirs>  scan "dirs" for packages, comma-separated.
+                           (default: @localstatedir@/cache/pacman/pkg).
+    -f, --force            apply force to mv(1) and rm(1) operations.
+    -h, --help             display this help message and exit.
+    -i, --ignore <pkgs>    ignore "pkgs", comma-separated. Alternatively,
+                           pecify "-" to read package names from
stdin, newline-
+                           delimited.
+    -k, --keep <num>       keep "num" of each package in the cache
(default: 3).
+    --nocolor              remove color from output.
+    -u, --uninstalled      target uninstalled packages.
+    -v, --verbose          increase verbosity. specify up to 3 times.
+    -z, --null             use null delimiters for candidate names
(only with -v
+                           and -vv).

 EOF
 }
@@ -203,7 +203,9 @@ while :; do
             scanarch=$2
             shift ;;
         -c|--cachedir)
-            cachedir=$2
+            IFS=',' read -r -a cdrs <<< "$2"
+            cachedirs+=("${cdrs[@]}")
+            unset cdrs
             shift ;;
         -d|--dryrun)
             dryrun=1 ;;
@@ -256,6 +258,9 @@ done

 m4_include(../scripts/library/term_colors.sh)

+# setting default cachedir
+cachedirs=${cachedirs:- at localstatedir@/cache/pacman/pkg}
+
 # remaining args are a whitelist
 whitelist=("$@")

@@ -265,28 +270,36 @@ case $(( dryrun+delete+move )) in
     [^1]) die "only one operation may be used at a time" ;;
 esac

-[[ -d $cachedir ]] ||
-    die "cachedir '%s' does not exist or is not a directory" "$cachedir"
+for cachedir in "${cachedirs[@]}"
+do
+    [[ -d $cachedir ]] ||
+        die "cachedir '%s' does not exist or is not a directory" "$cachedir"

-[[ $movedir && ! -d $movedir ]] &&
-    die "destination directory '%s' does not exist or is not a
directory" "$movedir"
+    [[ $movedir && ! -d $movedir ]] &&
+        die "destination directory '%s' does not exist or is not a
directory" "$movedir"
+
+    if (( move || delete )); then
+        # make it an absolute path since we're about to chdir
+        [[ ${movedir:0:1} != '/' ]] && movedir=$PWD/$movedir
+        [[ ! -w $cachedir || ( $movedir && ! -w $movedir ) ]] && needsroot=1
+    fi
+
+    # unlikely that this will fail, but better make sure
+    cd "$cachedir" >/dev/null || die "failed to chdir to '%s'" "$cachedir"
+
+    # note that these results are returned in an arbitrary order from awk, but
+    # they'll be resorted (in summarize) iff we have a verbosity level set.
+    IFS=$'\n' read -r -d '' -a tmpcandidates < \
+        <(printf '%s\n' *.pkg.tar?(.+([^.])) | pacsort --files |
+            pkgfilter "$keep" "$scanarch" \
+                "${#whitelist[*]}" "${whitelist[@]}" \
+                "${#blacklist[*]}" "${blacklist[@]}")
+
+    candidates+=(${tmpcandidates[@]})
+done

-if (( move || delete )); then
-    # make it an absolute path since we're about to chdir
-    [[ ${movedir:0:1} != '/' ]] && movedir=$PWD/$movedir
-    [[ ! -w $cachedir || ( $movedir && ! -w $movedir ) ]] && needsroot=1
-fi

-# unlikely that this will fail, but better make sure
-cd "$cachedir" >/dev/null || die "failed to chdir to '%s'" "$cachedir"

-# note that these results are returned in an arbitrary order from awk, but
-# they'll be resorted (in summarize) iff we have a verbosity level set.
-IFS=$'\n' read -r -d '' -a candidates < \
-    <(printf '%s\n' *.pkg.tar?(.+([^.])) | pacsort --files |
-        pkgfilter "$keep" "$scanarch" \
-            "${#whitelist[*]}" "${whitelist[@]}" \
-            "${#blacklist[*]}" "${blacklist[@]}")

 if (( ! ${#candidates[*]} )); then
     msg 'no candidate packages found for pruning'
-- 
2.0.3


More information about the pacman-dev mailing list