On 02/21/2011 08:02 PM, Jakob Gruber wrote:
Hi,these patches add a VerbosePkgLists option to pacman.conf which applies to install, upgrade and remove operations and produces the following example output: 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 While the output is identical to Justin Lampley's patch from March 2008 (posted here: https://bugs.archlinux.org/task/15772), the table_display function in these patches should be simpler to use. I also consolidated size to string conversions (hope I got most of them) and made a few minor adjustments to the pacman manpage.
Messed up a line while rebasing, the fixed patches are attached and https://github.com/schuay/pacman-arch/commits/working is updated.
The only change is a one line fix: - pm_asprintf(&str, title, alpm_list_count(targets)); + pm_asprintf(&str, title, alpm_list_count(pkgs));
>From 19c8cb2f1715cf8d05b8bb7b170941f6d192f8ad Mon Sep 17 00:00:00 2001 From: Jakob Gruber <[email protected]> Date: Sun, 20 Feb 2011 14:42:05 +0100 Subject: [PATCH 4/6] Refactor display_targets for readability Row handling is moved to its own function in preparation for verbose package lists. Signed-off-by: Jakob Gruber <[email protected]> --- src/pacman/util.c | 53 ++++++++++++++++++++++++++++------------------------- 1 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/pacman/util.c b/src/pacman/util.c index 8903d61..f1f2f26 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -498,10 +498,26 @@ void list_display_linebreak(const char *title, const alpm_list_t *list) } } } + +/* returns package info as a string */ +static char *create_list_element(pmpkg_t *pkg) +{ + char *ret, *size; + const char *pkgstr = config->showsize ? "%s-%s [%s]" : "%s-%s"; + + size = size_to_human_string_mb(alpm_pkg_get_size(pkg)); + pm_asprintf(&ret, pkgstr, alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg), + size); + free(size); + + return ret; +} + /* prepare a list of pkgs to display */ void display_targets(const alpm_list_t *pkgs, int install) { char *str, *size; + const char *title; const alpm_list_t *i; off_t isize = 0, dlsize = 0; alpm_list_t *targets = NULL; @@ -510,34 +526,24 @@ void display_targets(const alpm_list_t *pkgs, int install) return; } - printf("\n"); + title = install ? _("Targets (%d):") : _("Remove (%d):"); + for(i = pkgs; i; i = alpm_list_next(i)) { pmpkg_t *pkg = alpm_list_getdata(i); - if(install) { - dlsize += alpm_pkg_download_size(pkg); - } + dlsize += alpm_pkg_download_size(pkg); isize += alpm_pkg_get_isize(pkg); - /* print the package size with the output if ShowSize option set */ - if(config->showsize) { - size = size_to_human_string_mb(alpm_pkg_get_size(pkg)); - pm_asprintf(&str, "%s-%s [%s]", alpm_pkg_get_name(pkg), - alpm_pkg_get_version(pkg), size); - free(size); - } else { - pm_asprintf(&str, "%s-%s", alpm_pkg_get_name(pkg), - alpm_pkg_get_version(pkg)); - } - targets = alpm_list_add(targets, str); + targets = alpm_list_add(targets, create_list_element(pkg)); } - if(install) { - pm_asprintf(&str, _("Targets (%d):"), alpm_list_count(targets)); - list_display(str, targets); - free(str); - printf("\n"); + pm_asprintf(&str, title, alpm_list_count(pkgs)); + + printf("\n"); + list_display(str, targets); + printf("\n"); + if(install) { size = size_to_human_string_mb(dlsize); printf(_("Total Download Size: %s\n"), size); free(size); @@ -547,16 +553,13 @@ void display_targets(const alpm_list_t *pkgs, int install) free(size); } } else { - pm_asprintf(&str, _("Remove (%d):"), alpm_list_count(targets)); - list_display(str, targets); - free(str); - printf("\n"); - size = size_to_human_string_mb(isize); printf(_("Total Removed Size: %s\n"), size); free(size); } +out: + free(str); FREELIST(targets); } -- 1.7.4.1
>From 63bad71ad245d9f1da8800f678743b6516e4adfa Mon Sep 17 00:00:00 2001 From: Jakob Gruber <[email protected]> Date: Sun, 20 Feb 2011 15:00:26 +0100 Subject: [PATCH 6/6] New VerbosePkgLists option 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 Signed-off-by: Jakob Gruber <[email protected]> --- 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. + + 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 */ /* 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 ad9a336..4209ff7 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")); + 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; +} + +/** 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(pkgs)); 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
