This patch splits the monolithic 'Packages (count):' output on transactions into
multiple package outputs per category of action: 'Installing (count):', 
'Upgrading
(count):', and 'Removing (count):'.

Signed-off-by: Carson Black <uhh...@gmail.com>
---
 src/pacman/util.c | 61 +++++++++++++++++++++++++++++++++++------------
 1 file changed, 46 insertions(+), 15 deletions(-)

diff --git a/src/pacman/util.c b/src/pacman/util.c
index 6693ec75..9b192317 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -898,7 +898,8 @@ 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;
+       char *install_header = NULL, *upgrade_header = NULL, *remove_header = 
NULL;
+       alpm_list_t *i, *install = NULL, *upgrade = NULL, *remove = NULL, 
*header = NULL, *rows = NULL;
 
        if(!targets) {
                return;
@@ -926,38 +927,68 @@ static void _display_targets(alpm_list_t *targets, int 
verbose)
                        rows = alpm_list_add(rows, create_verbose_row(target));
                }
 
-               if(target->install) {
+               if(target->install && target->remove) {
+                       pm_asprintf(&str, "%s%s-%s%s", 
alpm_pkg_get_name(target->install), config->colstr.faint,
+                                       alpm_pkg_get_version(target->install), 
config->colstr.nocolor);
+                       upgrade = alpm_list_add(upgrade, str);
+               } else if(target->install) {
                        pm_asprintf(&str, "%s%s-%s%s", 
alpm_pkg_get_name(target->install), config->colstr.faint,
                                        alpm_pkg_get_version(target->install), 
config->colstr.nocolor);
-               } else if(isize == 0) {
+                       install = alpm_list_add(install, str);
+               } else {
                        pm_asprintf(&str, "%s%s-%s%s", 
alpm_pkg_get_name(target->remove), config->colstr.faint,
                                        alpm_pkg_get_version(target->remove), 
config->colstr.nocolor);
-               } else {
-                       pm_asprintf(&str, "%s%s-%s %s[%s]%s", 
alpm_pkg_get_name(target->remove), config->colstr.faint,
-                                       alpm_pkg_get_version(target->remove), 
config->colstr.nocolor, _("removal"), config->colstr.nocolor);
+                       remove = alpm_list_add(remove, str);
                }
-               names = alpm_list_add(names, str);
        }
 
-       /* print to screen */
-       pm_asprintf(&str, "%s (%zu)", _("Packages"), alpm_list_count(targets));
-       printf("\n");
-
        cols = getcols();
        if(verbose) {
                header = create_verbose_header(alpm_list_count(targets));
                if(table_display(header, rows, cols) != 0) {
                        /* fallback to list display if table wouldn't fit */
-                       list_display(str, names, cols);
+                       if (alpm_list_count(install)) {
+                               pm_asprintf(&install_header, _("Installing 
(%lu):"), alpm_list_count(install));
+                               list_display(install_header, install, cols);
+                       }
+                       if (alpm_list_count(upgrade)) {
+                               pm_asprintf(&upgrade_header, _("Upgrading 
(%lu):"), alpm_list_count(upgrade));
+                               list_display(upgrade_header, upgrade, cols);
+                       }
+                       if (alpm_list_count(remove)) {
+                               pm_asprintf(&remove_header, _("Removing 
(%lu):"), alpm_list_count(remove));
+                               list_display(remove_header, remove, cols);
+                       }
                }
        } else {
-               list_display(str, names, cols);
+               if (alpm_list_count(install)) {
+                       pm_asprintf(&install_header, _("Installing (%lu):"), 
alpm_list_count(install));
+                       list_display(install_header, install, cols);
+                       if (alpm_list_count(upgrade) || 
alpm_list_count(remove)) {
+                               printf("\n");
+                       }
+               }
+               if (alpm_list_count(upgrade)) {
+                       pm_asprintf(&upgrade_header, _("Upgrading (%lu):"), 
alpm_list_count(upgrade));
+                       list_display(upgrade_header, upgrade, cols);
+                       if (alpm_list_count(remove)) {
+                               printf("\n");
+                       }
+               }
+               if (alpm_list_count(remove)) {
+                       pm_asprintf(&remove_header, _("Removing (%lu):"), 
alpm_list_count(remove));
+                       list_display(remove_header, remove, cols);
+               }
        }
        printf("\n");
 
        table_free(header, rows);
-       FREELIST(names);
-       free(str);
+       FREELIST(install);
+       FREELIST(upgrade);
+       FREELIST(remove);
+       free(install_header);
+       free(upgrade_header);
+       free(remove_header);
        rows = NULL;
 
        if(dlsize > 0 || config->op_s_downloadonly) {
-- 

Ok, this should fix memory management issues.

2.26.0

Reply via email to