X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=fish%2Fprogress.c;h=fea93845fb313f8dab6237333806892778351746;hb=8386a57458aceb768f0e59aa090a15a544f7466e;hp=6a89ae005d8a1e369fecfa623e171e89bd1ffc69;hpb=4e0cf4dbf8a8a96288f70114fdc3939da0aa7ad1;p=libguestfs.git diff --git a/fish/progress.c b/fish/progress.c index 6a89ae0..fea9384 100644 --- a/fish/progress.c +++ b/fish/progress.c @@ -1,5 +1,5 @@ /* guestfish - the filesystem interactive shell - * Copyright (C) 2010 Red Hat Inc. + * Copyright (C) 2010-2011 Red Hat Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -171,6 +171,16 @@ progress_callback (guestfs_h *g, void *data, const char *buf, size_t buf_len, const uint64_t *array, size_t array_len) { + int i, cols, pulse_mode; + double ratio; + const char *s_open, *s_dot, *s_dash, *s_close; + + if (utf8_mode) { + s_open = "\u27e6"; s_dot = "\u2589"; s_dash = "\u2550"; s_close = "\u27e7"; + } else { + s_open = "["; s_dot = "#"; s_dash = "-"; s_close = "]"; + } + if (array_len < 4) return; @@ -183,7 +193,7 @@ progress_callback (guestfs_h *g, void *data, dumb: printf ("%" PRIu64 "/%" PRIu64 "\n", position, total); } else { - int cols = tgetnum ((char *) "co"); + cols = tgetnum ((char *) "co"); if (cols < 32) goto dumb; /* Update an existing progress bar just printed? */ @@ -191,31 +201,43 @@ progress_callback (guestfs_h *g, void *data, tputs (UP, 2, putchar); count++; - double ratio = (double) position / total; + /* Find out if we're in "pulse mode". */ + pulse_mode = position == 0 && total == 1; + + ratio = (double) position / total; if (ratio < 0) ratio = 0; else if (ratio > 1) ratio = 1; - if (ratio < 1) { + if (pulse_mode) { + printf ("%s --- ", spinner (count)); + } + else if (ratio < 1) { int percent = 100.0 * ratio; printf ("%s%3d%% ", spinner (count), percent); - } else { + } + else { fputs (" 100% ", stdout); } - int dots = ratio * (double) (cols - COLS_OVERHEAD); + fputs (s_open, stdout); + + if (!pulse_mode) { + int dots = ratio * (double) (cols - COLS_OVERHEAD); - const char *s_open, *s_dot, *s_dash, *s_close; - if (utf8_mode) { - s_open = "\u27e6"; s_dot = "\u2589"; s_dash = "\u2550"; s_close = "\u27e7"; - } else { - s_open = "["; s_dot = "#"; s_dash = "-"; s_close = "]"; + for (i = 0; i < dots; ++i) + fputs (s_dot, stdout); + for (i = dots; i < cols - COLS_OVERHEAD; ++i) + fputs (s_dash, stdout); + } + else { /* "Pulse mode": the progress bar just pulses. */ + for (i = 0; i < cols - COLS_OVERHEAD; ++i) { + int cc = (count * 3 - i) % (cols - COLS_OVERHEAD); + if (cc >= 0 && cc <= 3) + fputs (s_dot, stdout); + else + fputs (s_dash, stdout); + } } - fputs (s_open, stdout); - int i; - for (i = 0; i < dots; ++i) - fputs (s_dot, stdout); - for (i = dots; i < cols - COLS_OVERHEAD; ++i) - fputs (s_dash, stdout); fputs (s_close, stdout); fputc (' ', stdout);