On 02/25/16 at 10:44pm, Johannes Löthberg wrote:
> Signed-off-by: Johannes Löthberg <[email protected]>
> ---
>  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

Reply via email to