[pacman-dev] [patch] Display size for packages

Nathan Jones nathanj at insightbb.com
Sun May 6 11:16:27 EDT 2007


This patch adds a -z|--showsize option to the -Q and -S commands. The
option displays the size of individual packages. This is something that
I have wanted for a while, and there is a feature request for it [1].

The output is a bit messy, but I find it useful regardless. Some sample
output:

$ ./pacman -Quz
Checking for package upgrades...

Remove: gaim  

Targets: pidgin-2.0.0-1 [7.4 MB]  alsa-lib-1.0.14rc3-2 [0.4 MB]  
         alsa-utils-1.0.14rc2-2 [1.0 MB]  binutils-2.17-3 [2.8 MB]  
         cabextract-1.2-1 [0.1 MB]  cairo-1.4.6-1 [0.5 MB]  
         esd-0.2.38-1 [0.1 MB]  filesystem-0.8-3 [0.1 MB]  
         gcc-4.1.2-4 [17.9 MB]  ghostscript-8.15.4-2 [5.7 MB]  
         gimp-2.2.14-1 [10.5 MB]  glib2-2.12.12-1 [1.2 MB]  
         gmime-2.2.8-1 [0.3 MB]  gnutls-1.6.2-1 [1.0 MB]  
         gtk2-2.10.12-1 [7.0 MB]  hal-0.5.9-2 [0.4 MB]  
         hal-info-0.20070425-1 [0.1 MB]  imlib2-1.3.0-1 [0.7 MB]  
         initscripts-0.8-7 [0.1 MB]  klibc-udev-110-2 [0.1 MB]  
         libfontenc-1.0.4-1 [0.1 MB]  libldap-2.3.35-1 [0.6 MB]  
         libxfce4util-4.4.1-3 [0.1 MB]  libxml2-2.6.28-1 [1.5 MB]  
         mutt-1.5.15-2 [1.2 MB]  namcap-1.6-1 [0.1 MB]  nano-2.0.5-1 [0.4 MB]  
         net-tools-1.60-11 [0.2 MB]  openssl-0.9.8e-3 [2.0 MB]  
         p7zip-4.45-2 [1.5 MB]  pango-1.16.4-1 [0.4 MB]  
         perl-xml-simple-2.16-2 [0.1 MB]  pygtk-2.10.4-2 [1.3 MB]  
         shared-mime-info-0.21-1 [0.5 MB]  subversion-1.4.3-3 [4.7 MB]  
         unrar-3.7.5-1 [0.1 MB]  xorg-font-utils-1.0.3-2 [0.1 MB]  
         xorg-fonts-encodings-1.0.2-2 [0.6 MB]  

Total Package Size:   72.20 MB

$ ./pacman -Ssz pacman
current/pacman 2.9.8-4 0.47 MB
    A .tar.gz based package manager with dependency support
extra/namcap 1.6-1 0.03 MB
    A Pacman package analyzer
extra/srcpac 0.5-1 0.01 MB
    The pacman from-source wrapper


I'm sure that everyone does not want to add too many flags to pacman, so
would it be preferable to have a DisplaySize option in pacman.conf
instead?

There are quite a few places where dividing by 1024 takes place to
display the size, and this patch adds a few more. Would it be best to
create a humanize_size() function to switch to the appropriate measure
(KB, MB, or GB)?

[1] http://bugs.archlinux.org/task/6667?pagenum=2

Signed-off-by: Nathan Jones <nathanj at insightbb.com>

diff -uprN pacman-lib-old/src/pacman/conf.h pacman-lib-new/src/pacman/conf.h
--- pacman-lib-old/src/pacman/conf.h	2007-03-05 20:21:42.000000000 -0500
+++ pacman-lib-new/src/pacman/conf.h	2007-05-05 21:39:33.000000000 -0400
@@ -54,6 +54,7 @@ typedef struct __config_t {
 	pmtransflag_t flags;
 	unsigned short noask;
 	unsigned int ask;
+	unsigned short showsize;
 } config_t;
 
 #define FREECONF(p) do { if(p) { config_free(p); p = NULL; } } while(0)
