]> git.ipfire.org Git - people/ms/pakfire.git/commitdiff
downloader: Show ETA instead of elapsed time
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 11 Apr 2021 13:04:09 +0000 (13:04 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 11 Apr 2021 13:04:09 +0000 (13:04 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/downloader.c
src/libpakfire/include/pakfire/progressbar.h
src/libpakfire/progressbar.c

index d6d660e0fec34a04c2c549ca4212704257eb70e2..683c153637091e9d5f1fde1d07597a4397289630 100644 (file)
@@ -619,8 +619,8 @@ static int pakfire_downloader_make_single_progressbar(
        if (r)
                return r;
 
-       // Add timer
-       r = pakfire_progressbar_add_timer(downloader->progressbar);
+       // Add ETA
+       r = pakfire_progressbar_add_eta(downloader->progressbar);
        if (r)
                return r;
 
index 99a57299bde6e100cf73234b7550e55d027ff06b..f0259ba0d777caeeaf38ab6ed391ed1419f31ef8 100644 (file)
@@ -49,6 +49,7 @@ int pakfire_progressbar_add_percentage(struct pakfire_progressbar* p);
 int pakfire_progressbar_add_bar(struct pakfire_progressbar* p);
 int pakfire_progressbar_add_timer(struct pakfire_progressbar* p);
 int pakfire_progressbar_add_bytes_transferred(struct pakfire_progressbar* p);
+int pakfire_progressbar_add_eta(struct pakfire_progressbar* p);
 
 #endif
 
index 11fddee2005c0b25952137c662b5c5e49ffd9b51..80e0ba22fb00cbc1769a4a4ea3b4f3a1714dada7 100644 (file)
@@ -26,6 +26,7 @@
 #include <sys/queue.h>
 #include <time.h>
 
+#include <pakfire/i18n.h>
 #include <pakfire/logging.h>
 #include <pakfire/pakfire.h>
 #include <pakfire/progressbar.h>
@@ -502,6 +503,50 @@ int pakfire_progressbar_add_timer(struct pakfire_progressbar* p) {
        return pakfire_progressbar_add_widget(p, pakfire_progressbar_timer, NULL, 0, NULL);
 }
 
+// ETA
+
+static const char* pakfire_progressbar_eta(struct pakfire_progressbar* p,
+               struct pakfire_progressbar_widget* widget, unsigned int width, void* data) {
+       int r;
+
+       time_t t = pakfire_progressbar_elapsed_time(p);
+       if (t < 0)
+               return NULL;
+
+       // Show total time when finished
+       if (p->status == PAKFIRE_PROGRESSBAR_FINISHED)
+               return pakfire_progressbar_timer(p, widget, width, data);
+
+       // Print a placeholder when we haven't started yet
+       if (p->value == 0) {
+               r = snprintf(widget->buffer, sizeof(widget->buffer) - 1, "%-5s: --:--:--", _("ETA"));
+               if (r < 0)
+                       return NULL;
+
+       // Show total time when finished
+       } else if (p->status == PAKFIRE_PROGRESSBAR_FINISHED) {
+               r = snprintf(widget->buffer, sizeof(widget->buffer) - 1,
+                       "%-5s: %02lu:%02lu", _("Time"), t / 60, t % 60);
+               if (r < 0)
+                       return NULL;
+
+       // Calculate the ETA
+       } else {
+               time_t eta = t * p->value_max / p->value - t;
+
+               r = snprintf(widget->buffer, sizeof(widget->buffer) - 1,
+                       "%-5s: %02lu:%02lu", _("ETA"), eta / 60, eta % 60);
+               if (r < 0)
+                       return NULL;
+       }
+
+       return widget->buffer;
+}
+
+int pakfire_progressbar_add_eta(struct pakfire_progressbar* p) {
+       return pakfire_progressbar_add_widget(p, pakfire_progressbar_eta, NULL, 0, NULL);
+}
+
 // Bytes Transferred
 
 static const char* pakfire_progressbar_bytes_transferred(struct pakfire_progressbar* p,