Mercurial > hg
view contrib/check-config.py @ 26011:ce77436162a5
changelog: trust C implementation of reachableroots more
There are no remaining codepaths in reachableroots where it will
return None, so just trust it completely and simplify this method.
Result by revset
================
Revision:
0) Revision 1c75249e159b: style: adjust whitespaces in webutil.py
1) Revision d1d91b8090c6: changelog: trust C implementation of reachableroots more
revset #0: 0::tip
plain
0) 0.067684
1) 0.006622 9%
revset #1: 0::@
plain
0) 0.068249
1) 0.009394 13%
IOW this is a 10x speedup in my repo for hg itself for 0::tip and
similar revsets now that the C code is correctly wired up.
author | Augie Fackler <augie@google.com> |
---|---|
date | Tue, 11 Aug 2015 15:06:02 -0400 |
parents | d1cb185b9ee2 |
children | 9c98fe1416c2 |
line wrap: on
line source
#!/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. import re import sys foundopts = {} documented = {} configre = (r"""ui\.config(|int|bool|list)\(['"](\S+)['"], ?""" r"""['"](\S+)['"](,\s(?:default=)?(\S+?))?\)""") def main(args): for f in args: sect = '' prevname = '' confsect = '' for l in open(f): # check topic-like bits m = re.match('\s*``(\S+)``', l) if m: prevname = m.group(1) if re.match('^\s*-+$', l): sect = prevname prevname = '' if sect and prevname: name = sect + '.' + prevname documented[name] = 1 # check docstring bits m = re.match(r'^\s+\[(\S+)\]', l) if m: confsect = m.group(1) continue m = re.match(r'^\s+(?:#\s*)?([a-z._]+) = ', l) if m: name = confsect + '.' + m.group(1) documented[name] = 1 # like the bugzilla extension m = re.match(r'^\s*([a-z]+\.[a-z]+)$', l) if m: documented[m.group(1)] = 1 # quoted in help or docstrings m = re.match(r'.*?``([-a-z_]+\.[-a-z_]+)``', l) if m: documented[m.group(1)] = 1 # look for ignore markers m = re.search(r'# (?:internal|experimental|deprecated|developer)' ' config: (\S+.\S+)$', l) if m: documented[m.group(1)] = 1 # look for code-like bits m = re.search(configre, l) if m: ctype = m.group(1) if not ctype: ctype = 'str' name = m.group(2) + "." + m.group(3) default = m.group(5) if default in (None, 'False', 'None', '0', '[]', '""', "''"): default = '' if re.match('[a-z.]+$', default): default = '<variable>' if name in foundopts and (ctype, default) != foundopts[name]: print l print "conflict on %s: %r != %r" % (name, (ctype, default), foundopts[name]) foundopts[name] = (ctype, default) 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 print "undocumented: %s (%s)%s" % (name, ctype, default) if __name__ == "__main__": sys.exit(main(sys.argv[1:]))