From e3c7e92f1090204ba945c063b7aba3b3b1d8095b Mon Sep 17 00:00:00 2001 From: Aaron Griffin Date: Sun, 4 Feb 2007 01:36:45 +0000 Subject: * unified the progress bars (fill_progress function) * fixed progress output (needs an fflush to move cursor properly) * broke display_targets function out, to display a list of syncpkgs in preparation for a -Qu option * added get_update_time function to deal with progress functions that shouldn't update too fast due to output redraw speeds --- src/pacman/downloadprog.c | 89 ++++++++++++----------------------------------- 1 file changed, 22 insertions(+), 67 deletions(-) (limited to 'src/pacman/downloadprog.c') diff --git a/src/pacman/downloadprog.c b/src/pacman/downloadprog.c index 4ea40535..35bbab72 100644 --- a/src/pacman/downloadprog.c +++ b/src/pacman/downloadprog.c @@ -40,58 +40,57 @@ /* progress bar */ static float rate_last; static int xfered_last; -static struct timeval last_time; static struct timeval initial_time; /* pacman options */ extern config_t *config; -#define FILENAME_TRIM_LEN 21 -#define UPDATE_SPEED_SEC 0.1 +#define FILENAME_TRIM_LEN 23 void log_progress(const char *filename, int xfered, int total) { - static unsigned int lasthash = 0, mouth = 0; - unsigned int i, hash; - /* a little hard to conceal easter eggs in open-source software, - * but they're still fun. ;) */ - const unsigned short chomp = alpm_option_get_chomp(); + const int infolen = 50; char *fname, *p; - unsigned int maxcols = getcols(); - unsigned int progresslen = maxcols - 57; - int percent = (int)((float)xfered) / ((float)total) * 100; + struct timeval current_time; float rate = 0.0; unsigned int eta_h = 0, eta_m = 0, eta_s = 0; float total_timediff, timediff; + if(config->noprogressbar) { + return; + } + + int percent = (int)((float)xfered) / ((float)total) * 100; + if(xfered == 0) { set_output_padding(1); /* we need padding from pm_fprintf output */ gettimeofday(&initial_time, NULL); - gettimeofday(&last_time, NULL); xfered_last = 0; rate_last = 0.0; + timediff = get_update_timediff(1); + } else { + timediff = get_update_timediff(0); } - if(config->noprogressbar) { + if(percent > 0 && percent < 100 && !timediff) { + /* only update the progress bar when + * a) we first start + * b) we end the progress + * c) it has been long enough since the last call + */ return; } gettimeofday(¤t_time, NULL); total_timediff = current_time.tv_sec-initial_time.tv_sec + (float)(current_time.tv_usec-initial_time.tv_usec) / 1000000; - timediff = current_time.tv_sec-last_time.tv_sec - + (float)(current_time.tv_usec-last_time.tv_usec) / 1000000; if(xfered == total) { /* compute final values */ rate = (float)total / (total_timediff * 1024); eta_s = (unsigned int)total_timediff; set_output_padding(0); /* shut off padding */ - } else if(timediff < UPDATE_SPEED_SEC) { - /* we avoid computing the ETA on too small periods of time, so that - results are more significant */ - return; } else { rate = (float)(xfered - xfered_last) / (timediff * 1024); rate = (float)(rate + 2*rate_last) / 3; @@ -99,7 +98,6 @@ void log_progress(const char *filename, int xfered, int total) } rate_last = rate; - last_time = current_time; xfered_last = xfered; /* fix up time for display */ @@ -116,61 +114,18 @@ void log_progress(const char *filename, int xfered, int total) fname[FILENAME_TRIM_LEN] = '\0'; } - /* hide the cursor i - prevent flicker - printf("\033[?25l\033[?1c"); - */ - - /* - * DL rate cap, for printf formatting - this should be sane for a while - * if anything we can change to MB/s if we need a higher rate - */ + /* DL rate cap, for printf formatting - this should be sane for a while + * if anything we can change to MB/s if we need a higher rate */ if(rate > 9999.9) { rate = 9999.9; } - printf(" %-*s %6dK %#6.1fK/s %02u:%02u:%02u [", FILENAME_TRIM_LEN, fname, + printf(" %-*s %6dK %#6.1fK/s %02u:%02u:%02u", FILENAME_TRIM_LEN, fname, xfered/1024, rate, eta_h, eta_m, eta_s); free(fname); - hash = (unsigned int)percent*progresslen/100; - for(i = progresslen; i > 0; --i) { - if(chomp) { - if(i > progresslen - hash) { - printf("-"); - } else if(i == progresslen - hash) { - if(lasthash == hash) { - if(mouth) { - printf("\033[1;33mC\033[m"); - } else { - printf("\033[1;33mc\033[m"); - } - } else { - lasthash = hash; - mouth = mouth == 1 ? 0 : 1; - if(mouth) { - printf("\033[1;33mC\033[m"); - } else { - printf("\033[1;33mc\033[m"); - } - } - } else if(i%3 == 0) { - printf("\033[0;37mo\033[m"); - } else { - printf("\033[0;37m \033[m"); - } - } else if(i > progresslen - hash) { - printf("#"); - } else { - printf("-"); - } - } - printf("] %3d%%\r", percent); - - if(percent == 100) { - printf("\n"); - } - fflush(stdout); + fill_progress(percent, getcols() - infolen); return; } -- cgit v1.2.3-70-g09d2