[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