[pacman-dev] [PATCH] paccache: adding removeuninstall option
Maxim Andersson
thesilentboatman at gmail.com
Thu Oct 9 14:25:42 UTC 2014
This option removes every uninstalled package in the cache.
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]
+ }
+
# 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]
+ }
# 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