summaryrefslogtreecommitdiffstats
path: root/fish/fish.c
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2010-08-28 12:49:55 +0100
committerRichard Jones <rjones@redhat.com>2010-09-01 14:20:02 +0100
commit54837f6d7ba83178625e2f0c3c063457d9f3f79c (patch)
tree5e42d9ea94780b63007edd18e15ec56791b8b719 /fish/fish.c
parent3003df6bbc889c3939e6c478462dc4478d5b89f7 (diff)
downloadlibguestfs-54837f6d7ba83178625e2f0c3c063457d9f3f79c.tar.gz
libguestfs-54837f6d7ba83178625e2f0c3c063457d9f3f79c.tar.xz
libguestfs-54837f6d7ba83178625e2f0c3c063457d9f3f79c.zip
fish: Implement progress bars in guestfish.
The progress bar is updated 3 times per second, and is not displayed at all for operations which take less than two seconds. You can disable progress bars by using the flag --no-progress-bars, and you can enable progress bars in non-interactive sessions with the flag --progress-bars. A good way to test this is to use the following command: guestfish --progress-bars \ -N disk:10G \ zero-device /dev/sda (adjust "10G" to get different lengths of time).
Diffstat (limited to 'fish/fish.c')
-rw-r--r--fish/fish.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/fish/fish.c b/fish/fish.c
index c4ade8c2..96965453 100644
--- a/fish/fish.c
+++ b/fish/fish.c
@@ -85,6 +85,8 @@ static void cleanup_readline (void);
static void add_history_line (const char *);
#endif
+static int override_progress_bars = -1;
+
/* Currently open libguestfs handle. */
guestfs_h *g;
@@ -100,6 +102,7 @@ const char *libvirt_uri = NULL;
int inspector = 0;
int utf8_mode = 0;
int have_terminfo = 0;
+int progress_bars = 0;
static void __attribute__((noreturn))
usage (int status)
@@ -137,6 +140,8 @@ usage (int status)
" -m|--mount dev[:mnt] Mount dev on mnt (if omitted, /)\n"
" -n|--no-sync Don't autosync\n"
" -N|--new type Create prepared disk (test1.img, ...)\n"
+ " --progress-bars Enable progress bars even when not interactive\n"
+ " --no-progress-bars Disable progress bars\n"
" --remote[=pid] Send commands to remote %s\n"
" -r|--ro Mount read-only\n"
" --selinux Enable SELinux support\n"
@@ -182,6 +187,8 @@ main (int argc, char *argv[])
{ "new", 1, 0, 'N' },
{ "no-dest-paths", 0, 0, 'D' },
{ "no-sync", 0, 0, 'n' },
+ { "progress-bars", 0, 0, 0 },
+ { "no-progress-bars", 0, 0, 0 },
{ "remote", 2, 0, 0 },
{ "ro", 0, 0, 'r' },
{ "selinux", 0, 0, 0 },
@@ -267,6 +274,10 @@ main (int argc, char *argv[])
guestfs_set_selinux (g, 1);
} else if (STREQ (long_options[option_index].name, "keys-from-stdin")) {
keys_from_stdin = 1;
+ } else if (STREQ (long_options[option_index].name, "progress-bars")) {
+ override_progress_bars = 1;
+ } else if (STREQ (long_options[option_index].name, "no-progress-bars")) {
+ override_progress_bars = 0;
} else {
fprintf (stderr, _("%s: unknown long option: %s (%d)\n"),
program_name, long_options[option_index].name, option_index);
@@ -500,6 +511,15 @@ main (int argc, char *argv[])
}
}
+ /* Decide if we display progress bars. */
+ progress_bars =
+ override_progress_bars >= 0
+ ? override_progress_bars
+ : (optind >= argc && isatty (0));
+
+ if (progress_bars)
+ guestfs_set_progress_callback (g, progress_callback, NULL);
+
/* Interactive, shell script, or command(s) on the command line? */
if (optind >= argc) {
if (isatty (0))
@@ -963,6 +983,8 @@ issue_command (const char *cmd, char *argv[], const char *pipecmd)
int pid = 0;
int i, r;
+ reset_progress_bar ();
+
/* This counts the commands issued, starting at 1. */
command_num++;