Blame 0012-Fix-warnlevel-being-renamed-to-warning-level-in-late.patch

Igor Gnatenko ef6081
From ed831fc8624d33252771c49f4369e7262d4685ff Mon Sep 17 00:00:00 2001
Igor Gnatenko ef6081
From: Xavier Claessens <xavier.claessens@collabora.com>
Igor Gnatenko ef6081
Date: Thu, 26 Apr 2018 22:18:46 -0400
Igor Gnatenko ef6081
Subject: [PATCH 12/16] Fix --warnlevel being renamed to --warning-level in
Igor Gnatenko ef6081
 latest release
Igor Gnatenko ef6081
Igor Gnatenko ef6081
---
Igor Gnatenko ef6081
 mesonbuild/coredata.py                      | 54 ++++++++++++++++-----
Igor Gnatenko ef6081
 mesonbuild/mconf.py                         | 15 +-----
Igor Gnatenko ef6081
 mesonbuild/mesonmain.py                     |  9 ++--
Igor Gnatenko ef6081
 run_unittests.py                            | 39 +++++++++++++++
Igor Gnatenko ef6081
 test cases/unit/30 command line/meson.build |  1 +
Igor Gnatenko ef6081
 5 files changed, 87 insertions(+), 31 deletions(-)
Igor Gnatenko ef6081
 create mode 100644 test cases/unit/30 command line/meson.build
Igor Gnatenko ef6081
Igor Gnatenko ef6081
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
Igor Gnatenko ef6081
index 93a9e718..52d3c7d1 100644
Igor Gnatenko ef6081
--- a/mesonbuild/coredata.py
Igor Gnatenko ef6081
+++ b/mesonbuild/coredata.py
Igor Gnatenko ef6081
@@ -368,12 +368,6 @@ def get_builtin_option_action(optname):
Igor Gnatenko ef6081
         return 'store_true'
Igor Gnatenko ef6081
     return None
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
-def get_builtin_option_destination(optname):
Igor Gnatenko ef6081
-    optname = optname.replace('-', '_')
Igor Gnatenko ef6081
-    if optname == 'warnlevel':
Igor Gnatenko ef6081
-        return 'warning_level'
Igor Gnatenko ef6081
-    return optname
Igor Gnatenko ef6081
-
Igor Gnatenko ef6081
 def get_builtin_option_default(optname, prefix='', noneIfSuppress=False):
Igor Gnatenko ef6081
     if is_builtin_option(optname):
Igor Gnatenko ef6081
         o = builtin_options[optname]
Igor Gnatenko ef6081
@@ -391,24 +385,32 @@ def get_builtin_option_default(optname, prefix='', noneIfSuppress=False):
Igor Gnatenko ef6081
     else:
Igor Gnatenko ef6081
         raise RuntimeError('Tried to get the default value for an unknown builtin option \'%s\'.' % optname)
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
+def get_builtin_option_cmdline_name(name):
Igor Gnatenko ef6081
+    if name == 'warning_level':
Igor Gnatenko ef6081
+        return '--warnlevel'
Igor Gnatenko ef6081
+    else:
Igor Gnatenko ef6081
+        return '--' + name.replace('_', '-')
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
 def add_builtin_argument(p, name):
Igor Gnatenko ef6081
     kwargs = {}
Igor Gnatenko ef6081
-    k = get_builtin_option_destination(name)
Igor Gnatenko ef6081
-    c = get_builtin_option_choices(k)
Igor Gnatenko ef6081
-    b = get_builtin_option_action(k)
Igor Gnatenko ef6081
-    h = get_builtin_option_description(k)
Igor Gnatenko ef6081
+    c = get_builtin_option_choices(name)
Igor Gnatenko ef6081
+    b = get_builtin_option_action(name)
Igor Gnatenko ef6081
+    h = get_builtin_option_description(name)
Igor Gnatenko ef6081
     if not b:
