GNU Wget is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
-\(at your option) any later version.
+(at your option) any later version.
GNU Wget is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
{ "bar", bar_create, bar_update, bar_finish, bar_set_params }
};
static struct progress_implementation *current_impl;
+int current_impl_locked;
-/* Default progress implementation should be something that works
+/* Progress implementation used by default. Can be overriden in
+ wgetrc or by the fallback one. */
+
+#define DEFAULT_PROGRESS_IMPLEMENTATION "bar"
+
+/* Fallnback progress implementation should be something that works
under all display types. If you put something other than "dot"
here, remember that bar_set_params tries to switch to this if we're
not running on a TTY. So changing this to "bar" could cause
infloop. */
-#define DEFAULT_PROGRESS_IMPLEMENTATION "dot"
+#define FALLBACK_PROGRESS_IMPLEMENTATION "dot"
/* Return non-zero if NAME names a valid progress bar implementation.
The characters after the first : will be ignored. */
if (!strncmp (pi->name, name, namelen))
{
current_impl = pi;
+ current_impl_locked = 0;
if (colon)
/* We call pi->set_params even if colon is NULL because we
abort ();
}
+static int output_redirected;
+
+void
+progress_schedule_redirect (void)
+{
+ output_redirected = 1;
+}
+
/* Create a progress gauge. INITIAL is the number of bytes the
download starts from (zero if the download starts from scratch).
TOTAL is the expected total number of bytes in this download. If
void *
progress_create (long initial, long total)
{
+ /* Check if the log status has changed under our feet. */
+ if (output_redirected)
+ {
+ if (!current_impl_locked)
+ set_progress_implementation (FALLBACK_PROGRESS_IMPLEMENTATION);
+ output_redirected = 0;
+ }
+
return current_impl->create (initial, total);
}
log_set_flush (0);
+ if (dp->dots == 0)
+ logprintf (LOG_VERBOSE, "\n%5ldK", dp->rows * row_bytes / 1024);
for (i = dp->dots; i < opt.dots_in_line; i++)
{
if (i % opt.dot_spacing == 0)
}
/* This function interprets the progress "parameters". For example,
- if Wget is invoked with --progress=bar:mega, it will set the
+ if Wget is invoked with --progress=dot:mega, it will set the
"dot-style" to "mega". Valid styles are default, binary, mega, and
giga. */
static void
dot_set_params (const char *params)
{
+ if (!params || !*params)
+ params = opt.dot_style;
+
if (!params)
return;
static void
display_image (char *buf)
{
- char *del_buf = alloca (screen_width + 1);
- memset (del_buf, '\b', screen_width);
- del_buf[screen_width] = '\0';
- logputs (LOG_VERBOSE, del_buf);
+ logputs (LOG_VERBOSE, "\r");
logputs (LOG_VERBOSE, buf);
}
{
int sw;
+ if (params
+ && 0 == strcmp (params, "force"))
+ current_impl_locked = 1;
+
if ((opt.lfilename
#ifdef HAVE_ISATTY
|| !isatty (fileno (stderr))
1
#endif
)
- && !(params != NULL
- && 0 == strcmp (params, "force")))
+ && !current_impl_locked)
{
/* We're not printing to a TTY, so revert to the fallback
display. #### We're recursively calling
set_progress_implementation here, which is slightly kludgy.
- It would be nicer if that function could resolve this problem
- itself. */
- set_progress_implementation (NULL);
+ It would be nicer if we provided that function a return value
+ indicating a failure of some sort. */
+ set_progress_implementation (FALLBACK_PROGRESS_IMPLEMENTATION);
return;
}