[pacman-dev] [PATCH v5] paccache: adding the possibility for multiple cachedirs
Multiple cachedirs by specifing the -c option more than ones. Also other minor changes: - Removed leading whitespaces in parse_filename() - Aligned --nocolor with other long options in usage() Signed-off-by: Maxim Andersson <thesilentboatman@gmail.com> --- contrib/paccache.sh.in | 62 +++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/contrib/paccache.sh.in b/contrib/paccache.sh.in index 039ac8a..03b2b53 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' @@ -43,7 +43,7 @@ pkgfilter() { # script after the block of awk. awk -v keep="$1" -v scanarch="$2" ' - function parse_filename(filename, parts, count, i, pkgname, arch) { + function parse_filename(filename, parts, count, i, pkgname, arch) { count = split(filename, parts, "-") @@ -133,13 +133,13 @@ summarize() { [[ $pkg =~ $pkg_re ]] && name=${BASH_REMATCH[1]} arch=${BASH_REMATCH[2]} if [[ -z $seen || $seenarch != "$arch" || $seen != "$name" ]]; then seen=$name seenarch=$arch - printf '%s (%s):\n' "$name" "$arch" + printf '%s (%s):\n' "${name##*/}" "$arch" fi - printf ' %s\n' "$pkg" + printf ' %s\n' "${pkg##*/}" elif (( verbose >= 2 )); then - printf "$PWD/%s$delim" "$pkg" - else printf "%s$delim" "$pkg" + else + printf "%s$delim" "${pkg##*/}" fi done < <(printf '%s\n' "$@" | pacsort --files) fi @@ -165,7 +165,7 @@ Usage: ${myname} <operation> [options] [targets...] Options: -a, --arch <arch> scan for "arch" (default: all architectures). - -c, --cachedir <dir> scan "dir" for packages. + -c, --cachedir <dir> scan "dir" for packages. can be used more than once. (default: @localstatedir@/cache/pacman/pkg). -f, --force apply force to mv(1) and rm(1) operations. -h, --help display this help message and exit. @@ -173,7 +173,7 @@ Usage: ${myname} <operation> [options] [targets...] "-" 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. + --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 @@ -203,7 +203,7 @@ while :; do scanarch=$2 shift ;; -c|--cachedir) - cachedir=$2 + cachedirs+=("$2") shift ;; -d|--dryrun) dryrun=1 ;; @@ -256,6 +256,9 @@ done m4_include(../scripts/library/term_colors.sh) +# setting default cachedir +cachedirs=("${cachedirs[@]:-@localstatedir@/cache/pacman/pkg}") + # remaining args are a whitelist whitelist=("$@") @@ -265,28 +268,39 @@ 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 && ${movedir:0:1} != '/' ]] && movedir=$PWD/$movedir + [[ $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 + + # unlikely that this will fail, but better make sure + pushd "$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' "$PWD"/*.pkg.tar?(.+([^.])) | pacsort --files | + pkgfilter "$keep" "$scanarch" \ + "${#whitelist[*]}" "${whitelist[@]}" \ + "${#blacklist[*]}" "${blacklist[@]}") -# 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[@]}") + candidates+=("${cand[@]}") + unset cand + + popd &>/dev/null +done if (( ! ${#candidates[*]} )); then msg 'no candidate packages found for pruning' -- 2.0.3
On Thu, Aug 28, 2014 at 12:43:02AM +0200, Maxim Andersson wrote:
Multiple cachedirs by specifing the -c option more than ones.
Also other minor changes: - Removed leading whitespaces in parse_filename() - Aligned --nocolor with other long options in usage()
Signed-off-by: Maxim Andersson <thesilentboatman@gmail.com> --- contrib/paccache.sh.in | 62 +++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 24 deletions(-)
diff --git a/contrib/paccache.sh.in b/contrib/paccache.sh.in index 039ac8a..03b2b53 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'
@@ -43,7 +43,7 @@ pkgfilter() { # script after the block of awk.
awk -v keep="$1" -v scanarch="$2" ' - function parse_filename(filename, parts, count, i, pkgname, arch) { + function parse_filename(filename, parts, count, i, pkgname, arch) {
NAK. You should have just left this alone. There's no concept of localizing variables to functions except to declare them as function parameters, so in order to distinguish the "required" parameters from the localized variables in the function, the convention is to add some whitespace in the parameter list. Don't worry about this -- I'm pulling your patch to my local with this change reverted (and fixing up the commit message). Thanks!
count = split(filename, parts, "-")
@@ -133,13 +133,13 @@ summarize() { [[ $pkg =~ $pkg_re ]] && name=${BASH_REMATCH[1]} arch=${BASH_REMATCH[2]} if [[ -z $seen || $seenarch != "$arch" || $seen != "$name" ]]; then seen=$name seenarch=$arch - printf '%s (%s):\n' "$name" "$arch" + printf '%s (%s):\n' "${name##*/}" "$arch" fi - printf ' %s\n' "$pkg" + printf ' %s\n' "${pkg##*/}" elif (( verbose >= 2 )); then - printf "$PWD/%s$delim" "$pkg" - else printf "%s$delim" "$pkg" + else + printf "%s$delim" "${pkg##*/}" fi done < <(printf '%s\n' "$@" | pacsort --files) fi @@ -165,7 +165,7 @@ Usage: ${myname} <operation> [options] [targets...]
Options: -a, --arch <arch> scan for "arch" (default: all architectures). - -c, --cachedir <dir> scan "dir" for packages. + -c, --cachedir <dir> scan "dir" for packages. can be used more than once. (default: @localstatedir@/cache/pacman/pkg). -f, --force apply force to mv(1) and rm(1) operations. -h, --help display this help message and exit. @@ -173,7 +173,7 @@ Usage: ${myname} <operation> [options] [targets...] "-" 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. + --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 @@ -203,7 +203,7 @@ while :; do scanarch=$2 shift ;; -c|--cachedir) - cachedir=$2 + cachedirs+=("$2") shift ;; -d|--dryrun) dryrun=1 ;; @@ -256,6 +256,9 @@ done
m4_include(../scripts/library/term_colors.sh)
+# setting default cachedir +cachedirs=("${cachedirs[@]:-@localstatedir@/cache/pacman/pkg}") + # remaining args are a whitelist whitelist=("$@")
@@ -265,28 +268,39 @@ 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 && ${movedir:0:1} != '/' ]] && movedir=$PWD/$movedir + [[ $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 + + # unlikely that this will fail, but better make sure + pushd "$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' "$PWD"/*.pkg.tar?(.+([^.])) | pacsort --files | + pkgfilter "$keep" "$scanarch" \ + "${#whitelist[*]}" "${whitelist[@]}" \ + "${#blacklist[*]}" "${blacklist[@]}")
-# 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[@]}") + candidates+=("${cand[@]}") + unset cand + + popd &>/dev/null +done
if (( ! ${#candidates[*]} )); then msg 'no candidate packages found for pruning' -- 2.0.3
2014-08-28 0:57 GMT+02:00 Dave Reisner <d@falconindy.com>:
On Thu, Aug 28, 2014 at 12:43:02AM +0200, Maxim Andersson wrote:
Multiple cachedirs by specifing the -c option more than ones.
Also other minor changes: - Removed leading whitespaces in parse_filename() - Aligned --nocolor with other long options in usage()
Signed-off-by: Maxim Andersson <thesilentboatman@gmail.com> --- contrib/paccache.sh.in | 62 +++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 24 deletions(-)
diff --git a/contrib/paccache.sh.in b/contrib/paccache.sh.in index 039ac8a..03b2b53 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'
@@ -43,7 +43,7 @@ pkgfilter() { # script after the block of awk.
awk -v keep="$1" -v scanarch="$2" ' - function parse_filename(filename, parts, count, i, pkgname, arch) { + function parse_filename(filename, parts, count, i, pkgname, arch) {
NAK. You should have just left this alone. There's no concept of localizing variables to functions except to declare them as function parameters, so in order to distinguish the "required" parameters from the localized variables in the function, the convention is to add some whitespace in the parameter list.
Don't worry about this -- I'm pulling your patch to my local with this change reverted (and fixing up the commit message).
Thanks!
Ahh ok, didn't know that. Thanks for clarifying!
participants (2)
-
Dave Reisner
-
Maxim Andersson