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

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


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:

:: Starting full system upgrade...
:: Replace libjpeg with testing/libjpeg-turbo? [Y/n]
resolving dependencies...
looking for inter-conflicts...

Remove (1):

Name     Old Version       Size

libjpeg  8.3.0-1        0.83 MB

Total Removed Size:   0.83 MB

Targets (5):

Name            Old Version  New Version       Size

libjpeg-turbo                1.1.0-1        0.20 MB
linux-firmware  20110201-1   20110227-1     8.23 MB
ncurses         5.7-4        5.8-1          0.92 MB
ppl             0.11.1-1     0.11.2-1       2.74 MB
v4l-utils       0.8.1-1      0.8.3-1        0.23 MB

Total Download Size:    12.32 MB
Total Installed Size:   58.82 MB

Signed-off-by: Jakob Gruber <jakob.gruber at gmail.com>
---
 doc/pacman.conf.5.txt |    4 ++
 etc/pacman.conf.in    |    1 +
 src/pacman/conf.h     |    1 +
 src/pacman/pacman.c   |    3 ++
 src/pacman/util.c     |   87 ++++++++++++++++++++++++++++++++++++++++++++++--
 5 files changed, 92 insertions(+), 4 deletions(-)

diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt
index cb4c589..b9639b9 100644
--- a/doc/pacman.conf.5.txt
+++ b/doc/pacman.conf.5.txt
@@ -168,6 +168,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 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 65656ff..3cc610f 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -609,6 +609,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);
+}
+
 /* returns package info as a string */
 static char *create_list_element(pmpkg_t *pkg)
 {
@@ -632,12 +684,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, *targets = NULL;
 
 	if(!pkgs) {
 		return;
 	}
 
+	/* gather pkg infos */
 	for(i = pkgs; i; i = alpm_list_next(i)) {
 		pmpkg_t *pkg = alpm_list_getdata(i);
 
@@ -646,14 +699,28 @@ void display_targets(const alpm_list_t *pkgs, int install)
 		}
 		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 */
 	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) {
@@ -668,8 +735,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)
-- 
1.7.4.1



More information about the pacman-dev mailing list