[pacman-dev] [PATCH 1/2] pactree: consolidate both walk_deps functions
Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com> --- src/util/pactree.c | 89 +++++++++++++++++------------------------------------- 1 file changed, 28 insertions(+), 61 deletions(-) diff --git a/src/util/pactree.c b/src/util/pactree.c index aa02c80..6c91a0a 100644 --- a/src/util/pactree.c +++ b/src/util/pactree.c @@ -359,85 +359,56 @@ static void print_end(void) } } -static alpm_pkg_t *get_pkg_from_dbs(alpm_list_t *dbs, const char *needle) { - alpm_list_t *i; - alpm_pkg_t *ret; - - for(i = dbs; i; i = alpm_list_next(i)) { - ret = alpm_db_get_pkg(i->data, needle); - if(ret) { - return ret; - } +static alpm_list_t *get_pkg_dep_names(alpm_pkg_t *pkg) +{ + alpm_list_t *i, *names = NULL; + for(i = alpm_pkg_get_depends(pkg); i; i = alpm_list_next(i)) { + alpm_depend_t *d = i->data; + names = alpm_list_add(names, d->name); } - return NULL; + return names; } /** - * walk dependencies in reverse, showing packages which require the target + * walk dependencies, showing dependencies of the target */ -static void walk_reverse_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, int depth) +static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, int depth, int reverse) { - alpm_list_t *required_by, *i; + alpm_list_t *deps, *i; if(!pkg || ((max_depth >= 0) && (depth == max_depth + 1))) { return; } walked = alpm_list_add(walked, (void *)alpm_pkg_get_name(pkg)); - required_by = alpm_pkg_compute_requiredby(pkg); - for(i = required_by; i; i = alpm_list_next(i)) { + if(reverse) { + deps = alpm_pkg_compute_requiredby(pkg); + } else { + deps = get_pkg_dep_names(pkg); + } + + for(i = deps; i; i = alpm_list_next(i)) { const char *pkgname = i->data; - if(alpm_list_find_str(walked, pkgname)) { + alpm_pkg_t *dep_pkg = alpm_find_dbs_satisfier(handle, dblist, pkgname); + + if(alpm_list_find_str(walked, dep_pkg ? alpm_pkg_get_name(dep_pkg) : pkgname)) { /* if we've already seen this package, don't print in "unique" output * and don't recurse */ if(!unique) { - print(alpm_pkg_get_name(pkg), pkgname, NULL, depth); + print(alpm_pkg_get_name(pkg), alpm_pkg_get_name(dep_pkg), pkgname, depth); } } else { - print(alpm_pkg_get_name(pkg), pkgname, NULL, depth); - walk_reverse_deps(dblist, get_pkg_from_dbs(dblist, pkgname), depth + 1); + print(alpm_pkg_get_name(pkg), alpm_pkg_get_name(dep_pkg), pkgname, depth); + if(dep_pkg) { + walk_deps(dblist, dep_pkg, depth + 1, reverse); + } } } - FREELIST(required_by); -} - -/** - * walk dependencies, showing dependencies of the target - */ -static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, int depth) -{ - alpm_list_t *i; - - if((max_depth >= 0) && (depth == max_depth + 1)) { - return; - } - - walked = alpm_list_add(walked, (void *)alpm_pkg_get_name(pkg)); - - for(i = alpm_pkg_get_depends(pkg); i; i = alpm_list_next(i)) { - alpm_depend_t *depend = i->data; - alpm_pkg_t *provider = alpm_find_dbs_satisfier(handle, dblist, depend->name); - - if(provider) { - const char *provname = alpm_pkg_get_name(provider); - - if(alpm_list_find_str(walked, provname)) { - /* if we've already seen this package, don't print in "unique" output - * and don't recurse */ - if(!unique) { - print(alpm_pkg_get_name(pkg), provname, depend->name, depth); - } - } else { - print(alpm_pkg_get_name(pkg), provname, depend->name, depth); - walk_deps(dblist, provider, depth + 1); - } - } else { - /* unresolvable package */ - print(alpm_pkg_get_name(pkg), NULL, depend->name, depth); - } + if(reverse) { + FREELIST(deps); } } @@ -486,11 +457,7 @@ int main(int argc, char *argv[]) print_start(alpm_pkg_get_name(pkg), target_name); - if(reverse) { - walk_reverse_deps(dblist, pkg, 1); - } else { - walk_deps(dblist, pkg, 1); - } + walk_deps(dblist, pkg, 1, reverse); print_end(); -- 1.7.11.1
Showing vertical limbs makes the tree easier to follow. Old: New: |--pkg |--pkg |--dep1 |--dep1 |--dep2 | |--dep2 |--dep3 |--dep3 |--dep4 |--dep4 Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com> --- src/util/pactree.c | 80 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/src/util/pactree.c b/src/util/pactree.c index 6c91a0a..5d82a55 100644 --- a/src/util/pactree.c +++ b/src/util/pactree.c @@ -27,11 +27,18 @@ #define LINE_MAX 512 +typedef struct tdepth { + struct tdepth *prev; + struct tdepth *next; + int level; +} tdepth; + /* output */ struct graph_style { const char *provides; const char *tip1; const char *tip2; + const char *limb; int indent; }; @@ -39,6 +46,7 @@ static struct graph_style graph_default = { " provides", "|--", "+--", + "|", 3 }; @@ -46,6 +54,7 @@ static struct graph_style graph_linear = { "", "", "", + "", 0 }; @@ -292,28 +301,36 @@ static void cleanup(void) } /* pkg provides provision */ -static void print_text(const char *pkg, const char *provision, int depth) +static void print_text(const char *pkg, const char *provision, tdepth *depth) { - int indent_sz = (depth + 1) * style->indent; - if(!pkg && !provision) { /* not much we can do */ return; } + /* print limbs */ + while(depth->prev) + depth = depth->prev; + int level = 0; + printf("%s", color->branch1); + while(depth->next){ + printf("%*s%-*s", style->indent * (depth->level - level), "", + style->indent, style->limb); + level = depth->level + 1; + depth = depth->next; + } + printf("%*s", style->indent * (depth->level - level), ""); + + /* print tip */ if(!pkg && provision) { - /* we failed to resolve provision */ - printf("%s%*s%s%s%s [unresolvable]%s\n", color->branch1, indent_sz, - style->tip1, color->leaf1, provision, color->branch1, color->off); + printf("%s%s%s%s [unresolvable]%s\n", style->tip1, color->leaf1, + provision, color->branch1, color->off); } else if(provision && strcmp(pkg, provision) != 0) { - /* pkg provides provision */ - printf("%s%*s%s%s%s%s %s%s%s\n", color->branch2, indent_sz, style->tip2, - color->leaf1, pkg, color->leaf2, style->provides, color->leaf1, provision, + printf("%s%s%s%s%s %s%s%s\n", style->tip2, color->leaf1, pkg, + color->leaf2, style->provides, color->leaf1, provision, color->off); } else { - /* pkg is a normal package */ - printf("%s%*s%s%s%s\n", color->branch1, indent_sz, style->tip1, color->leaf1, - pkg, color->off); + printf("%s%s%s%s\n", style->tip1, color->leaf1, pkg, color->off); } } @@ -331,7 +348,7 @@ static void print_graph(const char *parentname, const char *pkgname, const char } /* parent depends on dep which is satisfied by pkg */ -static void print(const char *parentname, const char *pkgname, const char *depname, int depth) +static void print(const char *parentname, const char *pkgname, const char *depname, tdepth *depth) { if(graphviz) { print_graph(parentname, pkgname, depname); @@ -347,7 +364,12 @@ static void print_start(const char *pkgname, const char *provname) "node [style=filled, color=green];\n" " \"START\" -> \"%s\";\n", pkgname); } else { - print_text(pkgname, provname, 0); + tdepth d = { + NULL, + NULL, + 0 + }; + print_text(pkgname, provname, &d); } } @@ -372,11 +394,11 @@ static alpm_list_t *get_pkg_dep_names(alpm_pkg_t *pkg) /** * walk dependencies, showing dependencies of the target */ -static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, int depth, int reverse) +static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, tdepth *depth, int reverse) { alpm_list_t *deps, *i; - if(!pkg || ((max_depth >= 0) && (depth == max_depth + 1))) { + if(!pkg || ((max_depth >= 0) && (depth->level > max_depth))) { return; } @@ -402,7 +424,24 @@ static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, int depth, int rever } else { print(alpm_pkg_get_name(pkg), alpm_pkg_get_name(dep_pkg), pkgname, depth); if(dep_pkg) { - walk_deps(dblist, dep_pkg, depth + 1, reverse); + tdepth d = { + depth, + NULL, + depth->level + 1 + }; + depth->next = &d; + /* last dep, cut off the limb here */ + if(!alpm_list_next(i)){ + if(depth->prev){ + depth->prev->next = &d; + d.prev = depth->prev; + depth = &d; + } else { + d.prev = NULL; + } + } + walk_deps(dblist, dep_pkg, &d, reverse); + depth->next = NULL; } } } @@ -457,7 +496,12 @@ int main(int argc, char *argv[]) print_start(alpm_pkg_get_name(pkg), target_name); - walk_deps(dblist, pkg, 1, reverse); + tdepth d = { + NULL, + NULL, + 1 + }; + walk_deps(dblist, pkg, &d, reverse); print_end(); -- 1.7.11.1
On 03/07/12 12:51, Andrew Gregory wrote:
Showing vertical limbs makes the tree easier to follow.
Old: New: |--pkg |--pkg |--dep1 |--dep1 |--dep2 | |--dep2 |--dep3 |--dep3 |--dep4 |--dep4
Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com> ---
Fixed more shadow warnings with reverse.
src/util/pactree.c | 80 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 18 deletions(-)
diff --git a/src/util/pactree.c b/src/util/pactree.c index 6c91a0a..5d82a55 100644 --- a/src/util/pactree.c +++ b/src/util/pactree.c @@ -27,11 +27,18 @@
#define LINE_MAX 512
+typedef struct tdepth { + struct tdepth *prev; + struct tdepth *next; + int level; +} tdepth;
This is not really our usual naming style of struct types. But I'll leave that to Dan when he merges this... On my working branch, Allan
On 03/07/12 12:51, Andrew Gregory wrote:
Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com> ---
pactree.c: In function ‘walk_deps’: pactree.c:397:80: error: declaration of ‘reverse’ shadows a global declaration [-Werror=shadow] static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, tdepth *depth, int reverse) ^ pactree.c:101:5: error: shadowed declaration is here [-Werror=shadow] int reverse = 0; ^ cc1: all warnings being treated as errors Fixed and pushed to my working branch. Allan
participants (2)
-
Allan McRae
-
Andrew Gregory