From b179c16fc096a8c549c860d34aa838fcc3cfb5b4 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Thu, 30 Oct 2014 11:23:10 +0100 Subject: [PATCH 3/4] xbps-{install,remove}: implemented column/wide output mode. See https://github.com/voidlinux/xbps/issues/63 for info. Close #63 --- NEWS | 5 ++ bin/xbps-install/defs.h | 12 +++++ bin/xbps-install/transaction.c | 99 +++++++++++++++++-------------------- bin/xbps-install/util.c | 109 ++++++++++++++++++++++++++++++++++++++++- 4 files changed, 170 insertions(+), 55 deletions(-) diff --git a/bin/xbps-install/defs.h b/bin/xbps-install/defs.h index 3a9b718..a8d0c7e 100644 --- bin/xbps-install/defs.h +++ bin/xbps-install/defs.h @@ -34,6 +34,17 @@ struct xferstat { struct timeval last; }; +struct transaction { + struct xbps_handle *xhp; + xbps_dictionary_t d; + xbps_object_iterator_t iter; + uint32_t inst_pkgcnt; + uint32_t up_pkgcnt; + uint32_t cf_pkgcnt; + uint32_t rm_pkgcnt; + uint32_t dl_pkgcnt; +}; + /* from transaction.c */ int install_new_pkg(struct xbps_handle *, const char *, bool); int update_pkg(struct xbps_handle *, const char *); @@ -52,6 +63,7 @@ int state_cb(const struct xbps_state_cb_data *, void *); /* From util.c */ void print_package_line(const char *, int, bool); +bool print_trans_colmode(struct transaction *, int); int get_maxcols(void); #endif /* !_XBPS_INSTALL_DEFS_H_ */ diff --git a/bin/xbps-install/transaction.c b/bin/xbps-install/transaction.c index efd964a..7280ee4 100644 --- bin/xbps-install/transaction.c +++ bin/xbps-install/transaction.c @@ -36,17 +36,6 @@ #include #include "defs.h" -struct transaction { - struct xbps_handle *xhp; - xbps_dictionary_t d; - xbps_object_iterator_t iter; - uint32_t inst_pkgcnt; - uint32_t up_pkgcnt; - uint32_t cf_pkgcnt; - uint32_t rm_pkgcnt; - uint32_t dl_pkgcnt; -}; - static void print_array(xbps_array_t a) { @@ -128,49 +117,51 @@ show_transaction_sizes(struct transaction *trans, int cols) uint64_t dlsize = 0, instsize = 0, rmsize = 0, disk_free_size = 0; char size[8]; - /* - * Show the list of packages that will be downloaded, installed, updated, - * removed or configured. - */ - xbps_dictionary_get_uint32(trans->d, "total-download-pkgs", - &trans->dl_pkgcnt); - if (trans->dl_pkgcnt) { - printf("%u package%s will be downloaded:\n", - trans->dl_pkgcnt, trans->dl_pkgcnt == 1 ? "" : "s"); - show_package_list(trans, NULL, cols); - printf("\n"); - } - xbps_dictionary_get_uint32(trans->d, "total-install-pkgs", - &trans->inst_pkgcnt); - if (trans->inst_pkgcnt) { - printf("%u package%s will be installed:\n", - trans->inst_pkgcnt, trans->inst_pkgcnt == 1 ? "" : "s"); - show_package_list(trans, "install", cols); - printf("\n"); - } - xbps_dictionary_get_uint32(trans->d, "total-update-pkgs", - &trans->up_pkgcnt); - if (trans->up_pkgcnt) { - printf("%u package%s will be updated:\n", - trans->up_pkgcnt, trans->up_pkgcnt == 1 ? "" : "s"); - show_package_list(trans, "update", cols); - printf("\n"); - } - xbps_dictionary_get_uint32(trans->d, "total-configure-pkgs", - &trans->cf_pkgcnt); - if (trans->cf_pkgcnt) { - printf("%u package%s will be configured:\n", - trans->cf_pkgcnt, trans->cf_pkgcnt == 1 ? "" : "s"); - show_package_list(trans, "configure", cols); - printf("\n"); - } - xbps_dictionary_get_uint32(trans->d, "total-remove-pkgs", - &trans->rm_pkgcnt); - if (trans->rm_pkgcnt) { - printf("%u package%s will be removed:\n", - trans->rm_pkgcnt, trans->rm_pkgcnt == 1 ? "" : "s"); - show_package_list(trans, "remove", cols); - printf("\n"); + if (!print_trans_colmode(trans, cols)) { + /* + * Show the list of packages that will be downloaded, installed, updated, + * removed or configured. + */ + xbps_dictionary_get_uint32(trans->d, "total-download-pkgs", + &trans->dl_pkgcnt); + if (trans->dl_pkgcnt) { + printf("%u package%s will be downloaded:\n", + trans->dl_pkgcnt, trans->dl_pkgcnt == 1 ? "" : "s"); + show_package_list(trans, NULL, cols); + printf("\n"); + } + xbps_dictionary_get_uint32(trans->d, "total-install-pkgs", + &trans->inst_pkgcnt); + if (trans->inst_pkgcnt) { + printf("%u package%s will be installed:\n", + trans->inst_pkgcnt, trans->inst_pkgcnt == 1 ? "" : "s"); + show_package_list(trans, "install", cols); + printf("\n"); + } + xbps_dictionary_get_uint32(trans->d, "total-update-pkgs", + &trans->up_pkgcnt); + if (trans->up_pkgcnt) { + printf("%u package%s will be updated:\n", + trans->up_pkgcnt, trans->up_pkgcnt == 1 ? "" : "s"); + show_package_list(trans, "update", cols); + printf("\n"); + } + xbps_dictionary_get_uint32(trans->d, "total-configure-pkgs", + &trans->cf_pkgcnt); + if (trans->cf_pkgcnt) { + printf("%u package%s will be configured:\n", + trans->cf_pkgcnt, trans->cf_pkgcnt == 1 ? "" : "s"); + show_package_list(trans, "configure", cols); + printf("\n"); + } + xbps_dictionary_get_uint32(trans->d, "total-remove-pkgs", + &trans->rm_pkgcnt); + if (trans->rm_pkgcnt) { + printf("%u package%s will be removed:\n", + trans->rm_pkgcnt, trans->rm_pkgcnt == 1 ? "" : "s"); + show_package_list(trans, "remove", cols); + printf("\n"); + } } /* * Show total download/installed/removed size for all required packages. diff --git a/bin/xbps-install/util.c b/bin/xbps-install/util.c index 9594877..3fb68a7 100644 --- bin/xbps-install/util.c +++ bin/xbps-install/util.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2008-2013 Juan Romero Pardines. + * Copyright (c) 2008-2014 Juan Romero Pardines. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,6 +31,7 @@ #include #include #include +#include #include #include "defs.h" @@ -69,3 +70,109 @@ print_package_line(const char *str, int maxcols, bool reset) } printf("%s ", str); } + +static unsigned int +find_longest_pkgname(struct transaction *trans) +{ + xbps_object_t obj; + const char *pkgver; + char *pkgname; + unsigned int len = 0, max = 0; + + while ((obj = xbps_object_iterator_next(trans->iter)) != NULL) { + xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver); + pkgname = xbps_pkg_name(pkgver); + assert(pkgname); + len = strlen(pkgname); + free(pkgname); + if (max == 0 || len > max) + max = len; + } + xbps_object_iterator_reset(trans->iter); + return max+1; +} + +bool +print_trans_colmode(struct transaction *trans, int cols) +{ + xbps_object_t obj; + uint64_t dlsize = 0; + char size[8]; + unsigned int x, blen, pnamelen; + int hdrlen; + + pnamelen = find_longest_pkgname(trans); + /* header length */ + hdrlen = 4 + pnamelen + 48; + if (cols <= hdrlen) + return false; + + printf("Name"); + for (x = 4; x < pnamelen; x++) + printf(" "); + printf("Action Version New version Download size\n"); + + while ((obj = xbps_object_iterator_next(trans->iter)) != NULL) { + xbps_dictionary_t ipkgd; + const char *pkgver, *ipkgver, *ver, *iver, *tract; + char *pkgname; + bool dload = false; + + ver = iver = NULL; + + xbps_dictionary_get_cstring_nocopy(obj, "pkgver", &pkgver); + xbps_dictionary_get_cstring_nocopy(obj, "transaction", &tract); + xbps_dictionary_get_uint64(obj, "filename-size", &dlsize); + xbps_dictionary_get_bool(obj, "download", &dload); + + pkgname = xbps_pkg_name(pkgver); + assert(pkgname); + + if ((strcmp(tract, "update") == 0) || strcmp(tract, "remove") == 0) { + ipkgd = xbps_pkgdb_get_pkg(trans->xhp, pkgname); + assert(ipkgd); + xbps_dictionary_get_cstring_nocopy(ipkgd, "pkgver", &ipkgver); + iver = xbps_pkg_version(ipkgver); + } + ver = xbps_pkg_version(pkgver); + + /* print pkgname and some blanks */ + blen = pnamelen - strlen(pkgname); + printf("%s", pkgname); + for (x = 0; x < blen; x++) + printf(" "); + + /* print action */ + printf("%s ", tract); + for (x = strlen(tract); x < 7; x++) + printf(" "); + + /* print installed version */ + if (iver == NULL) + iver = "-"; + + /* print new version */ + printf("%s ", iver); + for (x = strlen(iver); x < 14; x++) + printf(" "); + + if (strcmp(tract, "remove") == 0) { + ver = "-"; + } + if (dload) + (void)xbps_humanize_number(size, (int64_t)dlsize); + else { + size[0] = '-'; + size[1] = '\0'; + } + printf("%s ", ver); + for (x = strlen(ver); x < 18; x++) + printf(" "); + /* print download size */ + printf("%s ", size); + printf("\n"); + free(pkgname); + } + xbps_object_iterator_reset(trans->iter); + return true; +} -- 2.1.3