##// END OF EJS Templates
revlog: extract function for getting node from known-to-exist rev...
revlog: extract function for getting node from known-to-exist rev Many of the calls to index_node() (which converts a rev to a nodeid) are done with a rev that's know to exist. If the function fails, there's something really wrong and we should just abort. This was done in only one place. This patch starts by extracting that code to a function that we can reuse in later patches. Differential Revision: https://phab.mercurial-scm.org/D3456

File last commit:

r35938:2912bed9 default
r37877:a91f31a1 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'
Gregory Szorc
check-config: use named groups in regexp...
r32848 name = m.group('section') + "." + m.group('option')
default = m.group('default')
Matt Mackall
check-config: add config option checker...
r25790 if default in (None, 'False', 'None', '0', '[]', '""', "''"):
default = ''
Pulkit Goyal
py3: add b'' to literals in check-config.py...
r35938 if re.match(b'[a-z.]+$', default):
Matt Mackall
check-config: add config option checker...
r25790 default = '<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)
timeless
check-config: handle multiline config
r27313 carryover = ''
else:
m = re.search(configpartialre, line)
if m:
carryover = line
else:
carryover = ''
Matt Mackall
check-config: add config option checker...
r25790
for name in sorted(foundopts):
if name not in documented:
if not (name.startswith("devel.") or
name.startswith("experimental.") or
name.startswith("debug.")):
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]))