aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/python/python-smartpm/smart-improve-error-reporting.patch
blob: b82265b3ff4c6b98f84ace2401a26fa0f9334002 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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 <bogdan.a.marinescu@intel.com>

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: