On 02/25/16 at 10:44pm, Johannes Löthberg wrote:
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com> --- doc/pactree.8.txt | 3 +++ src/util/pactree.c | 41 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/doc/pactree.8.txt b/doc/pactree.8.txt index b177788..4c391c0 100644 --- a/doc/pactree.8.txt +++ b/doc/pactree.8.txt @@ -49,6 +49,9 @@ Options *-l, \--linear*:: Prints package names at the start of each line, one per line.
+*-o, \--optdeps*:: + Show packages that are optionally depended upon by the named package. + *-r, \--reverse*:: Show packages that depend on the named package.
diff --git a/src/util/pactree.c b/src/util/pactree.c index 67be9f9..fb91b39 100644 --- a/src/util/pactree.c +++ b/src/util/pactree.c @@ -118,6 +118,7 @@ struct graph_style *style = &graph_utf8; int graphviz = 0; int max_depth = -1; int reverse = 0; +int optdeps = 0; int unique = 0; int searchsyncs = 0; const char *dbpath = DBPATH; @@ -182,6 +183,7 @@ static int parse_options(int argc, char *argv[]) {"help", no_argument, 0, 'h'}, {"linear", no_argument, 0, 'l'}, {"reverse", no_argument, 0, 'r'}, + {"optdeps", no_argument, 0, 'o'}, {"sync", no_argument, 0, 's'}, {"unique", no_argument, 0, 'u'},
@@ -198,7 +200,7 @@ static int parse_options(int argc, char *argv[]) style = &graph_default; #endif
- while((opt = getopt_long(argc, argv, "ab:cd:ghlrsu", opts, &option_index))) { + while((opt = getopt_long(argc, argv, "ab:cd:ghlorsu", opts, &option_index))) { if(opt < 0) { break; } @@ -236,6 +238,9 @@ static int parse_options(int argc, char *argv[]) case 's': searchsyncs = 1; break; + case 'o': + optdeps = 1; + break; case 'u': unique = 1; style = &graph_linear; @@ -266,6 +271,7 @@ static void usage(void) " -g, --graph generate output for graphviz's dot\n" " -h, --help display this help message\n" " -l, --linear enable linear output\n" + " -o, --optdeps list packages that are optionally depended upon by the named package\n" " -r, --reverse list packages that depend on the named package\n" " -s, --sync search sync databases instead of local\n" " -u, --unique show dependencies with no duplicates (implies -l)\n" @@ -381,12 +387,29 @@ static alpm_list_t *get_pkg_dep_names(alpm_pkg_t *pkg) return names; }
+static alpm_list_t *get_pkg_optdep_names(alpm_pkg_t *pkg) +{ + alpm_list_t *i = NULL, *names = NULL; + for(i = alpm_pkg_get_optdepends(pkg); i; i = alpm_list_next(i)) { + alpm_depend_t *d = i->data; + if(searchsyncs) { + names = alpm_list_add(names, d->name); + } else { + alpm_db_t *localdb = alpm_get_localdb(handle); + if(alpm_find_satisfier(alpm_db_get_pkgcache(localdb), d->name)) { + names = alpm_list_add(names, d->name); + }
Why does this hide uninstalled optdepends? We don't hide uninstalled dependencies and I don't see any reason to treat them differently.
+ } + } + return names; +} + /** * walk dependencies, showing dependencies of the target */ -static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, tdepth *depth, int rev) +static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, tdepth *depth, int rev, int optdeps) { - alpm_list_t *deps, *i; + alpm_list_t *deps = NULL, *i = NULL;
if(!pkg || ((max_depth >= 0) && (depth->level > max_depth))) { return; @@ -396,8 +419,16 @@ static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, tdepth *depth, int r
if(rev) { deps = alpm_pkg_compute_requiredby(pkg); + if(optdeps) { + alpm_list_t *odeps = alpm_pkg_compute_optionalfor(pkg); + deps = alpm_list_join(deps, odeps); + } } else { deps = get_pkg_dep_names(pkg); + if(optdeps) { + alpm_list_t *odeps = get_pkg_optdep_names(pkg); + deps = alpm_list_join(deps, odeps); + } }
for(i = deps; i; i = alpm_list_next(i)) { @@ -431,7 +462,7 @@ static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, tdepth *depth, int r d.prev = NULL; } } - walk_deps(dblist, dep_pkg, &d, rev); + walk_deps(dblist, dep_pkg, &d, rev, optdeps); depth->next = NULL; } } @@ -494,7 +525,7 @@ int main(int argc, char *argv[]) NULL, 1 }; - walk_deps(dblist, pkg, &d, reverse); + walk_deps(dblist, pkg, &d, reverse, optdeps);
print_end();
-- 2.7.1