Igor Gnatenko ef6081
-        h = h.rstrip('.') + ' (default: %s).' % get_builtin_option_default(k)
Igor Gnatenko ef6081
+        h = h.rstrip('.') + ' (default: %s).' % get_builtin_option_default(name)
Igor Gnatenko ef6081
     else:
Igor Gnatenko ef6081
         kwargs['action'] = b
Igor Gnatenko ef6081
     if c and not b:
Igor Gnatenko ef6081
         kwargs['choices'] = c
Igor Gnatenko ef6081
-    default = get_builtin_option_default(k, noneIfSuppress=True)
Igor Gnatenko ef6081
+    default = get_builtin_option_default(name, noneIfSuppress=True)
Igor Gnatenko ef6081
     if default is not None:
Igor Gnatenko ef6081
         kwargs['default'] = default
Igor Gnatenko ef6081
     else:
Igor Gnatenko ef6081
         kwargs['default'] = argparse.SUPPRESS
Igor Gnatenko ef6081
-    p.add_argument('--' + name.replace('_', '-'), help=h, **kwargs)
Igor Gnatenko ef6081
+    kwargs['dest'] = name
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
+    cmdline_name = get_builtin_option_cmdline_name(name)
Igor Gnatenko ef6081
+    p.add_argument(cmdline_name, help=h, **kwargs)
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
 def register_builtin_arguments(parser):
Igor Gnatenko ef6081
     for n in builtin_options:
