[PATCH] pactree: Fix tree drawing for --optional
Sebastian Jakubiak
jakseb.dev at gmail.com
Wed Jul 29 23:30:54 UTC 2020
Example of an incorrect behavior:
$ pactree -a -d1 -o dia
dia
|-libxslt
`-gtk2
`-python2 (optional)
The last non-optional dependency, gtk2, has its limb drawn as if it were
the last child of a node, even though an optional dependency follows.
Signed-off-by: Sebastian Jakubiak <jakseb.dev at gmail.com>
---
src/pactree.c | 23 +++++++++++------------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/src/pactree.c b/src/pactree.c
index 39328e7..e34ecc8 100644
--- a/src/pactree.c
+++ b/src/pactree.c
@@ -505,7 +505,7 @@ static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, tdepth *depth, int r
/**
* print the dependency list given, passing the optional parameter when required
*/
-static void print_dep_list(alpm_list_t *deps, alpm_list_t *dblist, alpm_pkg_t *pkg, tdepth *depth, int rev, int optional, int opt_dep)
+static void print_dep_list(alpm_list_t *deps, alpm_list_t *dblist, alpm_pkg_t *pkg, tdepth *depth, int rev, int optional, int opt_dep, int final)
{
alpm_list_t *i;
int new_optional;
@@ -520,7 +520,7 @@ static void print_dep_list(alpm_list_t *deps, alpm_list_t *dblist, alpm_pkg_t *p
for(i = deps; i; i = alpm_list_next(i)) {
const char *pkgname = i->data;
- int last = alpm_list_next(i) ? 0 : 1;
+ int last = final && (alpm_list_next(i) ? 0 : 1);
alpm_pkg_t *dep_pkg = alpm_find_dbs_satisfier(handle, dblist, pkgname);
@@ -561,7 +561,7 @@ static void print_dep_list(alpm_list_t *deps, alpm_list_t *dblist, alpm_pkg_t *p
*/
static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, tdepth *depth, int rev, int optional)
{
- alpm_list_t *deps;
+ alpm_list_t *deps, *optdeps;
if(!pkg || ((max_depth >= 0) && (depth->level > max_depth))) {
return;
@@ -575,21 +575,20 @@ static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, tdepth *depth, int r
deps = get_pkg_deps(pkg);
}
- print_dep_list(deps, dblist, pkg, depth, rev, optional, 0);
-
- FREELIST(deps);
-
+ optdeps = NULL;
if(optional){
if(rev) {
- deps = alpm_pkg_compute_optionalfor(pkg);
+ optdeps = alpm_pkg_compute_optionalfor(pkg);
} else {
- deps = get_pkg_optdeps(pkg);
+ optdeps = get_pkg_optdeps(pkg);
}
+ }
- print_dep_list(deps, dblist, pkg, depth, rev, optional, 1);
+ print_dep_list(deps, dblist, pkg, depth, rev, optional, 0, !optdeps);
+ FREELIST(deps);
- FREELIST(deps);
- }
+ print_dep_list(optdeps, dblist, pkg, depth, rev, optional, 1, 1);
+ FREELIST(optdeps);
}
int main(int argc, char *argv[])
--
2.27.0
More information about the pacman-contrib
mailing list