##// END OF EJS Templates
merge-lists: make it possible to specify pattern to match...
merge-lists: make it possible to specify pattern to match The `merge-lists` tool doesn't know anything about Python other than its regex that attempts to match import lines. Let's make it possible to pass in a custom regex so it's easy to use the tool for e.g. C/C++ `#include` lines or Rust `use` lines (given the limited). Differential Revision: https://phab.mercurial-scm.org/D12392

File last commit:

r49730:6000f5b2 default
r49875:b999edb1 default
Show More
check-config.py
190 lines | 5.5 KiB | text/x-python | PythonLexer
Gregory Szorc
global: use python3 in shebangs...
r46434 #!/usr/bin/env python3
Matt Mackall
check-config: add config option checker...
r25790 #
# check-config - a config flag documentation checker for Mercurial
#
Raphaël Gomès
contributor: change mentions of mpm to olivia...
r47575 # Copyright 2015 Olivia Mackall <olivia@selenic.com>
Matt Mackall
check-config: add config option checker...
r25790 #
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
import re
import sys
foundopts = {}
documented = {}
Gregory Szorc
check-config: syntax to allow inconsistent config values...
r33192 allowinconsistent = set()
Matt Mackall
check-config: add config option checker...
r25790
Augie Fackler
formatting: blacken the codebase...
r43346 configre = re.compile(
br'''
Gregory Szorc
check-config: use compiled regexp...
r32847 # Function call
Gregory Szorc
check-config: use named groups in regexp...
r32848 ui\.config(?P<ctype>|int|bool|list)\(
Gregory Szorc
check-config: use compiled regexp...
r32847 # First argument.
Gregory Szorc
check-config: use named groups in regexp...
r32848 ['"](?P<section>\S+)['"],\s*
Gregory Szorc
check-config: use compiled regexp...
r32847 # Second argument
Gregory Szorc
check-config: use named groups in regexp...
r32848 ['"](?P<option>\S+)['"](,\s+
(?:default=)?(?P<default>\S+?))?
Augie Fackler
formatting: blacken the codebase...
r43346 \)''',
re.VERBOSE | re.MULTILINE,
)
Gregory Szorc
check-config: use compiled regexp...
r32847
Augie Fackler
formatting: blacken the codebase...
r43346 configwithre = re.compile(
br'''
Gregory Szorc
check-config: look for ui.configwith...
r32849 ui\.config(?P<ctype>with)\(
# First argument is callback function. This doesn't parse robustly
# if it is e.g. a function call.
[^,]+,\s*
['"](?P<section>\S+)['"],\s*
['"](?P<option>\S+)['"](,\s+
(?:default=)?(?P<default>\S+?))?
Augie Fackler
formatting: blacken the codebase...
r43346 \)''',
re.VERBOSE | re.MULTILINE,
)
Gregory Szorc
check-config: look for ui.configwith...
r32849
Augie Fackler
formatting: blacken the codebase...
r43346 configpartialre = br"""ui\.config"""
Matt Mackall
check-config: add config option checker...
r25790
Augie Fackler
formatting: blacken the codebase...
r43346 ignorere = re.compile(
br'''
Gregory Szorc
check-config: syntax to allow inconsistent config values...
r33192 \#\s(?P<reason>internal|experimental|deprecated|developer|inconsistent)\s
config:\s(?P<config>\S+\.\S+)$
Augie Fackler
formatting: blacken the codebase...
r43346 ''',
re.VERBOSE | re.MULTILINE,
)
Gregory Szorc
check-config: syntax to allow inconsistent config values...
r33192
Augie Fackler
contrib: fix up output in check-config.py to use strs to avoid b prefixes...
r40295 if sys.version_info[0] > 2:
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
contrib: fix up output in check-config.py to use strs to avoid b prefixes...
r40295 def mkstr(b):
if isinstance(b, str):
return b
return b.decode('utf8')
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
contrib: fix up output in check-config.py to use strs to avoid b prefixes...
r40295 else:
mkstr = lambda x: x
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Mackall
check-config: add config option checker...
r25790 def main(args):
for f in args:
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 sect = b''
prevname = b''
confsect = b''
carryover = b''
Ryan McElroy
check-config: mention the file and line of the error...
r33571 linenum = 0
Pulkit Goyal
check-config: specify the mode 'rb' to open the file...
r35937 for l in open(f, 'rb'):
Ryan McElroy
check-config: mention the file and line of the error...
r33571 linenum += 1
Matt Mackall
check-config: add config option checker...
r25790
# check topic-like bits
Gregory Szorc
check-config: use raw strings for regular expressions...
r41682 m = re.match(br'\s*``(\S+)``', l)
Matt Mackall
check-config: add config option checker...
r25790 if m:
prevname = m.group(1)
Gregory Szorc
check-config: use raw strings for regular expressions...
r41682 if re.match(br'^\s*-+$', l):
Matt Mackall
check-config: add config option checker...
r25790 sect = prevname
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 prevname = b''
Matt Mackall
check-config: add config option checker...
r25790
if sect and prevname:
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 name = sect + b'.' + prevname
Matt Mackall
check-config: add config option checker...
r25790 documented[name] = 1
# check docstring bits
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 m = re.match(br'^\s+\[(\S+)\]', l)
Matt Mackall
check-config: add config option checker...
r25790 if m:
confsect = m.group(1)
continue
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 m = re.match(br'^\s+(?:#\s*)?(\S+) = ', l)
Matt Mackall
check-config: add config option checker...
r25790 if m:
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 name = confsect + b'.' + m.group(1)
Matt Mackall
check-config: add config option checker...
r25790 documented[name] = 1
# like the bugzilla extension
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 m = re.match(br'^\s*(\S+\.\S+)$', l)
Matt Mackall
check-config: add config option checker...
r25790 if m:
documented[m.group(1)] = 1
timeless
check-config: recognize convert style documentation
r27310 # like convert
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 m = re.match(br'^\s*:(\S+\.\S+):\s+', l)
timeless
check-config: recognize convert style documentation
r27310 if m:
documented[m.group(1)] = 1
Matt Mackall
check-config: add config option checker...
r25790 # quoted in help or docstrings
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 m = re.match(br'.*?``(\S+\.\S+)``', l)
Matt Mackall
check-config: add config option checker...
r25790 if m:
documented[m.group(1)] = 1
# look for ignore markers
Gregory Szorc
check-config: syntax to allow inconsistent config values...
r33192 m = ignorere.search(l)
Matt Mackall
check-config: add config option checker...
r25790 if m:
Augie Fackler
contrib: fix up output in check-config.py to use strs to avoid b prefixes...
r40295 if m.group('reason') == b'inconsistent':
Gregory Szorc
check-config: syntax to allow inconsistent config values...
r33192 allowinconsistent.add(m.group('config'))
else:
documented[m.group('config')] = 1
Matt Mackall
check-config: add config option checker...
r25790
# look for code-like bits
timeless
check-config: handle multiline config
r27313 line = carryover + l
Gregory Szorc
check-config: look for ui.configwith...
r32849 m = configre.search(line) or configwithre.search(line)
Matt Mackall
check-config: add config option checker...
r25790 if m:
Gregory Szorc
check-config: use named groups in regexp...
r32848 ctype = m.group('ctype')
Matt Mackall
check-config: add config option checker...
r25790 if not ctype:
ctype = 'str'
Matt Harbison
py3: byteify contrib/check-config.py...
r39744 name = m.group('section') + b"." + m.group('option')
Gregory Szorc
check-config: use named groups in regexp...
r32848 default = m.group('default')
Augie Fackler
contrib: fix up output in check-config.py to use strs to avoid b prefixes...
r40295 if default in (
Augie Fackler
formatting: blacken the codebase...
r43346 None,
b'False',
b'None',
b'0',
b'[]',
b'""',
b"''",
):
Matt Harbison
py3: byteify contrib/check-config.py...
r39744 default = b''
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 if re.match(b'[a-z.]+$', default):
Matt Harbison
py3: byteify contrib/check-config.py...
r39744 default = b'<variable>'
Augie Fackler
formatting: blacken the codebase...
r43346 if (
name in foundopts
and (ctype, default) != foundopts[name]
and name not in allowinconsistent
):
Augie Fackler
contrib: fix up output in check-config.py to use strs to avoid b prefixes...
r40295 print(mkstr(l.rstrip()))
fctype, fdefault = foundopts[name]
Augie Fackler
formatting: blacken the codebase...
r43346 print(
"conflict on %s: %r != %r"
% (
mkstr(name),
(mkstr(ctype), mkstr(default)),
(mkstr(fctype), mkstr(fdefault)),
)
)
Augie Fackler
contrib: fix up output in check-config.py to use strs to avoid b prefixes...
r40295 print("at %s:%d:" % (mkstr(f), linenum))
Matt Mackall
check-config: add config option checker...
r25790 foundopts[name] = (ctype, default)
Matt Harbison
py3: byteify contrib/check-config.py...
r39744 carryover = b''
timeless
check-config: handle multiline config
r27313 else:
m = re.search(configpartialre, line)
if m:
carryover = line
else:
Matt Harbison
py3: byteify contrib/check-config.py...
r39744 carryover = b''
Matt Mackall
check-config: add config option checker...
r25790
for name in sorted(foundopts):
if name not in documented:
Augie Fackler
formatting: blacken the codebase...
r43346 if not (
name.startswith(b"devel.")
or name.startswith(b"experimental.")
or name.startswith(b"debug.")
):
Matt Mackall
check-config: add config option checker...
r25790 ctype, default = foundopts[name]
if default:
Augie Fackler
contrib: fix up output in check-config.py to use strs to avoid b prefixes...
r40295 if isinstance(default, bytes):
default = mkstr(default)
Matt Mackall
check-config: add config option checker...
r25790 default = ' [%s]' % default
Augie Fackler
contrib: fix up output in check-config.py to use strs to avoid b prefixes...
r40295 elif isinstance(default, bytes):
default = mkstr(default)
Augie Fackler
formatting: blacken the codebase...
r43346 print(
"undocumented: %s (%s)%s"
% (mkstr(name), mkstr(ctype), default)
)
Matt Mackall
check-config: add config option checker...
r25790
if __name__ == "__main__":
FUJIWARA Katsunori
tests: execute check-config.py without xargs...
r27992 if len(sys.argv) > 1:
sys.exit(main(sys.argv[1:]))
else:
sys.exit(main([l.rstrip() for l in sys.stdin]))