From ad752b80d7fa064b7bdd3d4c8d47c95d79265b58 Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Tue, 13 Apr 2010 22:06:43 +0100 Subject: [PATCH] fish: Allow '-' prefix on command line to override exit on error (RHBZ#578407). 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 | 15 +++++++++++++-- regressions/Makefile.am | 1 + regressions/rhbz578407.sh | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100755 regressions/rhbz578407.sh diff --git a/fish/fish.c b/fish/fish.c index bd13a82..61a8405 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -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); } + + /* 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 ":" ... */ @@ -775,10 +784,12 @@ cmdline (char *argv[], int optind, int 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; - 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); } } diff --git a/regressions/Makefile.am b/regressions/Makefile.am index e8e43cf..8513f9a 100644 --- a/regressions/Makefile.am +++ b/regressions/Makefile.am @@ -27,6 +27,7 @@ TESTS = \ rhbz503169c10.sh \ rhbz503169c13.sh \ rhbz557655.sh \ + rhbz578407.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 index 0000000..6ab2d5d --- /dev/null +++ b/regressions/rhbz578407.sh @@ -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 -- 1.8.3.1