diff -uprN pacman-lib-old/src/pacman/pacman.c pacman-lib-new/src/pacman/pacman.c
--- pacman-lib-old/src/pacman/pacman.c	2007-03-22 14:19:49.000000000 -0400
+++ pacman-lib-new/src/pacman/pacman.c	2007-05-06 09:35:55.000000000 -0400
@@ -133,6 +133,7 @@ static void usage(int op, char *myname)
 			printf(_("  -p, --file <package> query a package file instead of the database\n"));
 			printf(_("  -s, --search <regex> search locally-installed packages for matching strings\n"));
 			printf(_("  -u, --upgrades       list all packages that can be upgraded\n"));
+			printf(_("  -z, --showsize       display the size of each package\n"));
 		} else if(op == PM_OP_SYNC) {
 			printf(_("usage:  %s {-S --sync} [options] [package]\n"), myname);
 			printf(_("options:\n"));
@@ -148,6 +149,7 @@ static void usage(int op, char *myname)
 			printf(_("  -u, --sysupgrade     upgrade all packages that are out of date\n"));
 			printf(_("  -w, --downloadonly   download packages but do not install/upgrade anything\n"));
 			printf(_("  -y, --refresh        download fresh package databases from the server\n"));
+			printf(_("  -z, --showsize       display the size of each package\n"));
 			printf(_("      --ignore <pkg>   ignore a package upgrade (can be used more than once)\n"));
 		}
 		printf(_("      --config <path>  set an alternate configuration file\n"));
