[pacman-dev] [PATCH] paccache: adding removeuninstall option

Dave Reisner d at falconindy.com
Sun Nov 9 17:23:22 UTC 2014


On Thu, Oct 09, 2014 at 04:25:42PM +0200, Maxim Andersson wrote:
> This option removes every uninstalled package in the cache.

Sorry for not replying to this sooner.

> Signed-off-by: Maxim Andersson <thesilentboatman at gmail.com>
> ---
>  contrib/paccache.sh.in | 62 +++++++++++++++++++++++++++++++-------------------
>  1 file changed, 39 insertions(+), 23 deletions(-)
> 
> diff --git a/contrib/paccache.sh.in b/contrib/paccache.sh.in
> index 71aee23..02ccc22 100644
> --- a/contrib/paccache.sh.in
> +++ b/contrib/paccache.sh.in
> @@ -23,7 +23,7 @@ shopt -s extglob
>  declare -r myname='paccache'
>  declare -r myver='@PACKAGE_VERSION@'
>  
> -declare -a cachedirs=() candidates=() cmdopts=() whitelist=() blacklist=()
> +declare -a cachedirs=() candidates=() cmdopts=() whitelist=() blacklist=() installedpkgs=()
>  declare -i delete=0 dryrun=0 filecount=0 move=0 needsroot=0 totalsaved=0 verbose=0
>  declare    delim=$'\n' keep=3 movedir= scanarch=
>  
> @@ -94,11 +94,18 @@ pkgfilter() {
>  
>  		# create blacklist
>  		blen = ARGV[i]; delete ARGV[i]
> -		while (i++ < ARGC) {
> +		while (i++ < 2 + wlen + blen) {
>  			blacklist[ARGV[i]] = 1
>  			delete ARGV[i]
>  		}
>  
> +		# create installedpkgs
> +		ilen = ARGV[i]; delete ARGV[i]
> +		while (i++ < ARGC) {
> +			installedpkgs[ARGV[i]] = 1
> +			delete ARGV[i]
> +		}
> +

This seems an awful lot like you're special casing and duplicating the
blacklist logic. How is calling:

  paccache --removceuninstall ...

any different from:

  pacman -Qq | paccache -i- ...

>  		# read package filenames
>  		while (getline < "/dev/stdin") {
>  			parse_filename($0)
> @@ -108,9 +115,14 @@ pkgfilter() {
>  			# idx[1,2] = idx[pkgname,arch]
>  			split(pkglist, idx, SUBSEP)
>  
> +			count = split(packages[idx[1], idx[2]], pkgs, SUBSEP)
> +
> +		        if (ilen && !installedpkgs[idx[1]]) {
> +				for (i in pkgs) {
> +					print pkgs[i]
> +				}

I think this means that if you have a foopkg archive for both i686 and
x86_64 and foopkg is installed for x86_64, you aren't going to remove
the i686 package (despite it clearly not being installed).

>  			# enforce architecture match if specified
> -			if (!scanarch || scanarch == idx[2]) {
> -				count = split(packages[idx[1], idx[2]], pkgs, SUBSEP)
> +			} else if (!scanarch || scanarch == idx[2]) {
>  				for(i = 1; i <= count - keep; i++) {
>  					print pkgs[i]
>  				}
> @@ -177,25 +189,26 @@ 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. can be used more than once.
> -                          (default: read from @sysconfdir@/pacman.conf).
> -    -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 <dir>    scan "dir" for packages. can be used more than once.
> +                            (default: read from @sysconfdir@/pacman.conf).
> +    -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.
> +        --removeuninstalled removes every uninstalled package in the cache.
> +    -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
>  }
> @@ -207,7 +220,7 @@ version() {
>  
>  OPT_SHORT=':a:c:dfhi:k:m:rsuVvz'
>  OPT_LONG=('arch:' 'cachedir:' 'dryrun' 'force' 'help' 'ignore:' 'keep:' 'move'
> -          'nocolor' 'remove' 'uninstalled' 'version' 'verbose' 'null')
> +          'nocolor' 'remove' 'removeuninstalled' 'uninstalled' 'version' 'verbose' 'null')
>  
>  if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then
>  	exit 1
> @@ -254,6 +267,8 @@ while :; do
>  			shift ;;
>  		-r|--remove)
>  			delete=1 ;;
> +		--removeuninstalled)
> +			IFS=$'\n' read -r -d '' -a installedpkgs < <(pacman -Qq) ;;
>  		-u|--uninstalled)
>  			IFS=$'\n' read -r -d '' -a ign < <(pacman -Qq)
>  			blacklist+=("${ign[@]}")
> @@ -318,7 +333,8 @@ for cachedir in "${cachedirs[@]}"; do
>  		<(printf '%s\n' "$PWD"/*.pkg.tar?(.+([^.])) | pacsort --files |
>  			pkgfilter "$keep" "$scanarch" \
>  				"${#whitelist[*]}" "${whitelist[@]}" \
> -				"${#blacklist[*]}" "${blacklist[@]}")
> +				"${#blacklist[*]}" "${blacklist[@]}" \
> +				"${#installedpkgs[*]}" "${installedpkgs[@]}")
>  
>  	candidates+=("${cand[@]}")
>  	unset cand
> -- 
> 2.1.2


More information about the pacman-dev mailing list