[pacman-dev] [PATCH] Show 'Required By' in -Si output
Aaron Griffin
aaronmgriffin at gmail.com
Wed Oct 7 23:18:58 EDT 2009
On Wed, Oct 7, 2009 at 10:14 PM, Allan McRae <allan at archlinux.org> wrote:
> Dan McGee 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 <dan at 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
>>
>
> Looking at this, I can not see a way of turning it off. I might be missing
> something....
>
>> cd /var/abs
>> grep -R "depends" {core,extra}/* | grep glibc | wc -l
> 365
>> grep -R "depends" {core,extra}/* | grep perl | wc -l
> 237
>
> How many lines of output will that result in?
Would this maybe make sense in -Sii output?
More information about the pacman-dev
mailing list