[pacman-dev] [PATCH] pactree: Add support for getting optional dependencies
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); + } + } + } + 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
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
On 01/03, Andrew Gregory wrote:
On 02/25/16 at 10:44pm, Johannes Löthberg wrote:
+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.
It felt cleaner since when you want to get the list of dependencies and optdeps from the local DB you probably don't care about uninstalled ones, but uninstalled dependencies shouldn't really be hidden since it shows that something is likely wrong. But I guess I could remove it and have people that want the more useful output remove those lines themselves... -- Sincerely, Johannes Löthberg PGP Key ID: 0x50FB9B273A9D0BB5 https://theos.kyriasis.com/~kyrias/
On 01/03/16 22:00, Johannes Löthberg wrote:
On 01/03, Andrew Gregory wrote:
On 02/25/16 at 10:44pm, Johannes Löthberg wrote:
+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.
It felt cleaner since when you want to get the list of dependencies and optdeps from the local DB you probably don't care about uninstalled ones, but uninstalled dependencies shouldn't really be hidden since it shows that something is likely wrong.
But I guess I could remove it and have people that want the more useful output remove those lines themselves...
Can we flag dependencies (either dep or optdep) as installed? Also, what happens if the optdepends is a provider? Is it printed as "foo provides bar" like in the dependency case? A
On 26/02/16 07:44, 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.
"Also show" or something to that effect. <snip>
@@ -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"
and here. I'll follow-up the other comment separately.
participants (3)
-
Allan McRae
-
Andrew Gregory
-
Johannes Löthberg