When verbose package is activated, the table is displayed two times,
once for explicit packages and a second time for dependencies.

This helps understanding the upgrade process. You can focus on on
explicit package and gives less attention to dependencies.

Design choices:

-- If a table does not fit in terminal width, it fallbacks to traditional
compact display, but this fallback can happen on none, one or both
tables

-- The header name stay short, "Package" and "Dependancies". This is to
avoid too long column name, but i think it is enough explicit as is.
---
 src/pacman/util.c | 59 +++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 46 insertions(+), 13 deletions(-)

diff --git a/src/pacman/util.c b/src/pacman/util.c
index d42e27b..864b7a3 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -774,12 +774,12 @@ void signature_display(const char *title, alpm_siglist_t 
*siglist,
 }
 
 /* creates a header row for use with table_display */
-static alpm_list_t *create_verbose_header(size_t count)
+static alpm_list_t *create_verbose_header(size_t count, int is_explicit)
 {
        alpm_list_t *ret = NULL;
 
        char *header;
-       pm_asprintf(&header, "%s (%zd)", _("Package"), count);
+       pm_asprintf(&header, "%s (%zd)", (is_explicit ? _("Package") : 
_("Dependency")), count);
 
        add_table_cell(&ret, header, CELL_TITLE | CELL_FREE);
        add_table_cell(&ret, _("Old Version"), CELL_TITLE);
@@ -846,7 +846,11 @@ static void _display_targets(alpm_list_t *targets, int 
verbose)
        char *str;
        off_t isize = 0, rsize = 0, dlsize = 0;
        unsigned short cols;
-       alpm_list_t *i, *names = NULL, *header = NULL, *rows = NULL;
+       alpm_list_t *i,
+                               *names = NULL, *names_explicit = NULL, 
*names_deps = NULL,
+                               *header_explicit = NULL, *header_deps = NULL,
+                               *rows = NULL, *explicit = NULL, *deps = NULL;
+       size_t count_explicit = 0, count_deps = 0;
 
        if(!targets) {
                return;
@@ -870,10 +874,6 @@ static void _display_targets(alpm_list_t *targets, int 
verbose)
        for(i = targets; i; i = alpm_list_next(i)) {
                pm_target_t *target = i->data;
 
-               if(verbose) {
-                       rows = alpm_list_add(rows, create_verbose_row(target));
-               }
-
                if(target->install) {
                        pm_asprintf(&str, "%s-%s", 
alpm_pkg_get_name(target->install),
                                        alpm_pkg_get_version(target->install));
@@ -885,27 +885,60 @@ static void _display_targets(alpm_list_t *targets, int 
verbose)
                                        alpm_pkg_get_version(target->remove), 
_("removal"));
                }
                names = alpm_list_add(names, str);
+
+               if(verbose) {
+                       // Check if package is installed as a explicit or as a 
dependency
+                       // and store it in associated lists
+                       if(alpm_pkg_get_reason(target->remove ? target->remove 
: target->install) == ALPM_PKG_REASON_DEPEND) {
+                                       deps = alpm_list_add(deps, 
create_verbose_row(target));
+                                       names_explicit = 
alpm_list_add(names_explicit, str);
+                                       count_deps += 1;
+                       } else {
+                                       explicit = alpm_list_add(explicit, 
create_verbose_row(target));
+                                       names_deps = alpm_list_add(names_deps, 
str);
+                                       count_explicit += 1;
+                       }
+               }
+
        }
 
        /* print to screen */
-       pm_asprintf(&str, "%s (%zd)", _("Packages"), alpm_list_count(targets));
        printf("\n");
 
        cols = getcols(fileno(stdout));
        if(verbose) {
-               header = create_verbose_header(alpm_list_count(targets));
-               if(table_display(header, rows, cols) != 0) {
+               header_explicit = create_verbose_header(count_explicit, 1);
+               if(table_display(header_explicit, explicit, cols) != 0) {
+                       /* fallback to list display if table wouldn't fit */
+                       pm_asprintf(&str, "%s (%zd)", _("Packages"), 
count_explicit);
+                       list_display(str, names_explicit, cols);
+                       free(str);
+               }
+               printf("\n");
+               header_deps = create_verbose_header(count_deps, 0);
+               if(table_display(header_deps, deps, cols) != 0) {
                        /* fallback to list display if table wouldn't fit */
-                       list_display(str, names, cols);
+                       pm_asprintf(&str, "%s (%zd)", _("Dependencies"), 
count_deps);
+                       list_display(str, names_deps, cols);
+                       free(str);
                }
+
        } else {
+               pm_asprintf(&str, "%s (%zd)", _("Packages"), 
alpm_list_count(targets));
                list_display(str, names, cols);
+               free(str);
        }
        printf("\n");
 
-       table_free(header, rows);
+       table_free(header_explicit, explicit);
+       table_free(header_deps, deps);
+
        FREELIST(names);
-       free(str);
+       /* The content of names_explicit and names_deps has allready been 
free'ed
+        * FREELIST(names), so we only free the containers */
+       free(names_explicit);
+       free(names_deps);
+
        rows = NULL;
 
        if(dlsize > 0 || config->op_s_downloadonly) {
-- 
1.9.2


Reply via email to