From 319f52d756238aca0ba7c671f529d336757806c5 Mon Sep 17 00:00:00 2001 From: hniksic Date: Sat, 25 Jun 2005 17:41:09 -0700 Subject: [PATCH] [svn] When the download is finished, print the time the download took. Always invoke SIZE, not only when continuing the download. --- src/ChangeLog | 10 +++++ src/ftp.c | 26 +++++++------ src/http.c | 7 ++-- src/main.c | 32 ++++++++++++++-- src/progress.c | 101 +++++++++++++++++++++++++++---------------------- src/retr.c | 15 +++++--- src/retr.h | 5 ++- 7 files changed, 125 insertions(+), 71 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index f0c7ebfe..8388a998 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2005-06-26 Hrvoje Niksic + + * ftp.c (getftp): Always invoke SIZE, not only when continuing a + download. + + * main.c (main): Ditto here. + + * progress.c (create_image): When the download is finished, print + how long it took. + 2005-06-26 Hrvoje Niksic * main.c (main): Print the downloaded and quota amounts with the diff --git a/src/ftp.c b/src/ftp.c index de9ef06c..46a520ed 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -50,8 +50,6 @@ so, delete this exception statement from your version. */ #include "convert.h" /* for downloaded_file */ #include "recur.h" /* for INFINITE_RECURSION */ -extern SUM_SIZE_INT total_downloaded_bytes; - /* File where the "ls -al" listing will be saved. */ #define LIST_FILENAME ".listing" @@ -212,7 +210,7 @@ ftp_do_port (int csock, int *local_sock) #endif static void -print_length (wgint size, wgint start, int authoritative) +print_length (wgint size, wgint start, bool authoritative) { logprintf (LOG_VERBOSE, _("Length: %s"), number_to_static_string (size)); if (size >= 1024) @@ -240,7 +238,8 @@ getftp (struct url *u, wgint *len, wgint restval, ccon *con) uerr_t err = RETROK; /* appease the compiler */ FILE *fp; char *user, *passwd, *respline; - char *tms, *tmrate; + char *tms; + const char *tmrate; int cmd = con->cmd; bool pasv_mode_open = false; wgint expected_bytes = 0; @@ -585,7 +584,7 @@ Error in server response, closing control connection.\n")); else /* do not CWD */ logputs (LOG_VERBOSE, _("==> CWD not required.\n")); - if ((cmd & DO_RETR) && restval && *len == 0) + if ((cmd & DO_RETR) && *len == 0) { if (opt.verbose) { @@ -598,7 +597,7 @@ Error in server response, closing control connection.\n")); switch (err) { case FTPRERR: - case FTPSRVERR : + case FTPSRVERR: logputs (LOG_VERBOSE, "\n"); logputs (LOG_NOTQUIET, _("\ Error in server response, closing control connection.\n")); @@ -612,7 +611,8 @@ Error in server response, closing control connection.\n")); abort (); } if (!opt.server_response) - logputs (LOG_VERBOSE, _("done.\n")); + logprintf (LOG_VERBOSE, *len ? "%s\n" : _("done.\n"), + number_to_static_string (*len)); } /* If anything is to be retrieved, PORT (or PASV) must be sent. */ @@ -958,11 +958,11 @@ Error in server response, closing control connection.\n")); if (*len) { - print_length (*len, restval, 1); + print_length (*len, restval, true); expected_bytes = *len; /* for get_contents/show_progress */ } else if (expected_bytes) - print_length (expected_bytes, restval, 0); + print_length (expected_bytes, restval, false); /* Get the contents of the document. */ flags = 0; @@ -975,7 +975,9 @@ Error in server response, closing control connection.\n")); restval, &rd_size, len, &con->dltime, flags); tms = time_str (NULL); - tmrate = retr_rate (rd_size, con->dltime, 0); + tmrate = retr_rate (rd_size, con->dltime); + total_download_time += con->dltime; + /* Close data connection socket. */ fd_close (dtsock); fd_close (local_sock); @@ -1092,7 +1094,7 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con) int count, orig_lp; wgint restval, len = 0; char *tms, *locf; - char *tmrate = NULL; + const char *tmrate = NULL; uerr_t err; struct_stat st; @@ -1228,7 +1230,7 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con) } tms = time_str (NULL); if (!opt.spider) - tmrate = retr_rate (len - restval, con->dltime, 0); + tmrate = retr_rate (len - restval, con->dltime); /* If we get out of the switch above without continue'ing, we've successfully downloaded a file. Remember this fact. */ diff --git a/src/http.c b/src/http.c index 30207e6c..1a276e66 100644 --- a/src/http.c +++ b/src/http.c @@ -59,7 +59,6 @@ so, delete this exception statement from your version. */ #include "convert.h" extern char *version_string; -extern SUM_SIZE_INT total_downloaded_bytes; extern FILE *output_stream; extern bool output_stream_regular; @@ -1970,7 +1969,8 @@ http_loop (struct url *u, char **newloc, char **local_file, const char *referer, bool use_ts, got_head = false;/* time-stamping info */ char *filename_plus_orig_suffix; char *local_filename = NULL; - char *tms, *locf, *tmrate; + char *tms, *locf; + const char *tmrate; uerr_t err; time_t tml = -1, tmr = -1; /* local and remote time-stamps */ wgint local_size = 0; /* the size of the local file */ @@ -2360,7 +2360,8 @@ The sizes do not match (local %s) -- retrieving.\n"), return RETROK; } - tmrate = retr_rate (hstat.rd_size, hstat.dltime, 0); + tmrate = retr_rate (hstat.rd_size, hstat.dltime); + total_download_time += hstat.dltime; if (hstat.len == hstat.contlen) { diff --git a/src/main.c b/src/main.c index 797472cd..96d93589 100644 --- a/src/main.c +++ b/src/main.c @@ -61,7 +61,6 @@ so, delete this exception statement from your version. */ struct options opt; -extern SUM_SIZE_INT total_downloaded_bytes; extern char *version_string; extern struct cookie_jar *wget_cookie_jar; @@ -638,6 +637,31 @@ Recursive accept/reject:\n"), exit (0); } +static char * +secs_to_human_time (double secs_decimal) +{ + static char buf[32]; + int secs = (int) (secs_decimal + 0.5); + int hours, mins, days; + + days = secs / 86400, secs %= 86400; + hours = secs / 3600, secs %= 3600; + mins = secs / 60, secs %= 60; + + if (days) + sprintf (buf, _("%dd %dh %dm %ds"), days, hours, mins, secs); + else if (hours) + sprintf (buf, _("%dh %dm %ds"), hours, mins, secs); + else if (mins) + sprintf (buf, _("%dm %ds"), mins, secs); + else if (secs_decimal >= 1) + sprintf (buf, _("%ds"), secs); + else + sprintf (buf, _("%.2fs"), secs_decimal); + + return buf; +} + static void print_version (void) { @@ -960,10 +984,12 @@ Can't timestamp and not clobber old files at the same time.\n")); || (opt.input_filename && total_downloaded_bytes != 0)) { logprintf (LOG_NOTQUIET, - _("\nFINISHED --%s--\nDownloaded: %s in %d files\n"), + _("FINISHED --%s--\nDownloaded: %d files, %s in %s (%s)\n"), time_str (NULL), + opt.numurls, human_readable (total_downloaded_bytes), - opt.numurls); + secs_to_human_time (total_download_time / 1000), + retr_rate (total_downloaded_bytes, total_download_time)); /* Print quota warning, if exceeded. */ if (opt.quota && total_downloaded_bytes > opt.quota) logprintf (LOG_NOTQUIET, diff --git a/src/progress.c b/src/progress.c index 524aaf4e..1efc590e 100644 --- a/src/progress.c +++ b/src/progress.c @@ -265,8 +265,8 @@ print_percentage (wgint bytes, wgint expected) static void print_download_speed (struct dot_progress *dp, wgint bytes, double dltime) { - logprintf (LOG_VERBOSE, " %s", - retr_rate (bytes, dltime - dp->last_timer_value, 1)); + logprintf (LOG_VERBOSE, " %7s", + retr_rate (bytes, dltime - dp->last_timer_value)); dp->last_timer_value = dltime; } @@ -489,7 +489,7 @@ struct bar_progress { int last_eta_value; }; -static void create_image (struct bar_progress *, double); +static void create_image (struct bar_progress *, double, bool); static void display_image (char *); static void * @@ -524,7 +524,7 @@ bar_create (wgint initial, wgint total) logputs (LOG_VERBOSE, "\n"); - create_image (bp, 0); + create_image (bp, 0, false); display_image (bp->buffer); return bp; @@ -573,7 +573,7 @@ bar_update (void *progress, wgint howmuch, double dltime) /* Don't update more often than five times per second. */ return; - create_image (bp, dltime); + create_image (bp, dltime, false); display_image (bp->buffer); bp->last_screen_update = dltime; } @@ -588,7 +588,7 @@ bar_finish (void *progress, double dltime) /* See bar_update() for explanation. */ bp->total_length = bp->initial_length + bp->count; - create_image (bp, dltime); + create_image (bp, dltime, true); display_image (bp->buffer); logputs (LOG_VERBOSE, "\n\n"); @@ -700,7 +700,7 @@ update_speed_ring (struct bar_progress *bp, wgint howmuch, double dltime) #endif } -static const char *eta_to_human (int); +static const char *eta_to_human_short (int); #define APPEND_LITERAL(s) do { \ memcpy (p, s, sizeof (s) - 1); \ @@ -712,7 +712,7 @@ static const char *eta_to_human (int); #endif static void -create_image (struct bar_progress *bp, double dl_total_time) +create_image (struct bar_progress *bp, double dl_total_time, bool done) { char *p = bp->buffer; wgint size = bp->initial_length + bp->count; @@ -842,41 +842,50 @@ create_image (struct bar_progress *bp, double dl_total_time) else APPEND_LITERAL (" --.--K/s"); - /* " ETA ..m ..s"; wait for three seconds before displaying the ETA. - That's because the ETA value needs a while to become - reliable. */ - if (bp->total_length > 0 && bp->count > 0 && dl_total_time > 3000) + if (!done) { - int eta; - - /* Don't change the value of ETA more than approximately once - per second; doing so would cause flashing without providing - any value to the user. */ - if (bp->total_length != size - && bp->last_eta_value != 0 - && dl_total_time - bp->last_eta_time < 900) - eta = bp->last_eta_value; - else + /* " eta ..m ..s"; wait for three seconds before displaying the ETA. + That's because the ETA value needs a while to become + reliable. */ + if (bp->total_length > 0 && bp->count > 0 && dl_total_time > 3000) { - /* Calculate ETA using the average download speed to predict - the future speed. If you want to use a speed averaged - over a more recent period, replace dl_total_time with - hist->total_time and bp->count with hist->total_bytes. - I found that doing that results in a very jerky and - ultimately unreliable ETA. */ - double time_sofar = (double) dl_total_time / 1000; - wgint bytes_remaining = bp->total_length - size; - eta = (int) (time_sofar * bytes_remaining / bp->count + 0.5); - bp->last_eta_value = eta; - bp->last_eta_time = dl_total_time; - } + int eta; - sprintf (p, " eta %s", eta_to_human (eta)); - p += strlen (p); + /* Don't change the value of ETA more than approximately once + per second; doing so would cause flashing without providing + any value to the user. */ + if (bp->total_length != size + && bp->last_eta_value != 0 + && dl_total_time - bp->last_eta_time < 900) + eta = bp->last_eta_value; + else + { + /* Calculate ETA using the average download speed to predict + the future speed. If you want to use a speed averaged + over a more recent period, replace dl_total_time with + hist->total_time and bp->count with hist->total_bytes. + I found that doing that results in a very jerky and + ultimately unreliable ETA. */ + double time_sofar = (double) dl_total_time / 1000; + wgint bytes_remaining = bp->total_length - size; + eta = (int) (time_sofar * bytes_remaining / bp->count + 0.5); + bp->last_eta_value = eta; + bp->last_eta_time = dl_total_time; + } + + sprintf (p, " eta %s", eta_to_human_short (eta)); + p += strlen (p); + } + else if (bp->total_length > 0) + { + APPEND_LITERAL (" "); + } } - else if (bp->total_length > 0) + else { - APPEND_LITERAL (" "); + /* When the download is done, print the elapsed time. */ + sprintf (p, _(" in %s"), eta_to_human_short (dl_total_time / 1000 + 0.5)); + p += strlen (p); } assert (p - bp->buffer <= bp->width); @@ -942,11 +951,11 @@ progress_handle_sigwinch (int sig) } #endif -/* Provide a human-readable rendition of the ETA. It never occupies - more than 7 characters of screen space. */ +/* Provide a short human-readable rendition of the ETA. It never + occupies more than 7 characters of screen space. */ static const char * -eta_to_human (int secs) +eta_to_human_short (int secs) { static char buf[10]; /* 8 is enough, but just in case */ static int last = -1; @@ -959,16 +968,16 @@ eta_to_human (int secs) last = secs; if (secs < 100) - sprintf (buf, "%ds", secs); + sprintf (buf, _("%ds"), secs); else if (secs < 100 * 60) - sprintf (buf, "%dm %ds", secs / 60, secs % 60); + sprintf (buf, _("%dm %ds"), secs / 60, secs % 60); else if (secs < 100 * 3600) - sprintf (buf, "%dh %dm", secs / 3600, (secs / 60) % 60); + sprintf (buf, _("%dh %dm"), secs / 3600, (secs / 60) % 60); else if (secs < 100 * 86400) - sprintf (buf, "%dd %dh", secs / 86400, (secs / 3600) % 60); + sprintf (buf, _("%dd %dh"), secs / 86400, (secs / 3600) % 60); else /* (2^31-1)/86400 doesn't overflow BUF. */ - sprintf (buf, "%dd", secs / 86400); + sprintf (buf, _("%dd"), secs / 86400); return buf; } diff --git a/src/retr.c b/src/retr.c index 6fed26a1..3838c8d6 100644 --- a/src/retr.c +++ b/src/retr.c @@ -54,6 +54,9 @@ so, delete this exception statement from your version. */ /* Total size of downloaded files. Used to enforce quota. */ SUM_SIZE_INT total_downloaded_bytes; +/* Total download time in milliseconds. */ +double total_download_time; + /* If non-NULL, the stream to which output should be written. This stream is initialized when `-O' is used. */ FILE *output_stream; @@ -495,18 +498,18 @@ fd_read_line (int fd) return fd_read_hunk (fd, line_terminator, 128, FD_READ_LINE_MAX); } -/* Return a printed representation of the download rate, as - appropriate for the speed. If PAD is true, strings will be padded - to the width of 7 characters (xxxx.xx). */ -char * -retr_rate (wgint bytes, double msecs, bool pad) +/* Return a printed representation of the download rate, along with + the units appropriate for the download speed. */ + +const char * +retr_rate (wgint bytes, double msecs) { static char res[20]; static const char *rate_names[] = {"B/s", "KB/s", "MB/s", "GB/s" }; int units = 0; double dlrate = calc_rate (bytes, msecs, &units); - sprintf (res, pad ? "%7.2f %s" : "%.2f %s", dlrate, rate_names[units]); + sprintf (res, "%.2f %s", dlrate, rate_names[units]); return res; } diff --git a/src/retr.h b/src/retr.h index cabb817d..0cc9ebd1 100644 --- a/src/retr.h +++ b/src/retr.h @@ -30,6 +30,9 @@ so, delete this exception statement from your version. */ #ifndef RETR_H #define RETR_H +extern SUM_SIZE_INT total_downloaded_bytes; +extern double total_download_time; + /* Flags for fd_read_body. */ enum { rb_read_exactly = 1, @@ -46,7 +49,7 @@ char *fd_read_line (int); uerr_t retrieve_url (const char *, char **, char **, const char *, int *); uerr_t retrieve_from_file (const char *, bool, int *); -char *retr_rate (wgint, double, bool); +const char *retr_rate (wgint, double); double calc_rate (wgint, double, int *); void printwhat (int, int);