]> sjero.net Git - wget/commitdiff
More progress bar aesthetic changes
authorDarshit Shah <darnir@gmail.com>
Mon, 19 May 2014 18:45:45 +0000 (00:15 +0530)
committerDarshit Shah <darnir@gmail.com>
Fri, 30 May 2014 07:58:02 +0000 (13:28 +0530)
This commit introduces two new changes to how the progress bar looks:
1. Support the --progress=bar:noscroll option which will prevent the filename
   from scrolling in the progress bar
2. Print human readable value for the amount already downloaded for any file

doc/ChangeLog
doc/wget.texi
src/ChangeLog
src/ftp.c
src/http.c
src/init.c
src/main.c
src/options.h
src/progress.c
src/utils.c
src/utils.h

index 91269b0480c465ee2c78f47f67c1b19a09bb8899..17d5e8a6d94e6be4a606015a7e1b35b1fbb0240f 100644 (file)
@@ -1,3 +1,7 @@
+2014-05-24  Darshit Shah  <darnir@gmail.com>
+
+       * wget.texi: Document noscroll parameter to progress=bar
+
 2014-05-01  Darshit Shah  <darnir@gmail.com>
 
        * wget.texi: Add documentation for --show-progress
 2014-05-01  Darshit Shah  <darnir@gmail.com>
 
        * wget.texi: Add documentation for --show-progress
index e1f29dc7d0d6bac831a178b284c1b223689c1056..b154f4bd4612c6be0258f7d139c90221b427a29d 100644 (file)
@@ -732,7 +732,12 @@ Use @samp{--progress=dot} to switch to the ``dot'' display.  It traces
 the retrieval by printing dots on the screen, each dot representing a
 fixed amount of downloaded data.
 
 the retrieval by printing dots on the screen, each dot representing a
 fixed amount of downloaded data.
 
-When using the dotted retrieval, you may also set the @dfn{style} by
+The progress @var{type} can also take one or more parameters.  The parameters
+vary based on the @var{type} selected.  Parameters to @var{type} are passed by
+appending them to the type sperated by a colon (:) like this:
+@samp{--progress=@var{type}:@var{parameter1}:@var{parameter2}}.
+
+When using the dotted retrieval, you may set the @dfn{style} by
 specifying the type as @samp{dot:@var{style}}.  Different styles assign
 different meaning to one dot.  With the @code{default} style each dot
 represents 1K, there are ten dots in a cluster and 50 dots in a line.
 specifying the type as @samp{dot:@var{style}}.  Different styles assign
 different meaning to one dot.  With the @code{default} style each dot
 represents 1K, there are ten dots in a cluster and 50 dots in a line.
@@ -745,11 +750,25 @@ If @code{mega} is not enough then you can use the @code{giga}
 style---each dot represents 1M retrieved, there are eight dots in a
 cluster, and 32 dots on each line (so each line contains 32M).
 
 style---each dot represents 1M retrieved, there are eight dots in a
 cluster, and 32 dots on each line (so each line contains 32M).
 
+With @samp{--progress=bar}, there are currently two possible parameters,
+@var{force} and @var{noscroll}.
+
+When the output is not a TTY, the progress bar always falls back to ``dot'',
+even if @samp{--progress=bar} was passed to Wget during invokation. This
+behaviour can be overridden and the ``bar'' output forced by using the ``force''
+parameter as @samp{--progress=bar:force}.
+
+By default, the @samp{bar} style progress bar scroll the name of the file from
+left to right for the file being downloaded if the filename exceeds the maximum
+length allotted for its display.  In certain cases, such as with
+@samp{--progress=bar:force}, one may not want the scrolling filename in the
+progress bar.  By passing the ``noscroll'' parameter, Wget can be forced to
+display as much of the filename as possible without scrolling through it.
+
 Note that you can set the default style using the @code{progress}
 command in @file{.wgetrc}.  That setting may be overridden from the
 Note that you can set the default style using the @code{progress}
 command in @file{.wgetrc}.  That setting may be overridden from the
