Patchwork check-config: syntax to allow inconsistent config values

login
register
mail settings
Submitter Gregory Szorc
Date July 2, 2017, 3:35 a.m.
Message ID <d44bbbaf266b9f6ce0c9.1498966517@ubuntu-vm-main>
Download mbox | patch
Permalink /patch/21910/
State Accepted
Headers show

Comments

Gregory Szorc - July 2, 2017, 3:35 a.m.
# HG changeset patch
# User Gregory Szorc <gregory.szorc@gmail.com>
# Date 1498966467 25200
#      Sat Jul 01 20:34:27 2017 -0700
# Node ID d44bbbaf266b9f6ce0c9e9820d0f72f4b2af34bd
# Parent  6d678ab1b10d0fddc73003d21aa3c7ec43194e2e
check-config: syntax to allow inconsistent config values

The ignore regular expression has been updated to detect
"inconsistent config." If present, we track which configs have
that set and we suppress the conflicting defaults error for those
options.

I also added named groups to the regexp to aid readability.

A comment was added to profiling.py to make a desired inconsistent
value error go away.
Yuya Nishihara - July 3, 2017, 1:08 p.m.
On Sat, 01 Jul 2017 20:35:17 -0700, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc <gregory.szorc@gmail.com>
> # Date 1498966467 25200
> #      Sat Jul 01 20:34:27 2017 -0700
> # Node ID d44bbbaf266b9f6ce0c9e9820d0f72f4b2af34bd
> # Parent  6d678ab1b10d0fddc73003d21aa3c7ec43194e2e
> check-config: syntax to allow inconsistent config values

Queued, thanks.

Patch

diff --git a/contrib/check-config.py b/contrib/check-config.py
--- a/contrib/check-config.py
+++ b/contrib/check-config.py
@@ -13,6 +13,7 @@  import sys
 
 foundopts = {}
 documented = {}
+allowinconsistent = set()
 
 configre = re.compile(r'''
     # Function call
@@ -36,6 +37,11 @@  configwithre = re.compile('''
 
 configpartialre = (r"""ui\.config""")
 
+ignorere = re.compile(r'''
+    \#\s(?P<reason>internal|experimental|deprecated|developer|inconsistent)\s
+    config:\s(?P<config>\S+\.\S+)$
+    ''', re.VERBOSE | re.MULTILINE)
+
 def main(args):
     for f in args:
         sect = ''
@@ -82,10 +88,12 @@  def main(args):
                 documented[m.group(1)] = 1
 
             # look for ignore markers
-            m = re.search(r'# (?:internal|experimental|deprecated|developer)'
-                          ' config: (\S+\.\S+)$', l)
+            m = ignorere.search(l)
             if m:
-                documented[m.group(1)] = 1
+                if m.group('reason') == 'inconsistent':
+                    allowinconsistent.add(m.group('config'))
+                else:
+                    documented[m.group('config')] = 1
 
             # look for code-like bits
             line = carryover + l
@@ -100,7 +108,8 @@  def main(args):
                     default = ''
                 if re.match('[a-z.]+$', default):
                     default = '<variable>'
-                if name in foundopts and (ctype, default) != foundopts[name]:
+                if (name in foundopts and (ctype, default) != foundopts[name]
+                    and name not in allowinconsistent):
                     print(l)
                     print("conflict on %s: %r != %r" % (name, (ctype, default),
                                                         foundopts[name]))
diff --git a/mercurial/profiling.py b/mercurial/profiling.py
--- a/mercurial/profiling.py
+++ b/mercurial/profiling.py
@@ -141,6 +141,7 @@  def statprofile(ui, fp):
             showmax = ui.configwith(fraction, 'profiling', 'showmax', 0.999)
             kwargs.update(minthreshold=showmin, maxthreshold=showmax)
         elif profformat == 'hotpath':
+            # inconsistent config: profiling.showmin
             limit = ui.configwith(fraction, 'profiling', 'showmin', 0.05)
             kwargs['limit'] = limit
 
diff --git a/tests/test-check-config.t b/tests/test-check-config.t
--- a/tests/test-check-config.t
+++ b/tests/test-check-config.t
@@ -14,6 +14,13 @@  Sanity check check-config.py
   > # Missing with default value
   > foo = ui.configbool('ui', 'missingbool1', default=True)
   > foo = ui.configbool('ui', 'missingbool2', False)
+  > # Inconsistent values for defaults.
+  > foo = ui.configint('ui', 'intdefault', default=1)
+  > foo = ui.configint('ui', 'intdefault', default=42)
+  > # Can suppress inconsistent value error
+  > foo = ui.configint('ui', 'intdefault2', default=1)
+  > # inconsistent config: ui.intdefault2
+  > foo = ui.configint('ui', 'intdefault2', default=42)
   > EOF
 
   $ cat > files << EOF
@@ -24,7 +31,12 @@  Sanity check check-config.py
   $ cd "$TESTDIR"/..
 
   $ $PYTHON contrib/check-config.py < $TESTTMP/files
+  foo = ui.configint('ui', 'intdefault', default=42)
+  
+  conflict on ui.intdefault: ('int', '42') != ('int', '1')
   undocumented: ui.doesnotexist (str)
+  undocumented: ui.intdefault (int) [42]
+  undocumented: ui.intdefault2 (int) [42]
   undocumented: ui.missingbool1 (bool) [True]
   undocumented: ui.missingbool2 (bool)
   undocumented: ui.missingint (int)
@@ -33,6 +45,3 @@  New errors are not allowed. Warnings are
 
   $ syshg files "set:(**.py or **.txt) - tests/**" | sed 's|\\|/|g' |
   >   $PYTHON contrib/check-config.py
-              limit = ui.configwith(fraction, 'profiling', 'showmin', 0.05)
-  
-  conflict on profiling.showmin: ('with', '0.05') != ('with', '0.005')