##// END OF EJS Templates
sidedatacopies: only fetch information once for merge...
sidedatacopies: only fetch information once for merge Before this change, merge would result in reading the data from revlog twice. With this change, we keep the information in memory until we encounter the other parent. When looking at pypy, I see about 1/3 of the changesets with copy information being merge. Not doing duplicated fetch for them provide a significant speedup. revision: large amount; added files: large amount; rename small amount; c3b14617fbd7 9ba6ab77fd29 before: ! wall 0.767042 comb 0.760000 user 0.750000 sys 0.010000 (median of 11) after: ! wall 0.671162 comb 0.670000 user 0.650000 sys 0.020000 (median of 13) revision: large amount; added files: small amount; rename small amount; c3b14617fbd7 f650a9b140d2 before: ! wall 1.170169 comb 1.170000 user 1.130000 sys 0.040000 (median of 10) after: ! wall 1.030596 comb 1.040000 user 1.010000 sys 0.030000 (median of 10) revision: large amount; added files: large amount; rename large amount; 08ea3258278e d9fa043f30c0 before: ! wall 0.209846 comb 0.200000 user 0.200000 sys 0.000000 (median of 46) after: ! wall 0.170981 comb 0.170000 user 0.170000 sys 0.000000 (median of 56) revision: small amount; added files: large amount; rename large amount; df6f7a526b60 a83dc6a2d56f before: ! wall 0.013248 comb 0.010000 user 0.010000 sys 0.000000 (median of 223) after: ! wall 0.013295 comb 0.020000 user 0.020000 sys 0.000000 (median of 222) revision: small amount; added files: large amount; rename small amount; 4aa4e1f8e19a 169138063d63 before: ! wall 0.001672 comb 0.000000 user 0.000000 sys 0.000000 (median of 1000) after: ! wall 0.001666 comb 0.000000 user 0.000000 sys 0.000000 (median of 1000) revision: small amount; added files: small amount; rename small amount; 4bc173b045a6 964879152e2e before: ! wall 0.000119 comb 0.000000 user 0.000000 sys 0.000000 (median of 8010) after: ! wall 0.000119 comb 0.000000 user 0.000000 sys 0.000000 (median of 8007) revision: medium amount; added files: large amount; rename medium amount; c95f1ced15f2 2c68e87c3efe before: ! wall 0.168599 comb 0.160000 user 0.160000 sys 0.000000 (median of 58) after: ! wall 0.133316 comb 0.140000 user 0.140000 sys 0.000000 (median of 73) revision: medium amount; added files: medium amount; rename small amount; d343da0c55a8 d7746d32bf9d before: ! wall 0.036052 comb 0.030000 user 0.030000 sys 0.000000 (median of 100) after: ! wall 0.032558 comb 0.030000 user 0.030000 sys 0.000000 (median of 100) Differential Revision: https://phab.mercurial-scm.org/D7127

File last commit:

r43346:2372284d default
r43595:90213d02 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]))