On Thu, Oct 8, 2009 at 4:53 AM, Dan McGee <d...@archlinux.org> wrote:
> 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 > > > It seems good at first glance, thanks for implementing this feature. Best Regards, Laszlo Papp