[pacman-dev] [PATCH 6/6] New VerbosePkgLists option

Dan McGee dpmcgee at gmail.com
Fri Feb 25 10:30:48 EST 2011


On Mon, Feb 21, 2011 at 1:02 PM, Jakob Gruber <jakob.gruber at gmail.com> wrote:
> If enabled, displays package lists for upgrade, sync and remove
> operations formatted as a table. Falls back to default list display if
> insufficient terminal columns are available.
>
> Example output (-Su):
>
> Targets (25):
>
> Pkg Name          New Version           Old Version          Size
>
> asciidoc          8.6.4-1               8.6.3-1           0.15 MB
> chromium          9.0.597.94-2          9.0.597.94-1     17.80 MB
> ...
> wine              1.3.14-1              1.3.13-2         24.67 MB
>
> Total Download Size:    158.41 MB
> Total Installed Size:   693.05 MB
>
> Example output (-S, some targets already installed):
>
> kdeedu-kturtle     4.6.0-1                      0.22 MB
> kdeedu-kwordquiz   4.6.0-1                      1.06 MB
> kdeedu-marble      4.6.0-1      4.6.0-1        14.95 MB
>
> Example output (-R):
>
> Remove (15):
>
> Pkg Name                 Old Version       Size
>
> kdeutils-sweeper         4.6.0-1        0.12 MB
> kdeutils-superkaramba    4.6.0-1        1.08 MB
> kdeutils-printer-applet  4.6.0-1        0.16 MB
> kdeutils-kwallet         4.6.0-1        0.81 MB

Probably just omitted but I assume "Total Removed Size" is there somewhere?

> Signed-off-by: Jakob Gruber <jakob.gruber at gmail.com>
> ---
>  doc/pacman.conf.5.txt |    5 +++
>  etc/pacman.conf.in    |    1 +
>  src/pacman/conf.h     |    1 +
>  src/pacman/pacman.c   |    3 ++
>  src/pacman/util.c     |   95 ++++++++++++++++++++++++++++++++++++++++++++++--
>  5 files changed, 101 insertions(+), 4 deletions(-)
>
> diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt
> index cb4c589..063d305 100644
> --- a/doc/pacman.conf.5.txt
> +++ b/doc/pacman.conf.5.txt
> @@ -168,6 +168,11 @@ Options
>        Performs an approximate check for adequate available disk space before
>        installing packages.
>
> +*VerbosePkgLists*::
> +       Displays name, version and size of target packages formatted
> +       as a table.
during which operations? You explained it in the commit message just not here.

> +
> +
>  Repository Sections
>  -------------------
>  Each repository section defines a section name and at least one location where
> diff --git a/etc/pacman.conf.in b/etc/pacman.conf.in
> index 1105db9..bf5925f 100644
> --- a/etc/pacman.conf.in
> +++ b/etc/pacman.conf.in
> @@ -34,6 +34,7 @@ Architecture = auto
>  #UseDelta
>  #TotalDownload
>  #CheckSpace
> +#VerbosePkgLists
>
>  #
>  # REPOSITORIES
> diff --git a/src/pacman/conf.h b/src/pacman/conf.h
> index 92c379f..f440090 100644
> --- a/src/pacman/conf.h
> +++ b/src/pacman/conf.h
> @@ -70,6 +70,7 @@ typedef struct __config_t {
>        /* conf file options */
>        unsigned short chomp; /* I Love Candy! */
>        unsigned short showsize; /* show individual package sizes */
> +       unsigned short verbosepkglists; /* format target pkg lists as table */
Part of me is tempted to say we should kill showsize now. I know it
shows up in -Qs and -Ss, but is that even useful? Opinions?

>        /* When downloading, display the amount downloaded, rate, ETA, and percent
>         * downloaded of the total download list */
>        unsigned short totaldownload;
> diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
> index 984bd1b..4cf14bb 100644
> --- a/src/pacman/pacman.c
> +++ b/src/pacman/pacman.c
> @@ -967,6 +967,9 @@ static int _parse_options(char *key, char *value)
>                } else if(strcmp(key, "ShowSize") == 0) {
>                        config->showsize = 1;
>                        pm_printf(PM_LOG_DEBUG, "config: showsize\n");
> +               } else if(strcmp(key, "VerbosePkgLists") == 0) {
> +                       config->verbosepkglists = 1;
> +                       pm_printf(PM_LOG_DEBUG, "config: verbosepkglists\n");
>                } else if(strcmp(key, "UseDelta") == 0) {
>                        alpm_option_set_usedelta(1);
>                        pm_printf(PM_LOG_DEBUG, "config: usedelta\n");
> diff --git a/src/pacman/util.c b/src/pacman/util.c
> index 8f7b5e5..71100dd 100644
> --- a/src/pacman/util.c
> +++ b/src/pacman/util.c
> @@ -607,6 +607,62 @@ void list_display_linebreak(const char *title, const alpm_list_t *list)
>        }
>  }
>
> +/* creates a header row for use with table_display */
> +static alpm_list_t *create_verbose_header(int install)
> +{
> +       alpm_list_t *res = NULL;
> +       char *str;
> +
> +       pm_asprintf(&str, "%s", _("Pkg Name"));
Are we that constrained for size here? "Package Name" would be good;
remember also that these are translated strings and other locales
could very well have longer strings.
> +       res = alpm_list_add(res, str);
> +       if(install) {
> +               pm_asprintf(&str, "%s", _("New Version"));
> +               res = alpm_list_add(res, str);
> +       }
> +       pm_asprintf(&str, "%s", _("Old Version"));
> +       res = alpm_list_add(res, str);
> +       pm_asprintf(&str, "%s", _("Size"));
> +       res = alpm_list_add(res, str);
> +
> +       return res;
> +}
So your magic NULL, NULL first row is now slightly making sense from
the other patch, but I think you are still not accounting for header
size > max row sizes?

