diff --git a/tests/check-perf-code.py b/tests/check-perf-code.py --- a/tests/check-perf-code.py +++ b/tests/check-perf-code.py @@ -16,7 +16,50 @@ perfpypats = [ ] ] +def modulewhitelist(names): + replacement = [('.py', ''), ('.c', ''), # trim suffix + ('mercurial%s' % (os.sep), ''), # trim "mercurial/" path + ] + ignored = set(['__init__']) + 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 + if __name__ == "__main__": + # 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" + )) + # 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') diff --git a/tests/test-contrib-perf.t b/tests/test-contrib-perf.t --- a/tests/test-contrib-perf.t +++ b/tests/test-contrib-perf.t @@ -152,4 +152,6 @@ Check perf.py for historical portability $ cd "$TESTDIR/.." - $ "$TESTDIR"/check-perf-code.py contrib/perf.py + $ (hg files -r 1.2 glob:mercurial/*.c glob:mercurial/*.py; + > hg files -r tip glob:mercurial/*.c glob:mercurial/*.py) | + > "$TESTDIR"/check-perf-code.py contrib/perf.py