-command line.  The exception is that, when the output is not a TTY, the
-``dot'' progress will be favored over ``bar''.  To force the bar output,
-use @samp{--progress=bar:force}.
+command line.  For example, to force the bar output without scrolling,
+use @samp{--progress=bar:force:noscroll}.
 
 @item --show-progress
 Force wget to display the progress bar in any verbosity.
 
 @item --show-progress
 Force wget to display the progress bar in any verbosity.
index f07ddc5f2000e6b724b754d39e26a8974403082b..c8c3de01b5c677c5f3e669869be9eeeb55bf7b82 100644 (file)
@@ -1,3 +1,21 @@
+2014-05-20  Darshit Shah  <darnir@gmail.com>
+
+       * utils.c (human_readable): Add new parameters, acc and decimals for the
+       function. acc decides the number under which decimal values are shown for a
+       certain value, while decimals decides the number of decimal digits displayed
+       * utils.h (human_readable): Update declartion of the function
+       * ftp.c (print_length): Update call to human_readable
+       * http.c (gethttp): Same
+       * init.c (defaults): Enable scrolling filenames by default
+       * main.c (main): Update call to human_readable
+       * options.h (options): Add new option noscroll
+       * progress.c (create_image): Update the look of the progress bar. Human
+       readable download size by default and add support for noscroll.
+       (dot_set_params, bar_set_params): Change paramter to char * since strtok
+       needs to modify the string.
+       (bar_set_params): Add support for noscroll parameter to bar.
+
+
 2014-05-03  Tim Ruehsen  <tim.ruehsen@gmx.de>
 
        * ftp-ls.c (ftp_parse_vms_ls): Explicitly typecast strlen's output
 2014-05-03  Tim Ruehsen  <tim.ruehsen@gmx.de>
 
        * ftp-ls.c (ftp_parse_vms_ls): Explicitly typecast strlen's output
