diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt index 1cc1eaa4..574995c4 100644 --- a/doc/pacman.8.txt +++ b/doc/pacman.8.txt @@ -313,8 +313,10 @@ Query Options[[QO]] with descriptions matching ALL of those terms are returned. *-t, \--unrequired*:: - Restrict or filter output to packages not required by any currently - installed package. + Restrict or filter output to packages not required or optionally required by + any currently installed package. Specify this option twice to only filter + packages that are direct dependencies (i.e. do not filter optional + dependencies). *-u, \--upgrades*:: Restrict or filter output to packages that are out-of-date on the local diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 7aa0271c..5ce8747b 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -146,7 +146,8 @@ static void usage(int op, const char * const myname) addlist(_(" -p, --file query a package file instead of the database\n")); addlist(_(" -q, --quiet show less information for query and search\n")); addlist(_(" -s, --search search locally-installed packages for matching strings\n")); - addlist(_(" -t, --unrequired list packages not required by any package [filter]\n")); + addlist(_(" -t, --unrequired list packages not (optionally) required by any\n" + " package (-tt to ignore optdepends) [filter]\n")); addlist(_(" -u, --upgrades list outdated packages [filter]\n")); } else if(op == PM_OP_SYNC) { printf("%s: %s {-S --sync} [%s] [%s]\n", str_usg, myname, str_opt, str_pkg); @@ -483,7 +484,7 @@ static int parsearg_query(int opt) case 'p': config->op_q_isfile = 1; break; case 'q': config->quiet = 1; break; case 's': config->op_q_search = 1; break; - case 't': config->op_q_unrequired = 1; break; + case 't': (config->op_q_unrequired)++; break; case 'u': config->op_q_upgrade = 1; break; default: return 1; } diff --git a/src/pacman/query.c b/src/pacman/query.c index f5862a2d..e88b393b 100644 --- a/src/pacman/query.c +++ b/src/pacman/query.c @@ -312,11 +312,16 @@ static unsigned short pkg_get_locality(alpm_pkg_t *pkg) return PKG_LOCALITY_FOREIGN; } -static int is_unrequired(alpm_pkg_t *pkg) +static int is_unrequired(alpm_pkg_t *pkg, unsigned short level) { alpm_list_t *requiredby = alpm_pkg_compute_requiredby(pkg); if(requiredby == NULL) { - return 1; + if(level == 1) { + requiredby = alpm_pkg_compute_optionalfor(pkg); + } + if(requiredby == NULL) { + return 1; + } } FREELIST(requiredby); return 0; @@ -339,7 +344,7 @@ static int filter(alpm_pkg_t *pkg) return 0; } /* check if this pkg is unrequired */ - if(config->op_q_unrequired && !is_unrequired(pkg)) { + if(config->op_q_unrequired && !is_unrequired(pkg, config->op_q_unrequired)) { return 0; } /* check if this pkg is outdated */