check-perf-code.py
79 lines
| 2.5 KiB
| text/x-python
|
PythonLexer
/ tests / check-perf-code.py
FUJIWARA Katsunori
|
r29570 | #!/usr/bin/env python | ||
# | ||||
# check-perf-code - (historical) portability checker for contrib/perf.py | ||||
from __future__ import absolute_import | ||||
import os | ||||
import sys | ||||
# write static check patterns here | ||||
perfpypats = [ | ||||
[ | ||||
FUJIWARA Katsunori
|
r30144 | (r'(branchmap|repoview)\.subsettable', | ||
"use getbranchmapsubsettable() for early Mercurial"), | ||||
FUJIWARA Katsunori
|
r30146 | (r'\.(vfs|svfs|opener|sopener)', | ||
"use getvfs()/getsvfs() for early Mercurial"), | ||||
FUJIWARA Katsunori
|
r30149 | (r'ui\.configint', | ||
"use getint() instead of ui.configint() for early Mercurial"), | ||||
FUJIWARA Katsunori
|
r29570 | ], | ||
# warnings | ||||
[ | ||||
] | ||||
] | ||||
FUJIWARA Katsunori
|
r29571 | def modulewhitelist(names): | ||
replacement = [('.py', ''), ('.c', ''), # trim suffix | ||||
('mercurial%s' % (os.sep), ''), # trim "mercurial/" path | ||||
] | ||||
Martin von Zweigbergk
|
r32291 | ignored = {'__init__'} | ||
FUJIWARA Katsunori
|
r29571 | modules = {} | ||
# convert from file name to module name, and count # of appearances | ||||
for name in names: | ||||
name = name.strip() | ||||
for old, new in replacement: | ||||
name = name.replace(old, new) | ||||
if name not in ignored: | ||||
modules[name] = modules.get(name, 0) + 1 | ||||
# list up module names, which appear multiple times | ||||
whitelist = [] | ||||
for name, count in modules.items(): | ||||
if count > 1: | ||||
whitelist.append(name) | ||||
return whitelist | ||||
FUJIWARA Katsunori
|
r29570 | if __name__ == "__main__": | ||
FUJIWARA Katsunori
|
r29571 | # in this case, it is assumed that result of "hg files" at | ||
# multiple revisions is given via stdin | ||||
whitelist = modulewhitelist(sys.stdin) | ||||
assert whitelist, "module whitelist is empty" | ||||
# build up module whitelist check from file names given at runtime | ||||
perfpypats[0].append( | ||||
# this matching pattern assumes importing modules from | ||||
# "mercurial" package in the current style below, for simplicity | ||||
# | ||||
# from mercurial import ( | ||||
# foo, | ||||
# bar, | ||||
# baz | ||||
# ) | ||||
((r'from mercurial import [(][a-z0-9, \n#]*\n(?! *%s,|^[ #]*\n|[)])' | ||||
% ',| *'.join(whitelist)), | ||||
"import newer module separately in try clause for early Mercurial" | ||||
)) | ||||
FUJIWARA Katsunori
|
r29570 | # import contrib/check-code.py as checkcode | ||
assert 'RUNTESTDIR' in os.environ, "use check-perf-code.py in *.t script" | ||||
contribpath = os.path.join(os.environ['RUNTESTDIR'], '..', 'contrib') | ||||
sys.path.insert(0, contribpath) | ||||
checkcode = __import__('check-code') | ||||
# register perf.py specific entry with "checks" in check-code.py | ||||
checkcode.checks.append(('perf.py', r'contrib/perf.py$', '', | ||||
checkcode.pyfilters, perfpypats)) | ||||
sys.exit(checkcode.main()) | ||||