index 25f05a4c7e3944ea538082637cab693e7e5c349c..e63d98d52039959772486d28088f9a2228a87bea 100644 (file)
--- a/src/ftp.c
+++ b/src/ftp.c
@@ -221,13 +221,13 @@ print_length (wgint size, wgint start, bool authoritative)
 {
   logprintf (LOG_VERBOSE, _("Length: %s"), number_to_static_string (size));
   if (size >= 1024)
 {
   logprintf (LOG_VERBOSE, _("Length: %s"), number_to_static_string (size));
   if (size >= 1024)
-    logprintf (LOG_VERBOSE, " (%s)", human_readable (size));
+    logprintf (LOG_VERBOSE, " (%s)", human_readable (size, 10, 1));
   if (start > 0)
     {
       if (size - start >= 1024)
         logprintf (LOG_VERBOSE, _(", %s (%s) remaining"),
                    number_to_static_string (size - start),
   if (start > 0)
     {
       if (size - start >= 1024)
         logprintf (LOG_VERBOSE, _(", %s (%s) remaining"),
                    number_to_static_string (size - start),
-                   human_readable (size - start));
+                   human_readable (size - start, 10, 1));
       else
         logprintf (LOG_VERBOSE, _(", %s remaining"),
                    number_to_static_string (size - start));
       else
         logprintf (LOG_VERBOSE, _(", %s remaining"),
                    number_to_static_string (size - start));
index b50acf48ea0ac601190d5920d13488d1f8a78bf9..0583faed58b0e92eff8dcb9025f60c4724f6f639 100644 (file)
@@ -2804,13 +2804,13 @@ read_header:
               logputs (LOG_VERBOSE, number_to_static_string (contlen + contrange));
               if (contlen + contrange >= 1024)
                 logprintf (LOG_VERBOSE, " (%s)",
               logputs (LOG_VERBOSE, number_to_static_string (contlen + contrange));
               if (contlen + contrange >= 1024)
                 logprintf (LOG_VERBOSE, " (%s)",
-                           human_readable (contlen + contrange));
+                           human_readable (contlen + contrange, 10, 1));
               if (contrange)
                 {
                   if (contlen >= 1024)
                     logprintf (LOG_VERBOSE, _(", %s (%s) remaining"),
                                number_to_static_string (contlen),
               if (contrange)
                 {
                   if (contlen >= 1024)
                     logprintf (LOG_VERBOSE, _(", %s (%s) remaining"),
                                number_to_static_string (contlen),
-                               human_readable (contlen));
+                               human_readable (contlen, 10, 1));
                   else
                     logprintf (LOG_VERBOSE, _(", %s remaining"),
                                number_to_static_string (contlen));
                   else
                     logprintf (LOG_VERBOSE, _(", %s remaining"),
                                number_to_static_string (contlen));
index fbef133cf9d295217b1a166b996ccb5cfaf67242..804e473aae2f238fdf28cfccd7a17a9a31c68a8a 100644 (file)
@@ -413,6 +413,7 @@ defaults (void)
   /* Use a negative value to mark the absence of --start-pos option */
   opt.start_pos = -1;
   opt.show_progress = false;
   /* Use a negative value to mark the absence of --start-pos option */
   opt.start_pos = -1;
   opt.show_progress = false;
+  opt.noscroll = false;
 }
 \f
 /* Return the user's home directory (strdup-ed), or NULL if none is
 }
 \f
 /* Return the user's home directory (strdup-ed), or NULL if none is
index 29c13242834389638ee906f96d0d6eb439920154..20b8aa33087b7c581bd7b937ff50bdc48e859b49 100644 (file)
@@ -1714,7 +1714,7 @@ outputting to a regular file.\n"));
                 datetime_str (time (NULL)),
                 wall_time,
                 numurls,
                 datetime_str (time (NULL)),
                 wall_time,
                 numurls,
-                human_readable (total_downloaded_bytes),
+                human_readable (total_downloaded_bytes, 10, 1),
                 download_time,
                 retr_rate (total_downloaded_bytes, total_download_time));
       xfree (wall_time);
                 download_time,
                 retr_rate (total_downloaded_bytes, total_download_time));
       xfree (wall_time);
@@ -1724,7 +1724,7 @@ outputting to a regular file.\n"));
       if (opt.quota && total_downloaded_bytes > opt.quota)
         logprintf (LOG_NOTQUIET,
                    _("Download quota of %s EXCEEDED!\n"),
       if (opt.quota && total_downloaded_bytes > opt.quota)
         logprintf (LOG_NOTQUIET,
                    _("Download quota of %s EXCEEDED!\n"),
-                   human_readable (opt.quota));
+                   human_readable (opt.quota, 10, 1));
     }
 
   if (opt.cookies_output)
     }
 
   if (opt.cookies_output)
index 9358e3023a5a9893b55a7f9a62346258bcdf383b..2855149c09062508f1ed149218cb06e710362454 100644 (file)
@@ -135,6 +135,7 @@ struct options
   char *base_href;
   char *progress_type;         /* progress indicator type. */
   bool show_progress;        /* Show only the progress bar */
   char *base_href;
   char *progress_type;         /* progress indicator type. */
   bool show_progress;        /* Show only the progress bar */
+  bool noscroll;             /* Don't scroll the filename in the progressbar */
   char *proxy_user; /*oli*/
   char *proxy_passwd;
 
   char *proxy_user; /*oli*/
   char *proxy_passwd;
 
index 6cb22d70ecb53304c6b2c71b9755d03ffa14f0ff..0c809eb1ee2c182fdedbed9eb5cbe352132bf65d 100644 (file)
@@ -51,7 +51,7 @@ struct progress_implementation {
   void (*update) (void *, wgint, double);
   void (*draw) (void *);
   void (*finish) (void *, double);
   void (*update) (void *, wgint, double);
   void (*draw) (void *);
   void (*finish) (void *, double);
-  void (*set_params) (const char *);
+  void (*set_params) (char *);
 };
 
 /* Necessary forward declarations. */
 };
 
 /* Necessary forward declarations. */
@@ -60,13 +60,13 @@ static void *dot_create (const char *, wgint, wgint);
 static void dot_update (void *, wgint, double);
 static void dot_finish (void *, double);
 static void dot_draw (void *);
 static void dot_update (void *, wgint, double);
 static void dot_finish (void *, double);
 static void dot_draw (void *);
-static void dot_set_params (const char *);
+static void dot_set_params (char *);
 
 static void *bar_create (const char *, wgint, wgint);
 static void bar_update (void *, wgint, double);
 static void bar_draw (void *);
 static void bar_finish (void *, double);
 
 static void *bar_create (const char *, wgint, wgint);
 static void bar_update (void *, wgint, double);
 static void bar_draw (void *);
 static void bar_finish (void *, double);
-static void bar_set_params (const char *);
+static void bar_set_params (char *);
 
 static struct progress_implementation implementations[] = {
   { "dot", 0, dot_create, dot_update, dot_draw, dot_finish, dot_set_params },
 
 static struct progress_implementation implementations[] = {
   { "dot", 0, dot_create, dot_update, dot_draw, dot_finish, dot_set_params },
@@ -112,7 +112,7 @@ set_progress_implementation (const char *name)
 {
   size_t i, namelen;
   struct progress_implementation *pi = implementations;
 {
   size_t i, namelen;
   struct progress_implementation *pi = implementations;
-  const char *colon;
+  char *colon;
 
   if (!name)
     name = DEFAULT_PROGRESS_IMPLEMENTATION;
 
   if (!name)
     name = DEFAULT_PROGRESS_IMPLEMENTATION;
@@ -419,7 +419,7 @@ dot_finish (void *progress, double dltime)
    giga.  */
 
 static void
    giga.  */
 
 static void
-dot_set_params (const char *params)
+dot_set_params (char *params)
 {
   if (!params || !*params)
     params = opt.dot_style;
 {
   if (!params || !*params)
     params = opt.dot_style;
@@ -889,7 +889,7 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
   int orig_filename_len = strlen (bp->f_download);
 
   /* The progress bar should look like this:
   int orig_filename_len = strlen (bp->f_download);
 
   /* The progress bar should look like this:
-     file xx% [=======>             ] nn,nnn 12.34KB/s  eta 36m 51s
+     file xx% [=======>             ] nnn.nnK 12.34KB/s  eta 36m 51s
 
      Calculate the geometry.  The idea is to assign as much room as
      possible to the progress bar.  The other idea is to never let
 
      Calculate the geometry.  The idea is to assign as much room as
      possible to the progress bar.  The other idea is to never let
@@ -898,17 +898,26 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
      It would be especially bad for the progress bar to be resized
      randomly.
 
      It would be especially bad for the progress bar to be resized
      randomly.
 
-     "file "           - Downloaded filename      - MAX MAX_FILENAME_LEN chars + 1
+     "file "           - Downloaded filename      - MAX_FILENAME_LEN chars + 1
      "xx% " or "100%"  - percentage               - 4 chars
      "[]"              - progress bar decorations - 2 chars
      "xx% " or "100%"  - percentage               - 4 chars
      "[]"              - progress bar decorations - 2 chars
-     " nnn,nnn,nnn"    - downloaded bytes         - 12 chars or very rarely more
-     " 12.5KB/s"       - download rate            - 9 chars
+     " nnn.nnK"        - downloaded bytes         - 7 chars + 1
+     " 12.5KB/s"       - download rate            - 8 chars + 1
      "  eta 36m 51s"   - ETA                      - 14 chars
 
      "=====>..."       - progress bar             - the rest
   */
      "  eta 36m 51s"   - ETA                      - 14 chars
 
      "=====>..."       - progress bar             - the rest
   */
-  int dlbytes_size = 1 + MAX (size_grouped_len, 11);
-  int progress_size = bp->width - (MAX_FILENAME_LEN + 1 + 4 + 2 + dlbytes_size + 8 + 14);
+
+#define PROGRESS_FILENAME_LEN  MAX_FILENAME_LEN + 1
+#define PROGRESS_PERCENT_LEN   4
+#define PROGRESS_DECORAT_LEN   2
+#define PROGRESS_FILESIZE_LEN  7 + 1
+#define PROGRESS_DWNLOAD_RATE  8 + 1
+#define PROGRESS_ETA_LEN       14
+
+  int progress_size = bp->width - (PROGRESS_FILENAME_LEN + PROGRESS_PERCENT_LEN +
+                                   PROGRESS_DECORAT_LEN + PROGRESS_FILESIZE_LEN +
+                                   PROGRESS_DWNLOAD_RATE + PROGRESS_ETA_LEN);
 
   /* The difference between the number of bytes used,
      and the number of columns used. */
 
   /* The difference between the number of bytes used,
      and the number of columns used. */
@@ -929,7 +938,7 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
     {
       int offset;
 
     {
       int offset;
 
-      if (orig_filename_len > MAX_FILENAME_LEN)
+      if (((orig_filename_len > MAX_FILENAME_LEN) && !opt.noscroll) && !done)
         offset = ((int) bp->tick) % (orig_filename_len - MAX_FILENAME_LEN);
       else
         offset = 0;
         offset = ((int) bp->tick) % (orig_filename_len - MAX_FILENAME_LEN);
       else
         offset = 0;
@@ -1014,13 +1023,20 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
     }
  ++bp->tick;
 
     }
  ++bp->tick;
 
-  /* " 234,567,890" */
-  sprintf (p, " %s", size_grouped);
+  /* " 234.56M" */
+  const char * down_size = human_readable (size, 1000, 2);
+  int cols_diff = 7 - count_cols (down_size);
+  while (cols_diff > 0)
+  {
+    *p++=' ';
+    cols_diff--;
+  }
+  sprintf (p, " %s", down_size);
   move_to_end (p);
   move_to_end (p);
-  /* Pad with spaces to 11 chars for the size_grouped field;
+  /* Pad with spaces to 7 chars for the size_grouped field;
    * couldn't use the field width specifier in sprintf, because
    * it counts in bytes, not characters. */
    * couldn't use the field width specifier in sprintf, because
    * it counts in bytes, not characters. */
-  for (size_grouped_pad = 11 - size_grouped_len;
+  for (size_grouped_pad = PROGRESS_FILESIZE_LEN - 7;
        size_grouped_pad > 0;
        --size_grouped_pad)
     {
        size_grouped_pad > 0;
        --size_grouped_pad)
     {
@@ -1030,20 +1046,20 @@ create_image (struct bar_progress *bp, double dl_total_time, bool done)
   /* " 12.52Kb/s or 12.52KB/s" */
   if (hist->total_time > 0 && hist->total_bytes)
     {
   /* " 12.52Kb/s or 12.52KB/s" */
   if (hist->total_time > 0 && hist->total_bytes)
     {
-      static const char *short_units[] = { "B/s", "KB/s", "MB/s", "GB/s" };
-      static const char *short_units_bits[] = { "b/s", "Kb/s", "Mb/s", "Gb/s" };
+      static const char *short_units[] = { " B/s", "KB/s", "MB/s", "GB/s" };
+      static const char *short_units_bits[] = { " b/s", "Kb/s", "Mb/s", "Gb/s" };
       int units = 0;
       /* Calculate the download speed using the history ring and
          recent data that hasn't made it to the ring yet.  */
       wgint dlquant = hist->total_bytes + bp->recent_bytes;
       double dltime = hist->total_time + (dl_total_time - bp->recent_start);
       double dlspeed = calc_rate (dlquant, dltime, &units);
       int units = 0;
       /* Calculate the download speed using the history ring and
          recent data that hasn't made it to the ring yet.  */
       wgint dlquant = hist->total_bytes + bp->recent_bytes;
       double dltime = hist->total_time + (dl_total_time - bp->recent_start);
       double dlspeed = calc_rate (dlquant, dltime, &units);
-      sprintf (p, "%4.*f%s", dlspeed >= 99.95 ? 0 : dlspeed >= 9.995 ? 1 : 2,
+      sprintf (p, " %4.*f%s", dlspeed >= 99.95 ? 0 : dlspeed >= 9.995 ? 1 : 2,
                dlspeed,  !opt.report_bps ? short_units[units] : short_units_bits[units]);
       move_to_end (p);
     }
   else
                dlspeed,  !opt.report_bps ? short_units[units] : short_units_bits[units]);
       move_to_end (p);
     }
   else
-    APPEND_LITERAL ("--.-KB/s");
+    APPEND_LITERAL (" --.-KB/s");
 
   if (!done)
     {
 
   if (!done)
     {
@@ -1126,13 +1142,21 @@ display_image (char *buf)
 }
 
 static void
 }
 
 static void
-bar_set_params (const char *params)
+bar_set_params (char *params)
 {
   char *term = getenv ("TERM");
 
 {
   char *term = getenv ("TERM");
 
-  if (params
-      && 0 == strcmp (params, "force"))
-    current_impl_locked = 1;
+  if (params)
+    {
+      char *param = strtok (params, ":");
+      do
+        {
+          if (0 == strcmp (param, "force"))
+            current_impl_locked = 1;
+          else if (0 == strcmp (param, "noscroll"))
+            opt.noscroll = true;
+        } while ((param = strtok (NULL, ":")) != NULL);
+    }
 
   if ((opt.lfilename
 #ifdef HAVE_ISATTY
 
   if ((opt.lfilename
 #ifdef HAVE_ISATTY
index 11ca75c70464d30bda0743680311cc48723aa2c4..8168fb38719d8880d08ef53608a0a31afe86720c 100644 (file)
@@ -1523,7 +1523,7 @@ with_thousand_seps (wgint n)
    some detail.  */
 
 char *
    some detail.  */
 
 char *
-human_readable (HR_NUMTYPE n)
+human_readable (HR_NUMTYPE n, const int acc, const int decimals)
 {
   /* These suffixes are compatible with those of GNU `ls -lh'. */
   static char powers[] =
 {
   /* These suffixes are compatible with those of GNU `ls -lh'. */
   static char powers[] =
@@ -1556,10 +1556,10 @@ human_readable (HR_NUMTYPE n)
       if ((n / 1024) < 1024 || i == countof (powers) - 1)
         {
           double val = n / 1024.0;
       if ((n / 1024) < 1024 || i == countof (powers) - 1)
         {
           double val = n / 1024.0;
-          /* Print values smaller than 10 with one decimal digits, and
-             others without any decimals.  */
+          /* Print values smaller than the accuracy level (acc) with (decimal)
+           * decimal digits, and others without any decimals.  */
           snprintf (buf, sizeof (buf), "%.*f%c",
           snprintf (buf, sizeof (buf), "%.*f%c",
-                    val < 10 ? 1 : 0, val, powers[i]);
+                    val < acc ? decimals : 0, val, powers[i]);
           return buf;
         }
       n /= 1024;
           return buf;
         }
       n /= 1024;
index e244b8ad83232f09c26e53b09f6892288c1be5a0..1f4cb69596089cd3e0dd1d46a64a6ee1c780f957 100644 (file)
@@ -121,7 +121,7 @@ const char *with_thousand_seps (wgint);
 #else
 # define HR_NUMTYPE double
 #endif
 #else
 # define HR_NUMTYPE double
 #endif
-char *human_readable (HR_NUMTYPE);
+char *human_readable (HR_NUMTYPE, const int, const int);
 
 
 int numdigit (wgint);
 
 
 int numdigit (wgint);