Passing two -t will restrict or filter output to packages also not set as
optional dependency by any installed package.

Makes it easy to spot potentially useless packages using -Qdttq

Signed-off-by: Olivier Brunel <[email protected]>
---
 doc/pacman.8.txt    |  4 +++-
 src/pacman/pacman.c |  2 +-
 src/pacman/query.c  | 11 ++++++++---
 3 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt
index 1cc1eaa..6abd491 100644
--- a/doc/pacman.8.txt
+++ b/doc/pacman.8.txt
@@ -314,7 +314,9 @@ Query Options[[QO]]
 
 *-t, \--unrequired*::
        Restrict or filter output to packages not required by any currently
-       installed package.
+       installed package. Passing two '--unrequired' or '-t' flags will 
restrict or
+       filter output to packages also not set as optional dependency by any
+       currently installed package.
 
 *-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 7aa0271..4a94d32 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -483,7 +483,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 f5862a2..f15555a 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 */
-- 
1.8.3.1


Reply via email to