Improve error reporting in smart Add code to check proper command line arguments for various smart commands. Exit with error if erroneous/additional arguments are given in the command line. Upstream-Status: Pending Signed-off-by: Bogdan Marinescu diff --git a/smart/util/optparse.py b/smart/util/optparse.py index 6fff1bc..f445a3b 100644 --- a/smart/util/optparse.py +++ b/smart/util/optparse.py @@ -70,6 +70,8 @@ import sys, os import types import textwrap from gettext import gettext as _ +from smart import Error +import re def _repr(self): return "<%s at 0x%x: %s>" % (self.__class__.__name__, id(self), self) @@ -710,6 +712,12 @@ class Option: self.action, self.dest, opt, value, values, parser) def take_action(self, action, dest, opt, value, values, parser): + # Keep all the options in the command line in the '_given_opts' array + # This will be used later to validate the command line + given_opts = getattr(parser.values, "_given_opts", []) + user_opt = re.sub(r"^\-*", "", opt).replace("-", "_") + given_opts.append(user_opt) + setattr(parser.values, "_given_opts", given_opts) if action == "store": setattr(values, dest, value) elif action == "store_const": @@ -821,6 +829,54 @@ class Values: setattr(self, attr, value) return getattr(self, attr) + # Check if the given option has the specified number of arguments + # Raise an error if the option has an invalid number of arguments + # A negative number for 'nargs' means "at least |nargs| arguments are needed" + def check_args_of_option(self, opt, nargs, err=None): + given_opts = getattr(self, "_given_opts", []) + if not opt in given_opts: + return + values = getattr(self, opt, []) + if type(values) != type([]): + return + if nargs < 0: + nargs = -nargs + if len(values) >= nargs: + return + if not err: + if nargs == 1: + err = _("Option '%s' requires at least one argument") % opt + else: + err = _("Option '%s' requires at least %d arguments") % (opt, nargs) + raise Error, err + elif nargs == 0: + if len( values ) == 0: + return + raise Error, err + else: + if len(values) == nargs: + return + if not err: + if nargs == 1: + err = _("Option '%s' requires one argument") % opt + else: + err = _("Option '%s' requires %d arguments") % (opt, nargs) + raise Error, err + + # Check that at least one of the options in 'actlist' was given as an argument + # to the command 'cmdname' + def ensure_action(self, cmdname, actlist): + given_opts = getattr(self, "_given_opts", []) + for action in actlist: + if action in given_opts: + return + raise Error, _("No action specified for command '%s'") % cmdname + + # Check if there are any other arguments left after parsing the command line and + # raise an error if such arguments are found + def check_remaining_args(self): + if self.args: + raise Error, _("Invalid argument(s) '%s'" % str(self.args)) class OptionContainer: