Date: Tuesday, February 6, 2007 @ 16:54:39 Author: aaron Path: /home/cvs-pacman/pacman-lib/src/pacman Modified: downloadprog.c (1.9 -> 1.10) Minor experimental changes to the download progress bar: * change to Mb and Gb for both total size and transfer rate if needed * round up to 1 second for downloads that were between 1s and 0.5s This function needs some serious looking at, as it's probably not 64bit safe (thus the "wrong calculation" problem on the list). ----------------+ downloadprog.c | 50 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-) Index: pacman-lib/src/pacman/downloadprog.c diff -u pacman-lib/src/pacman/downloadprog.c:1.9 pacman-lib/src/pacman/downloadprog.c:1.10 --- pacman-lib/src/pacman/downloadprog.c:1.9 Sat Feb 3 20:36:45 2007 +++ pacman-lib/src/pacman/downloadprog.c Tue Feb 6 16:54:39 2007 @@ -73,7 +73,7 @@ timediff = get_update_timediff(0); } - if(percent > 0 && percent < 100 && !timediff) { + if(percent > 0 && percent <= 100 && !timediff) { /* only update the progress bar when * a) we first start * b) we end the progress @@ -84,17 +84,22 @@ gettimeofday(¤t_time, NULL); total_timediff = current_time.tv_sec-initial_time.tv_sec - + (float)(current_time.tv_usec-initial_time.tv_usec) / 1000000; + + (float)(current_time.tv_usec-initial_time.tv_usec) / 1000000.0; if(xfered == total) { /* compute final values */ - rate = (float)total / (total_timediff * 1024); - eta_s = (unsigned int)total_timediff; + rate = (float)total / (total_timediff * 1024.0); + if(total_timediff < 1.0 && total_timediff > 0.5) { + /* round up so we don't display 00:00:00 for quick downloads all the time*/ + eta_s = 1; + } else { + eta_s = (unsigned int)total_timediff; + } set_output_padding(0); /* shut off padding */ } else { - rate = (float)(xfered - xfered_last) / (timediff * 1024); + rate = (float)(xfered - xfered_last) / (timediff * 1024.0); rate = (float)(rate + 2*rate_last) / 3; - eta_s = (unsigned int)(total - xfered) / (rate * 1024); + eta_s = (unsigned int)(total - xfered) / (rate * 1024.0); } rate_last = rate; @@ -114,14 +119,35 @@ fname[FILENAME_TRIM_LEN] = '\0'; } - /* 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; + /* Awesome formatting for progress bar. We need a mess of Kb->Mb->Gb stuff + * here. We'll use limit of 2048 for each until we get some empirical */ + char rate_size = 'K'; + char xfered_size = 'K'; + if(rate > 2048.0) { + rate /= 1024.0; + rate_size = 'M'; + if(rate > 2048.0) { + rate /= 1024.0; + rate_size = 'G'; + /* we should not go higher than this for a few years (9999.9 Gb/s?)*/ + } } - printf(" %-*s %6dK %#6.1fK/s %02u:%02u:%02u", FILENAME_TRIM_LEN, fname, - xfered/1024, rate, eta_h, eta_m, eta_s); + xfered /= 1024; /* convert to K by default */ + if(xfered > 2048) { + xfered /= 1024; + xfered_size = 'M'; + if(xfered > 2048) { + xfered /= 1024; + xfered_size = 'G'; + /* I should seriously hope that archlinux packages never break + * the 9999.9GB mark... we'd have more serious problems than the progress + * bar in pacman */ + } + } + + printf(" %-*s %6d%c %#6.1f%c/s %02u:%02u:%02u", FILENAME_TRIM_LEN, fname, + xfered/1024, xfered_size, rate, rate_size, eta_h, eta_m, eta_s); free(fname);