@@ -253,6 +255,7 @@ static int parseargs(int argc, char *arg
 		{"verbose",    no_argument,       0, 'v'},
 		{"downloadonly", no_argument,     0, 'w'},
 		{"refresh",    no_argument,       0, 'y'},
+		{"showsize",   no_argument,       0, 'z'},
 		{"noconfirm",  no_argument,       0, 1000},
 		{"config",     required_argument, 0, 1001},
 		{"ignore",     required_argument, 0, 1002},
@@ -266,7 +269,7 @@ static int parseargs(int argc, char *arg
 	struct stat st;
 	unsigned short logmask;
 
-	while((opt = getopt_long(argc, argv, "ARUFQSTr:b:vkhscVfmnoldepiuwyg", opts, &option_index))) {
+	while((opt = getopt_long(argc, argv, "ARUFQSTr:b:vkhscVfmnoldepiuwygz", opts, &option_index))) {
 		if(opt < 0) {
 			break;
 		}
@@ -381,6 +384,7 @@ static int parseargs(int argc, char *arg
 				config->flags |= PM_TRANS_FLAG_NOCONFLICTS;
 				break;
 			case 'y': (config->op_s_sync)++; break;
+			case 'z': config->showsize = 1; break;
 			case '?': return(1);
 			default: return(1);
 		}
diff -uprN pacman-lib-old/src/pacman/query.c pacman-lib-new/src/pacman/query.c
--- pacman-lib-old/src/pacman/query.c	2007-03-22 03:32:54.000000000 -0400
+++ pacman-lib-new/src/pacman/query.c	2007-05-05 22:03:44.000000000 -0400
@@ -136,6 +136,7 @@ int pacman_query(alpm_list_t *targets)
 	pmpkg_t *info = NULL;
 	char *package = NULL;
 	int done = 0;
+	double mbsize = 0.0;
 
 	if(config->op_q_search) {
 		alpm_list_t *ret = alpm_db_search(db_local, targets);
@@ -147,7 +148,16 @@ int pacman_query(alpm_list_t *targets)
 			alpm_list_t *grp;
 			pmpkg_t *pkg = alpm_list_getdata(i);
 
-			printf("local/%s %s", alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
+			if(config->showsize) {
+				/* Convert byte size to MB */
+				mbsize = (double)(alpm_pkg_get_size(pkg)) / (1024.0 * 1024.0);
+
+				printf("local/%s %s %.2f MB", alpm_pkg_get_name(pkg),
+						alpm_pkg_get_version(pkg), mbsize);
+			} else {
+				printf("local/%s %s", alpm_pkg_get_name(pkg),
+						alpm_pkg_get_version(pkg));
+			}
 
 			if((grp = alpm_pkg_get_groups(pkg)) != NULL) {
 				group = alpm_list_getdata(grp);
diff -uprN pacman-lib-old/src/pacman/sync.c pacman-lib-new/src/pacman/sync.c
--- pacman-lib-old/src/pacman/sync.c	2007-03-26 18:47:56.000000000 -0400
+++ pacman-lib-new/src/pacman/sync.c	2007-05-05 22:06:01.000000000 -0400
@@ -237,6 +237,7 @@ static int sync_synctree(int level, alpm
 static int sync_search(alpm_list_t *syncs, alpm_list_t *targets)
 {
 	alpm_list_t *i, *j, *ret;
+	double mbsize = 0.0;
 
 	for(i = syncs; i; i = alpm_list_next(i)) {
 		pmdb_t *db = (pmdb_t *)alpm_list_getdata(i);
@@ -250,8 +251,17 @@ static int sync_search(alpm_list_t *sync
 				alpm_list_t *grp;
 				pmpkg_t *pkg = alpm_list_getdata(j);
 
-				printf("%s/%s %s", alpm_db_get_name(db), alpm_pkg_get_name(pkg),
-						   alpm_pkg_get_version(pkg));
+				if(config->showsize) {
+					/* Convert byte size to MB */
+					mbsize = (double)(alpm_pkg_get_size(pkg)) / (1024.0 * 1024.0);
+
+					printf("%s/%s %s %.2f MB", alpm_db_get_name(db),
+							alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg),
+							mbsize);
+				} else {
+					printf("%s/%s %s", alpm_db_get_name(db), alpm_pkg_get_name(pkg),
+							alpm_pkg_get_version(pkg));
+				}
 
 				if((grp = alpm_pkg_get_groups(pkg)) != NULL) {
 						group = alpm_list_getdata(grp);
diff -uprN pacman-lib-old/src/pacman/util.c pacman-lib-new/src/pacman/util.c
--- pacman-lib-old/src/pacman/util.c	2007-03-13 12:15:38.000000000 -0400
+++ pacman-lib-new/src/pacman/util.c	2007-05-05 22:07:31.000000000 -0400
@@ -270,8 +270,8 @@ void display_targets(alpm_list_t *syncpk
 	alpm_list_t *i, *j;
 	alpm_list_t *targets = NULL, *to_remove = NULL;
 	/* TODO these are some messy variable names */
-	unsigned long size = 0, isize = 0, rsize = 0;
-	double mbsize = 0.0, mbisize = 0.0, mbrsize = 0.0;
+	unsigned long size = 0, isize = 0, rsize = 0, dispsize = 0;
+	double mbsize = 0.0, mbisize = 0.0, mbrsize = 0.0, mbdispsize = 0.0;
 
 	for(i = syncpkgs; i; i = alpm_list_next(i)) {
 		pmsyncpkg_t *sync = alpm_list_getdata(i);
@@ -294,10 +294,20 @@ void display_targets(alpm_list_t *syncpk
 			}
 		}
 
-		size += alpm_pkg_get_size(pkg);
+		dispsize = alpm_pkg_get_size(pkg);
+		size += dispsize;
 		isize += alpm_pkg_get_isize(pkg);
 
-		asprintf(&str, "%s-%s", alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
+		if(config->showsize) {
+			/* Convert byte size to MB */
+			mbdispsize = (double)(dispsize) / (1024.0 * 1024.0);
+
+			asprintf(&str, "%s-%s [%.1f MB]", alpm_pkg_get_name(pkg),
+					alpm_pkg_get_version(pkg), (mbdispsize < 0.1 ? 0.1 : mbdispsize));
+		} else {
+			asprintf(&str, "%s-%s", alpm_pkg_get_name(pkg),
+					alpm_pkg_get_version(pkg));
+		}
 		targets = alpm_list_add(targets, str);
 	}
 




More information about the pacman-dev mailing list