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

Dave Reisner d at falconindy.com
Wed Aug 27 18:57:13 EDT 2014


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 at 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[@]:- at 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
> 


More information about the pacman-dev mailing list