[pacman-dev] [PATCH] Show 'Required By' in -Si output

Laszlo Papp djszapi at archlinux.us
Wed Oct 7 22:59:58 EDT 2009


On Thu, Oct 8, 2009 at 4:53 AM, Dan McGee <dan at 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 <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
> --
> 1.6.4.4
>
>
>
It seems good at first glance, thanks for implementing this feature.

Best Regards,
Laszlo Papp


More information about the pacman-dev mailing list