Igor Gnatenko ef6081
@@ -416,6 +418,32 @@ def register_builtin_arguments(parser):
Igor Gnatenko ef6081
     parser.add_argument('-D', action='append', dest='projectoptions', default=[], metavar="option",
Igor Gnatenko ef6081
                         help='Set the value of an option, can be used several times to set multiple options.')
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
+def filter_builtin_options(args, original_args):
Igor Gnatenko ef6081
+    """Filter out any builtin arguments passed as -- instead of -D.
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
+    Error if an argument is passed with -- and -D
Igor Gnatenko ef6081
+    """
Igor Gnatenko ef6081
+    for name in builtin_options:
Igor Gnatenko ef6081
+        # Check if user passed --option. Cannot use hasattr(args, name) here
Igor Gnatenko ef6081
+        # because they are all set with default value if user didn't pass it.
Igor Gnatenko ef6081
+        cmdline_name = get_builtin_option_cmdline_name(name)
Igor Gnatenko ef6081
+        has_dashdash = any([a.startswith(cmdline_name) for a in original_args])
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
+        # Chekc if user passed -Doption=value
Igor Gnatenko ef6081
+        has_dashd = any([a.startswith('{}='.format(name)) for a in args.projectoptions])
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
+        # Passing both is ambigous, abort
Igor Gnatenko ef6081
+        if has_dashdash and has_dashd:
Igor Gnatenko ef6081
+            raise MesonException(
Igor Gnatenko ef6081
+                'Got argument {0} as both -D{0} and {1}. Pick one.'.format(name, cmdline_name))
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
+        # Pretend --option never existed
Igor Gnatenko ef6081
+        if has_dashdash:
Igor Gnatenko ef6081
+            args.projectoptions.append('{}={}'.format(name, getattr(args, name)))
Igor Gnatenko ef6081
+        if hasattr(args, name):
Igor Gnatenko ef6081
+            delattr(args, name)
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
 builtin_options = {
Igor Gnatenko ef6081
     'buildtype':  [UserComboOption, 'Build type to use.', ['plain', 'debug', 'debugoptimized', 'release', 'minsize'], 'debug'],
Igor Gnatenko ef6081
     'strip':      [UserBooleanOption, 'Strip targets on install.', False],
Igor Gnatenko ef6081
diff --git a/mesonbuild/mconf.py b/mesonbuild/mconf.py
Igor Gnatenko ef6081
index f907d752..1375b2e0 100644
Igor Gnatenko ef6081
--- a/mesonbuild/mconf.py
Igor Gnatenko ef6081
+++ b/mesonbuild/mconf.py
Igor Gnatenko ef6081
@@ -28,19 +28,6 @@ def buildparser():
Igor Gnatenko ef6081
     return parser
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
-def filter_builtin_options(args, original_args):
Igor Gnatenko ef6081
-    """Filter out any args passed with -- instead of -D."""
Igor Gnatenko ef6081
-    for arg in original_args:
Igor Gnatenko ef6081
-        if not arg.startswith('--') or arg == '--clearcache':
Igor Gnatenko ef6081
-            continue
Igor Gnatenko ef6081
-        name = arg.lstrip('--').split('=', 1)[0]
Igor Gnatenko ef6081
-        if any([a.startswith(name + '=') for a in args.projectoptions]):
Igor Gnatenko ef6081
-            raise mesonlib.MesonException(
Igor Gnatenko ef6081
-                'Got argument {0} as both -D{0} and --{0}. Pick one.'.format(name))
Igor Gnatenko ef6081
-        args.projectoptions.append('{}={}'.format(name, getattr(args, name)))
Igor Gnatenko ef6081
-        delattr(args, name)
Igor Gnatenko ef6081
-
Igor Gnatenko ef6081
-
Igor Gnatenko ef6081
 class ConfException(mesonlib.MesonException):
Igor Gnatenko ef6081
     pass
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
@@ -242,7 +229,7 @@ def run(args):
Igor Gnatenko ef6081
     if not args:
Igor Gnatenko ef6081
         args = [os.getcwd()]
Igor Gnatenko ef6081
     options = buildparser().parse_args(args)
Igor Gnatenko ef6081
-    filter_builtin_options(options, args)
Igor Gnatenko ef6081
+    coredata.filter_builtin_options(options, args)
Igor Gnatenko ef6081
     if len(options.directory) > 1:
Igor Gnatenko ef6081
         print('%s <build directory>' % args[0])
Igor Gnatenko ef6081
         print('If you omit the build directory, the current directory is substituted.')
Igor Gnatenko ef6081
diff --git a/mesonbuild/mesonmain.py b/mesonbuild/mesonmain.py
Igor Gnatenko ef6081
index 9dda4af5..2b6281d7 100644
Igor Gnatenko ef6081
--- a/mesonbuild/mesonmain.py
Igor Gnatenko ef6081
+++ b/mesonbuild/mesonmain.py
Igor Gnatenko ef6081
@@ -61,11 +61,12 @@ def filter_builtin_options(args, original_args):
Igor Gnatenko ef6081
     if meson_opts:
Igor Gnatenko ef6081
         for arg in meson_opts:
Igor Gnatenko ef6081
             value = arguments[arg]
Igor Gnatenko ef6081
-            if any([a.startswith('--{}'.format(arg)) for a in original_args]):
Igor Gnatenko ef6081
+            cmdline_name = coredata.get_builtin_option_cmdline_name(arg)
Igor Gnatenko ef6081
+            if any([a.startswith(cmdline_name) for a in original_args]):
Igor Gnatenko ef6081
                 raise MesonException(
Igor Gnatenko ef6081
-                    'Argument "{0}" passed as both --{0} and -D{0}, but only '
Igor Gnatenko ef6081
-                    'one is allowed'.format(arg))
Igor Gnatenko ef6081
-            setattr(args, coredata.get_builtin_option_destination(arg), value)
Igor Gnatenko ef6081
+                    'Argument "{0}" passed as both {1} and -D{0}, but only '
Igor Gnatenko ef6081
+                    'one is allowed'.format(arg, cmdline_name))
Igor Gnatenko ef6081
+            setattr(args, arg, value)
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
             # Remove the builtin option from the project args values
Igor Gnatenko ef6081
             args.projectoptions.remove('{}={}'.format(arg, value))
