summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/util/pactree.c89
1 files changed, 28 insertions, 61 deletions
diff --git a/src/util/pactree.c b/src/util/pactree.c
index aa02c808..4ff5cf62 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 rev)
{
- 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(rev) {
+ 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, rev);
+ }
}
}
- 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(rev) {
+ 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();