> +
> +/** Generates a table row with package info *
> + *
> + * @param pkg  the package
> + * @param install      if value is zero format for remove operation,
> + *                                                             otherwise for installation
> + *
> + * @return a list of strings representing the current row
> + */
> +static alpm_list_t *create_verbose_row(pmpkg_t *pkg, int install)
> +{
> +       char *str;
> +       alpm_list_t *ret = NULL;
> +       pmdb_t *ldb = alpm_option_get_localdb();
> +
> +       /* a row consists of the package name, */
> +       pm_asprintf(&str,"%s", alpm_pkg_get_name(pkg));
> +       ret = alpm_list_add(ret, str);
> +
> +       /* (new version,) old version */
> +       pm_asprintf(&str,"%s", alpm_pkg_get_version(pkg));
> +       ret = alpm_list_add(ret, str);
> +
> +       if(install) {
> +               pmpkg_t *oldpkg = alpm_db_get_pkg(ldb, alpm_pkg_get_name(pkg));
> +               pm_asprintf(&str, "%s",
> +                               oldpkg != NULL ? alpm_pkg_get_version(oldpkg) : "");
> +               ret = alpm_list_add(ret, str);
> +       }
> +
> +       /* and size */
> +       str = size_to_human_string_mb(alpm_pkg_get_size(pkg));
> +       ret = alpm_list_add(ret, str);
> +
> +       return ret;
> +}
> +
>  /* returns package info as a string */
>  static char *create_list_element(pmpkg_t *pkg)
>  {
> @@ -628,7 +684,7 @@ void display_targets(const alpm_list_t *pkgs, int install)
>        const char *title;
>        const alpm_list_t *i;
>        off_t isize = 0, dlsize = 0;
> -       alpm_list_t *targets = NULL;
> +       alpm_list_t *j, *lp, *targets = NULL;
>
>        if(!pkgs) {
>                return;
> @@ -636,19 +692,40 @@ void display_targets(const alpm_list_t *pkgs, int install)
>
>        title = install ? _("Targets (%d):") : _("Remove (%d):");
>
> +       if(config->verbosepkglists) {
> +               /* create table header and add an empty line after it */
> +               targets = alpm_list_add(targets, create_verbose_header(install));
> +               targets = alpm_list_add(targets, NULL);
> +       }
> +
> +       /* gather pkg infos */
>        for(i = pkgs; i; i = alpm_list_next(i)) {
>                pmpkg_t *pkg = alpm_list_getdata(i);
>
>                dlsize += alpm_pkg_download_size(pkg);
>                isize += alpm_pkg_get_isize(pkg);
>
> -               targets = alpm_list_add(targets, create_list_element(pkg));
> +               if(config->verbosepkglists) {
> +                       targets = alpm_list_add(targets, create_verbose_row(pkg, install));
> +               } else {
> +                       targets = alpm_list_add(targets, create_list_element(pkg));
> +               }
>        }
>
> +       /* print to screen */
>        pm_asprintf(&str, title, alpm_list_count(targets));
>
>        printf("\n");
> -       list_display(str, targets);
> +       if(config->verbosepkglists) {
> +               if(table_display(str, targets) != 0) {
> +                       printf(_("Insufficient columns available, using default list display...\n"));
> +                       config->verbosepkglists = 0;
> +                       display_targets(pkgs, install);
> +                       goto out;
> +               }
> +       } else {
> +               list_display(str, targets);
> +       }
>        printf("\n");
>
>        if(install) {
> @@ -667,8 +744,18 @@ void display_targets(const alpm_list_t *pkgs, int install)
>        }
>
>  out:
> +       /* cleanup */
> +       if(config->verbosepkglists) {
> +               /* targets is a list of lists of strings, free inner lists here */
> +               for(j = alpm_list_first(targets); j; j = alpm_list_next(j)) {
> +                       lp = alpm_list_getdata(j);
> +                       FREELIST(lp);
> +               }
> +               alpm_list_free(targets);
> +       } else {
> +               FREELIST(targets);
> +       }
>        free(str);
> -       FREELIST(targets);
>  }
>
>  static off_t pkg_get_size(pmpkg_t *pkg)
> --
> 1.7.4.1
>
>
>


More information about the pacman-dev mailing list