summaryrefslogtreecommitdiffstats
path: root/src/pacman/downloadprog.c
diff options
context:
space:
mode:
authorAaron Griffin <aaron@archlinux.org>2007-02-04 02:36:45 +0100
committerAaron Griffin <aaron@archlinux.org>2007-02-04 02:36:45 +0100
commite3c7e92f1090204ba945c063b7aba3b3b1d8095b (patch)
tree08d49f36264059a878c7c40c80d99ec5bbcdcdc0 /src/pacman/downloadprog.c
parentd18259b532a09de8025881532bc9ef6152a31891 (diff)
downloadpacman-e3c7e92f1090204ba945c063b7aba3b3b1d8095b.tar.gz
pacman-e3c7e92f1090204ba945c063b7aba3b3b1d8095b.tar.xz
* 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
Diffstat (limited to 'src/pacman/downloadprog.c')
-rw-r--r--src/pacman/downloadprog.c89
1 files changed, 22 insertions, 67 deletions
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(&current_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;
}