##// END OF EJS Templates
log: have changesetformatter fill in wdir() rev and node (BC)...
log: have changesetformatter fill in wdir() rev and node (BC) This matches the behavior of the default template keywords. wdir() support is still experimental so we can change the output.

File last commit:

r39744:fe28267d default
r39831:ba93db17 default
Show More
check-config.py
142 lines | 4.6 KiB | text/x-python | PythonLexer
Matt Mackall
check-config: add config option checker...
r25790 #!/usr/bin/env python
#
# check-config - a config flag documentation checker for Mercurial
#
# Copyright 2015 Matt Mackall <mpm@selenic.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
Pulkit Goyal
check-config: use absolute_import and print_function
r28352 from __future__ import absolute_import, print_function
Matt Mackall
check-config: add config option checker...
r25790 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
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 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+?))?
Gregory Szorc
check-config: use compiled regexp...
r32847 \)''', re.VERBOSE | re.MULTILINE)
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 configwithre = re.compile(b'''
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+?))?
\)''', re.VERBOSE | re.MULTILINE)
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 configpartialre = (br"""ui\.config""")
Matt Mackall
check-config: add config option checker...
r25790
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 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+)$
''', re.VERBOSE | re.MULTILINE)
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
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 m = re.match(b'\s*``(\S+)``', l)
Matt Mackall
check-config: add config option checker...
r25790 if m:
prevname = m.group(1)
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 if re.match(b'^\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:
Gregory Szorc
check-config: syntax to allow inconsistent config values...
r33192 if m.group('reason') == 'inconsistent':
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')
Matt Mackall
check-config: add config option checker...
r25790 if default in (None, 'False', 'None', '0', '[]', '""', "''"):
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>'
Gregory Szorc
check-config: syntax to allow inconsistent config values...
r33192 if (name in foundopts and (ctype, default) != foundopts[name]
and name not in allowinconsistent):
Ryan McElroy
check-config: mention the file and line of the error...
r33571 print(l.rstrip())
Pulkit Goyal
check-config: use absolute_import and print_function
r28352 print("conflict on %s: %r != %r" % (name, (ctype, default),
foundopts[name]))
Ryan McElroy
check-config: mention the file and line of the error...
r33571 print("at %s:%d:" % (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:
Matt Harbison
py3: byteify contrib/check-config.py...
r39744 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:
default = ' [%s]' % default
Pulkit Goyal
check-config: use absolute_import and print_function
r28352 print("undocumented: %s (%s)%s" % (name, 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]))