diff options
author | Ivy Foster <ivy.foster@gmail.com> | 2016-07-09 05:11:25 +0200 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2016-08-30 10:10:40 +0200 |
commit | 58140dba7440997e9d318fb56ed939a9c81fddf8 (patch) | |
tree | 5e2633a6c63cf56711e381602f6fae2dfdc775d9 /src | |
parent | 56de155296a57fb3fcd8ae64aed00fd18fe2f22e (diff) | |
download | pacman-58140dba7440997e9d318fb56ed939a9c81fddf8.tar.gz pacman-58140dba7440997e9d318fb56ed939a9c81fddf8.tar.xz |
Normalize alpm download callback's frontend cb arguments
When curl calls alpm's dlcb, alpm calls the frontend's cb with the
following (dlsize, totalsize) arguments:
0, -1: initialize
0, 0: no change since last call
x {x>0, x<y}, y {y>0}: data downloaded, total size known
x {x>0}, x: download finished
If total size is not known, do not call frontend cb (no change to
original behavior); alpm's callback shouldn't be called if there is a
download error.
See agregory's original spec here:
https://wiki.archlinux.org/index.php/User:Apg#download_callback
Signed-off-by: Allan McRae <allan@archlinux.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/pacman/callback.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/pacman/callback.c b/src/pacman/callback.c index ab3e14f2..7f72b84f 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -678,8 +678,13 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) const unsigned short cols = getcols(); - if(config->noprogressbar || cols == 0 || file_total == -1) { - if(file_xfered == 0) { + /* Nothing has changed since last callback; stop here */ + if(file_xfered == 0 && file_total == 0) { + return; + } + + if(config->noprogressbar || cols == 0) { + if(file_xfered == 0 && file_total == -1) { printf(_("downloading %s...\n"), filename); fflush(stdout); } @@ -710,14 +715,9 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) total = file_total; } - /* bogus values : stop here */ - if(xfered > total || xfered < 0) { - return; - } - /* this is basically a switch on xfered: 0, total, and * anything else */ - if(file_xfered == 0) { + if(file_xfered == 0 && file_total == -1) { /* set default starting values, ensure we only call this once * if TotalDownload is enabled */ if(!totaldownload || (totaldownload && list_xfered == 0)) { @@ -726,6 +726,9 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total) rate_last = 0.0; get_update_timediff(1); } + } else if(xfered > total || xfered < 0) { + /* bogus values : stop here */ + return; } else if(file_xfered == file_total) { /* compute final values */ int64_t timediff = get_time_ms() - initial_time; |