##// END OF EJS Templates
formatting: remove the data-ogre from the config example...
formatting: remove the data-ogre from the config example Without he final `-`, black ignore the stdin and just looks at file provided as command line argument. Since `hg fix` feeds the file content through stdin and does not pass file argument, this meant black happily exited successful (all files passed as argument were formatted) without any output. Fix picked this "no output" as the new file content, deleting all previous content. I appreciate the fact this effectively removed all buggy code in any files processing that way, but this also ate all my data. The example config is now fixed in that regards.

File last commit:

r43346:2372284d default
r43362:0b75457d default
Show More
check-config.py
191 lines | 5.5 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
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]))