Make --unrequired filter packages that are optdep as well

Specify it twice to only filter direct dependencies.

Signed-off-by: Olivier Brunel <i.am.jack.mail@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Olivier Brunel 2013-06-17 10:46:38 +02:00 committed by Allan McRae
parent d7d4f47d63
commit 00513823dc
3 changed files with 15 additions and 7 deletions

View File

@ -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

View File

@ -146,7 +146,8 @@ static void usage(int op, const char * const myname)
addlist(_(" -p, --file <package> query a package file instead of the database\n"));
addlist(_(" -q, --quiet show less information for query and search\n"));
addlist(_(" -s, --search <regex> 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;
}

View File

@ -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 */