Just as we do in -Qi, we can compute required by information for sync database packages. The behavior seems sane; for a given package, the -Si required by will show all packages in *any* sync database that require it.
Implements FS#16244. Signed-off-by: Dan McGee <d...@archlinux.org> --- lib/libalpm/package.c | 46 ++++++++++++++++++++++++++++++++++++---------- src/pacman/package.c | 13 ++++--------- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index de17166..b0b6480 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -556,6 +556,21 @@ unsigned short SYMEXPORT alpm_pkg_has_scriptlet(pmpkg_t *pkg) return pkg->scriptlet; } +static void find_requiredby(pmpkg_t *pkg, pmdb_t *db, alpm_list_t **reqs) +{ + const alpm_list_t *i; + for(i = _alpm_db_get_pkgcache(db); i; i = i->next) { + if(!i->data) { + continue; + } + pmpkg_t *cachepkg = i->data; + if(_alpm_dep_edge(cachepkg, pkg)) { + const char *cachepkgname = alpm_pkg_get_name(cachepkg); + *reqs = alpm_list_add(*reqs, strdup(cachepkgname)); + } + } +} + /** * @brief Compute the packages requiring a given package. * @param pkg a package @@ -565,18 +580,29 @@ alpm_list_t SYMEXPORT *alpm_pkg_compute_requiredby(pmpkg_t *pkg) { const alpm_list_t *i; alpm_list_t *reqs = NULL; + pmdb_t *db; - pmdb_t *localdb = alpm_option_get_localdb(); - for(i = _alpm_db_get_pkgcache(localdb); i; i = i->next) { - if(!i->data) { - continue; - } - pmpkg_t *cachepkg = i->data; - if(_alpm_dep_edge(cachepkg, pkg)) { - const char *cachepkgname = alpm_pkg_get_name(cachepkg); - reqs = alpm_list_add(reqs, strdup(cachepkgname)); + if(pkg->origin == PKG_FROM_FILE) { + /* The sane option; search locally for things that require this. */ + db = alpm_option_get_localdb(); + fprintf(stderr, "db name: %s\n", db->treename); + find_requiredby(pkg, db, &reqs); + } else { + /* We have a DB package. if it is a local package, then we should + * only search the local DB; else search all known sync databases. */ + db = pkg->origin_data.db; + if(db->is_local) { + fprintf(stderr, "db name: %s\n", db->treename); + find_requiredby(pkg, db, &reqs); + } else { + for(i = handle->dbs_sync; i; i = i->next) { + db = i->data; + fprintf(stderr, "db name: %s\n", db->treename); + find_requiredby(pkg, db, &reqs); + } } } + return(reqs); } diff --git a/src/pacman/package.c b/src/pacman/package.c index 3b14516..e7e2552 100644 --- a/src/pacman/package.c +++ b/src/pacman/package.c @@ -83,10 +83,8 @@ void dump_pkg_full(pmpkg_t *pkg, int level) depstrings = alpm_list_add(depstrings, alpm_dep_compute_string(dep)); } - if(level>0) { - /* compute this here so we don't get a pause in the middle of output */ - requiredby = alpm_pkg_compute_requiredby(pkg); - } + /* compute this here so we don't get a pause in the middle of output */ + requiredby = alpm_pkg_compute_requiredby(pkg); /* actual output */ string_display(_("Name :"), alpm_pkg_get_name(pkg)); @@ -97,11 +95,7 @@ void dump_pkg_full(pmpkg_t *pkg, int level) list_display(_("Provides :"), alpm_pkg_get_provides(pkg)); list_display(_("Depends On :"), depstrings); list_display_linebreak(_("Optional Deps :"), alpm_pkg_get_optdepends(pkg)); - /* Only applicable if installed */ - if(level > 0) { - list_display(_("Required By :"), requiredby); - FREELIST(requiredby); - } + list_display(_("Required By :"), requiredby); list_display(_("Conflicts With :"), alpm_pkg_get_conflicts(pkg)); list_display(_("Replaces :"), alpm_pkg_get_replaces(pkg)); if(level < 0) { @@ -142,6 +136,7 @@ void dump_pkg_full(pmpkg_t *pkg, int level) printf("\n"); FREELIST(depstrings); + FREELIST(requiredby); } /* Display the content of a sync package -- 1.6.4.4