On Mon, Feb 21, 2011 at 1:02 PM, Jakob Gruber <[email protected]> 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 <[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. 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 > > >