Igor Gnatenko ef6081
diff --git a/run_unittests.py b/run_unittests.py
Igor Gnatenko ef6081
index 3f80f74f..2a466db0 100755
Igor Gnatenko ef6081
--- a/run_unittests.py
Igor Gnatenko ef6081
+++ b/run_unittests.py
Igor Gnatenko ef6081
@@ -2020,6 +2020,45 @@ recommended as it can lead to undefined behaviour on some platforms''')
Igor Gnatenko ef6081
         self.builddir = exebuilddir
Igor Gnatenko ef6081
         self.assertRebuiltTarget('app')
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
+    def test_command_line(self):
Igor Gnatenko ef6081
+        testdir = os.path.join(self.unit_test_dir, '30 command line')
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
+        # Verify default values when passing no args
Igor Gnatenko ef6081
+        self.init(testdir)
Igor Gnatenko ef6081
+        obj = mesonbuild.coredata.load(self.builddir)
Igor Gnatenko ef6081
+        self.assertEqual(obj.builtins['warning_level'].value, '1')
Igor Gnatenko ef6081
+        self.wipe()
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
+        # warning_level is special, it's --warnlevel instead of --warning-level
Igor Gnatenko ef6081
+        # for historical reasons
Igor Gnatenko ef6081
+        self.init(testdir, extra_args=['--warnlevel=2'])
Igor Gnatenko ef6081
+        obj = mesonbuild.coredata.load(self.builddir)
Igor Gnatenko ef6081
+        self.assertEqual(obj.builtins['warning_level'].value, '2')
Igor Gnatenko ef6081
+        self.setconf('--warnlevel=3')
Igor Gnatenko ef6081
+        obj = mesonbuild.coredata.load(self.builddir)
Igor Gnatenko ef6081
+        self.assertEqual(obj.builtins['warning_level'].value, '3')
Igor Gnatenko ef6081
+        self.wipe()
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
+        # But when using -D syntax, it should be 'warning_level'
Igor Gnatenko ef6081
+        self.init(testdir, extra_args=['-Dwarning_level=2'])
Igor Gnatenko ef6081
+        obj = mesonbuild.coredata.load(self.builddir)
Igor Gnatenko ef6081
+        self.assertEqual(obj.builtins['warning_level'].value, '2')
Igor Gnatenko ef6081
+        self.setconf('-Dwarning_level=3')
Igor Gnatenko ef6081
+        obj = mesonbuild.coredata.load(self.builddir)
Igor Gnatenko ef6081
+        self.assertEqual(obj.builtins['warning_level'].value, '3')
Igor Gnatenko ef6081
+        self.wipe()
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
+        # Mixing --option and -Doption is forbidden
Igor Gnatenko ef6081
+        with self.assertRaises(subprocess.CalledProcessError) as e:
Igor Gnatenko ef6081
+            self.init(testdir, extra_args=['--warnlevel=1', '-Dwarning_level=3'])
Igor Gnatenko ef6081
+            self.assertNotEqual(0, e.returncode)
Igor Gnatenko ef6081
+            self.assertIn('passed as both', e.stderr)
Igor Gnatenko ef6081
+        with self.assertRaises(subprocess.CalledProcessError) as e:
Igor Gnatenko ef6081
+            self.setconf('--warnlevel=1', '-Dwarning_level=3')
Igor Gnatenko ef6081
+            self.assertNotEqual(0, e.returncode)
Igor Gnatenko ef6081
+            self.assertIn('passed as both', e.stderr)
Igor Gnatenko ef6081
+        self.wipe()
Igor Gnatenko ef6081
+
Igor Gnatenko ef6081
 
Igor Gnatenko ef6081
 class FailureTests(BasePlatformTests):
Igor Gnatenko ef6081
     '''
Igor Gnatenko ef6081
diff --git a/test cases/unit/30 command line/meson.build b/test cases/unit/30 command line/meson.build
Igor Gnatenko ef6081
new file mode 100644
Igor Gnatenko ef6081
index 00000000..2ab21b6e
Igor Gnatenko ef6081
--- /dev/null
Igor Gnatenko ef6081
+++ b/test cases/unit/30 command line/meson.build	
Igor Gnatenko ef6081
@@ -0,0 +1 @@
Igor Gnatenko ef6081
+project('command line test', 'c')
Igor Gnatenko ef6081
-- 
Igor Gnatenko ef6081
2.17.0
Igor Gnatenko ef6081