[pacman-dev] [PATCH] pactree: Add support for getting optional dependencies
Andrew Gregory
andrew.gregory.8 at gmail.com
Tue Mar 1 11:47:09 UTC 2016
On 02/25/16 at 10:44pm, Johannes Löthberg wrote:
> Signed-off-by: Johannes Löthberg <johannes at 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
More information about the pacman-dev
mailing list