[pacman-dev] [PATCH v2] paccache: adding the possibility for multiple cachedirs
Either by specifing several -c parameters or only one -c parameter with a comma separated value. One could for example be for the official arch packages and one for the aur. Signed-off-by: Maxim Andersson <thesilentboatman@gmail.com> --- contrib/paccache.sh.in | 82 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 33 deletions(-) diff --git a/contrib/paccache.sh.in b/contrib/paccache.sh.in index 039ac8a..e96bf81 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 dirs <<< "$2" + cachedirs+=("${dirs[@]}") + unset dirs shift ;; -d|--dryrun) dryrun=1 ;; @@ -256,6 +258,11 @@ done m4_include(../scripts/library/term_colors.sh) +# setting default cachedir +if [ "${#cachedirs[@]}" -eq 0 ]; then + cachedirs[0]='@localstatedir@/cache/pacman/pkg' +else + # remaining args are a whitelist whitelist=("$@") @@ -265,28 +272,37 @@ 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" - [[ $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 + [[ $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" +for cachedir in "${cachedirs[@]}"; do + [[ -d $cachedir ]] || + die "cachedir '%s' does not exist or is not a directory" "$cachedir" + + if (( move || delete )); then + [[ ! -w $cachedir ]] && needsroot=1 + fi -# 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[@]}") + # 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 cand < \ + <(printf '%s\n' *.pkg.tar?(.+([^.])) | pacsort --files | + pkgfilter "$keep" "$scanarch" \ + "${#whitelist[*]}" "${whitelist[@]}" \ + "${#blacklist[*]}" "${blacklist[@]}") + + candidates+=("${cand[@]}") + unset cand +done if (( ! ${#candidates[*]} )); then msg 'no candidate packages found for pruning' -- 2.0.3
On Aug 25, 2014 3:09 PM, "Maxim Andersson" <thesilentboatman@gmail.com> wrote:
Either by specifing several -c parameters or only one -c parameter with a comma separated value. One could for example be for the official arch packages and one for the aur.
Signed-off-by: Maxim Andersson <thesilentboatman@gmail.com> --- contrib/paccache.sh.in| 82
1 file changed, 49 insertions(+), 33 deletions(-)
diff --git a/contrib/paccache.sh.inb/contrib/paccache.sh.in index 039ac8a..e96bf81 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
- -m, --move <dir> move candidate packages to "dir". - -r, --remove remove candidate packages. + -d, --dryrun perform a dry run, only finding candidate
++++++++++++++++++++++++++++++-------------------- packages. 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 dirs <<< "$2" + cachedirs+=("${dirs[@]}") + unset dirs shift ;; -d|--dryrun) dryrun=1 ;; @@ -256,6 +258,11 @@ done
m4_include(../scripts/library/term_colors.sh)
+# setting default cachedir +if [ "${#cachedirs[@]}" -eq 0 ]; then + cachedirs[0]='@localstatedir@/cache/pacman/pkg' +else
+ # remaining args are a whitelist whitelist=("$@")
@@ -265,28 +272,37 @@ 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" - [[ $movedir && ! -d $movedir ]] && die "destination directory '%s' does not exist or is not a
This "else" is a syntax error that make check would catch... I was fine with the PE, I just wanted the decl to be an array, i.e. d=("${d[@]:-'default'}") 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
+ [[ $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" +for cachedir in "${cachedirs[@]}"; do + [[ -d $cachedir ]] || + die "cachedir '%s' does not exist or is not a directory" "$cachedir" + + if (( move || delete )); then + [[ ! -w $cachedir ]] && needsroot=1 + fi
-# 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[@]}") + # unlikely that this will fail, but better make sure + cd "$cachedir" >/dev/null || die "failed to chdir to '%s'" "$cachedir"
This might fail on an iteration after the first since we don't enforce absolute dirs for cachedirs. You probably want to return to the original dir after each iteration using pushd/popd. Add error catching and redirect output to /dev/null as we do in makepkg.
+ + # 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 cand < \ + <(printf '%s\n' *.pkg.tar?(.+([^.])) | pacsort --files | + pkgfilter "$keep" "$scanarch" \ + "${#whitelist[*]}" "${whitelist[@]}" \ + "${#blacklist[*]}" "${blacklist[@]}") + + candidates+=("${cand[@]}") + unset cand +done
if (( ! ${#candidates[*]} )); then msg 'no candidate packages found for pruning' -- 2.0.3
I have my doubts about how this works across multiple dirs because we rely on PWD being the cachedir. I'm not in a position to test this (on a phone hours away from home).
+ + # 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 cand < \ + <(printf '%s\n' *.pkg.tar?(.+([^.])) | pacsort --files | + pkgfilter "$keep" "$scanarch" \ + "${#whitelist[*]}" "${whitelist[@]}" \ + "${#blacklist[*]}" "${blacklist[@]}") + + candidates+=("${cand[@]}") + unset cand +done
if (( ! ${#candidates[*]} )); then msg 'no candidate packages found for pruning' -- 2.0.3
I have my doubts about how this works across multiple dirs because we rely on PWD being the cachedir. I'm not in a position to test this (on a phone hours away from home).
Yes, it broke. Strange that I didn't notice that when I tested it before, I must have missed something.. I added the full path to the "candidates" to solve that problem. I will post an updated patch. Thanks again. //Maxim
participants (2)
-
Dave Reisner
-
Maxim Andersson