This is a hack.
---
 src/pacman/callback.c |   39 +++++++++++++++++++++++++++------------
 1 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/src/pacman/callback.c b/src/pacman/callback.c
index 59b4064..8a17111 100644
--- a/src/pacman/callback.c
+++ b/src/pacman/callback.c
@@ -86,8 +86,8 @@ static float get_update_timediff(int first_call)
 }
 
 /* refactored from cb_trans_progress */
-static void fill_progress(const int bar_percent, const int disp_percent,
-               const int proglen)
+static void fill_progress(const int bar_percent,
+               const int proglen, const char *endline)
 {
        const unsigned int hashlen = proglen - 8;
        const unsigned int hash = bar_percent * hashlen / 100;
@@ -139,16 +139,10 @@ static void fill_progress(const int bar_percent, const 
int disp_percent,
        }
        /* print percent after progress bar */
        if(proglen > 5) {
-               /* show total download percent if option is enabled */
-               int p = config->totaldownload ? disp_percent : bar_percent;
-               printf(" %3d%%", p);
+               printf(" %3d%%", bar_percent);
        }
 
-       if(bar_percent == 100) {
-               printf("\n");
-       } else {
-               printf("\r");
-       }
+       printf(endline);
        fflush(stdout);
 }
 
@@ -399,7 +393,7 @@ void cb_trans_progress(pmtransprog_t event, const char 
*pkgname, int percent,
        free(wcstr);
 
        /* call refactored fill progress function */
-       fill_progress(percent, percent, getcols() - infolen);
+       fill_progress(percent, getcols() - infolen, percent == 100 ? "\n" : 
"\r");
 
        if(percent == 100) {
                alpm_list_t *i = NULL;
@@ -441,6 +435,8 @@ void cb_dl_progress(const char *filename, off_t 
file_xfered, off_t file_total)
        int file_percent = 0, total_percent = 0;
        char rate_size = 'K', xfered_size = 'K';
 
+       static int beenheredonethat = 0;
+
        if(config->noprogressbar || file_total == -1) {
                if(file_xfered == 0) {
                        printf(_("downloading %s...\n"), filename);
@@ -574,6 +570,18 @@ void cb_dl_progress(const char *filename, off_t 
file_xfered, off_t file_total)
                }
        }
 
+       /* move up if not the first time download progress is being displayed */
+       if (beenheredonethat == 1)
+       {
+               printf("\033[A"   /* move up */
+                      "\033[K\n" /* kill line */
+                      "\033[K\r" /* kill line */
+                      "\033[A"   /* move up */
+                               );
+       }
+       beenheredonethat = 1;
+
+
        printf(" %ls%-*s %6.1f%c %#6.1f%c/s %02u:%02u:%02u", wcfname,
                        padwid, "", f_xfered, xfered_size,
                        rate, rate_size, eta_h, eta_m, eta_s);
@@ -581,7 +589,14 @@ void cb_dl_progress(const char *filename, off_t 
file_xfered, off_t file_total)
        free(fname);
        free(wcfname);
 
-       fill_progress(file_percent, total_percent, getcols() - infolen);
+       fill_progress(file_percent, getcols() - infolen, "\n");
+
+       printf(" %-23s %6.1f%c %#6.1f%c/s %02u:%02u:%02u", "total",
+                       f_xfered, xfered_size,
+                       rate, rate_size, eta_h, eta_m, eta_s);
+       fill_progress(total_percent, getcols() - infolen, "\r");
+       if (file_percent == 100)
+               printf("\n");
        return;
 }
 
-- 
1.6.0

_______________________________________________
pacman-dev mailing list
pacman-dev@archlinux.org
http://archlinux.org/mailman/listinfo/pacman-dev

Reply via email to