diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt index 75b073cd..99fb0fa4 100644 --- a/doc/pacman.conf.5.txt +++ b/doc/pacman.conf.5.txt @@ -174,6 +174,10 @@ 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 for upgrade, sync and remove operations. + 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 161d5169..7b8501c7 100644 --- a/etc/pacman.conf.in +++ b/etc/pacman.conf.in @@ -33,6 +33,7 @@ Architecture = auto #UseDelta #TotalDownload #CheckSpace +#VerbosePkgLists # # REPOSITORIES diff --git a/src/pacman/conf.h b/src/pacman/conf.h index d85f33ee..4f96f4f9 100644 --- a/src/pacman/conf.h +++ b/src/pacman/conf.h @@ -69,11 +69,15 @@ typedef struct __config_t { unsigned int ask; /* conf file options */ - unsigned short chomp; /* I Love Candy! */ + /* I Love Candy! */ + unsigned short chomp; + /* format target pkg lists as table */ + unsigned short verbosepkglists; /* When downloading, display the amount downloaded, rate, ETA, and percent * downloaded of the total download list */ unsigned short totaldownload; - unsigned short cleanmethod; /* select -Sc behavior */ + /* select -Sc behavior */ + unsigned short cleanmethod; alpm_list_t *holdpkg; alpm_list_t *syncfirst; char *xfercommand; diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index db819a7d..2cc3b157 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -988,6 +988,9 @@ static int _parse_options(const char *key, char *value, } else if(strcmp(key, "ILoveCandy") == 0) { config->chomp = 1; pm_printf(PM_LOG_DEBUG, "config: chomp\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 b70bfe58..098daf70 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -629,6 +629,58 @@ 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", _("Name")); + res = alpm_list_add(res, str); + pm_asprintf(&str, "%s", _("Old Version")); + res = alpm_list_add(res, str); + if(install) { + pm_asprintf(&str, "%s", _("New Version")); + res = alpm_list_add(res, str); + } + pm_asprintf(&str, "%s", _("Size")); + res = alpm_list_add(res, str); + + return(res); +} + +/* returns package info as list of strings */ +static alpm_list_t *create_verbose_row(pmpkg_t *pkg, int install) +{ + char *str; + double size; + const char *label; + 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); + + /* old and new versions */ + 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); + } + + pm_asprintf(&str, "%s", alpm_pkg_get_version(pkg)); + ret = alpm_list_add(ret, str); + + /* and size */ + size = humanize_size(alpm_pkg_get_size(pkg), 'M', 1, &label); + pm_asprintf(&str, "%.2f %s", size, label); + ret = alpm_list_add(ret, str); + + return(ret); +} + /* prepare a list of pkgs to display */ void display_targets(const alpm_list_t *pkgs, int install) { @@ -637,12 +689,13 @@ void display_targets(const alpm_list_t *pkgs, int install) double size; const alpm_list_t *i; off_t isize = 0, dlsize = 0; - alpm_list_t *targets = NULL; + alpm_list_t *j, *lp, *header = NULL, *targets = NULL; if(!pkgs) { return; } + /* gather pkg infos */ for(i = pkgs; i; i = alpm_list_next(i)) { pmpkg_t *pkg = alpm_list_getdata(i); @@ -651,16 +704,30 @@ void display_targets(const alpm_list_t *pkgs, int install) } isize += alpm_pkg_get_isize(pkg); - pm_asprintf(&str, "%s-%s", alpm_pkg_get_name(pkg), - alpm_pkg_get_version(pkg)); - targets = alpm_list_add(targets, str); + if(config->verbosepkglists) { + targets = alpm_list_add(targets, create_verbose_row(pkg, install)); + } else { + pm_asprintf(&str, "%s-%s", alpm_pkg_get_name(pkg), + alpm_pkg_get_version(pkg)); + targets = alpm_list_add(targets, str); + } } + /* print to screen */ title = install ? _("Targets (%d):") : _("Remove (%d):"); pm_asprintf(&str, title, alpm_list_count(pkgs)); printf("\n"); - list_display(str, targets); + if(config->verbosepkglists) { + header = create_verbose_header(install); + if(table_display(str, header, targets) != 0) { + config->verbosepkglists = 0; + display_targets(pkgs, install); + goto out; + } + } else { + list_display(str, targets); + } printf("\n"); if(install) { @@ -675,8 +742,20 @@ void display_targets(const alpm_list_t *pkgs, int install) printf(_("Total Removed Size: %.2f %s\n"), size, label); } +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); + FREELIST(header); + } else { + FREELIST(targets); + } free(str); - FREELIST(targets); } static off_t pkg_get_size(pmpkg_t *pkg)