fish: Allow '-' prefix on command line to override exit on error (RHBZ#578407).
authorRichard Jones <rjones@redhat.com>
Tue, 13 Apr 2010 21:06:43 +0000 (22:06 +0100)
committerRichard Jones <rjones@redhat.com>
Tue, 13 Apr 2010 21:09:21 +0000 (22:09 +0100)
Allow -cmd on the command line to mean that normal exit on error
behaviour is overridden, ie. we will not exit.

This allows you to do:

  guestfish -- command : -command : command

with the second command allowing errors.  (Note that '--' is required
to stop getopt parsing -command as an option).

Also this fixes the remote case which is what the original
bug report was about.

fish/fish.c
regressions/Makefile.am
regressions/rhbz578407.sh [new file with mode: 0755]

index bd13a82..61a8405 100644 (file)
@@ -768,6 +768,15 @@ cmdline (char *argv[], int optind, int argc)
     fprintf (stderr, _("%s: empty command on command line\n"), program_name);
     exit (EXIT_FAILURE);
   }
     fprintf (stderr, _("%s: empty command on command line\n"), program_name);
     exit (EXIT_FAILURE);
   }
+
+  /* Allow -cmd on the command line to mean (temporarily) override
+   * the normal exit on error (RHBZ#578407).
+   */
+  if (cmd[0] == '-') {
+    exit_on_error = 0;
+    cmd++;
+  }
+
   params = &argv[optind];
 
   /* Search for end of command list or ":" ... */
   params = &argv[optind];
 
   /* Search for end of command list or ":" ... */
@@ -775,10 +784,12 @@ cmdline (char *argv[], int optind, int argc)
     optind++;
 
   if (optind == argc) {
     optind++;
 
   if (optind == argc) {
-    if (issue_command (cmd, params, NULL) == -1) exit (EXIT_FAILURE);
+    if (issue_command (cmd, params, NULL) == -1 && exit_on_error)
+        exit (EXIT_FAILURE);
   } else {
     argv[optind] = NULL;
   } else {
     argv[optind] = NULL;
-    if (issue_command (cmd, params, NULL) == -1) exit (EXIT_FAILURE);
+    if (issue_command (cmd, params, NULL) == -1 && exit_on_error)
+      exit (EXIT_FAILURE);
     cmdline (argv, optind+1, argc);
   }
 }
     cmdline (argv, optind+1, argc);
   }
 }
index e8e43cf..8513f9a 100644 (file)
@@ -27,6 +27,7 @@ TESTS = \
        rhbz503169c10.sh \
        rhbz503169c13.sh \
        rhbz557655.sh \
        rhbz503169c10.sh \
        rhbz503169c13.sh \
        rhbz557655.sh \
+       rhbz578407.sh \
        rhbz580246.sh \
        test-cancellation-download-librarycancels.sh \
        test-cancellation-upload-daemoncancels.sh \
        rhbz580246.sh \
        test-cancellation-download-librarycancels.sh \
        test-cancellation-upload-daemoncancels.sh \
diff --git a/regressions/rhbz578407.sh b/regressions/rhbz578407.sh
new file mode 100755 (executable)
index 0000000..6ab2d5d
--- /dev/null
@@ -0,0 +1,43 @@
+#!/bin/bash -
+# libguestfs
+# Copyright (C) 2010 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
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# Regression test for:
+# https://bugzilla.redhat.com/show_bug.cgi?id=578407
+# prefix '-' in sub-command isn't handled by guestfish in remote control mode
+# Reported by Qixiang Wan.
+
+set -e
+
+guestfish=../fish/guestfish
+
+# Start remote guestfish.
+eval `$guestfish --listen 2>/dev/null`
+
+# This should succeed.
+$guestfish --remote version > /dev/null
+
+# This command will fail (because appliance not launched), but
+# prefixing with '-' should make remote guestfish ignore the failure.
+$guestfish --remote -- -lvs
+
+# Remote guestfish should still be running.
+$guestfish --remote version > /dev/null
+$guestfish --remote exit
+
+# Try some other command line argument tests which are related the fix.
+$guestfish -- version : -lvs : version > /dev/null 2>&1