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


Reply via email to