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

Jakob Gruber jakob.gruber at gmail.com
Mon Feb 28 11:34:41 EST 2011


On 02/25/2011 04:30 PM, Dan McGee wrote:
> 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?
>

Indeed. Chose a better example for the commit message this time.

>> 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.
>
Added.

>> +
>> +
>>   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.

Changed the header for the first column to just "Name".

>> +       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?

Simplified the previous patch.

>> +
>> +/** 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