view contrib/check-py3-compat.py @ 27394:b4d7743e174a

run-tests: add more scheduling weight hints The scheduler would like to order test execution by expected run-time, but doesn't know much about how long a test will run. It thus uses test size as a proxy for run-time. By tweaking these weights we can keep CPUs more evenly busy and thus finish sooner. In particular, this change pushes the three currently longest-running tests closer to the beginning: test-largefiles-update.t test-run-tests.t test-gendoc.t As the largefiles test is currently the long pole of the test suite with higher -j factors, the sooner it's started, the sooner the tests can end. We also up the weight on some shorter but long-running tests that could have previously delayed completion with low -j factors by running very close to the end.
author Matt Mackall <mpm@selenic.com>
date Fri, 04 Dec 2015 17:05:20 -0600
parents 35e69407b1ac
children ae522fb493d4
line wrap: on
line source

#!/usr/bin/env python
#
# check-py3-compat - check Python 3 compatibility of Mercurial files
#
# Copyright 2015 Gregory Szorc <gregory.szorc@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.

from __future__ import absolute_import, print_function

import ast
import sys

def check_compat(f):
    """Check Python 3 compatibility for a file."""
    with open(f, 'rb') as fh:
        content = fh.read()

    # Ignore empty files.
    if not content.strip():
        return

    root = ast.parse(content)
    futures = set()
    haveprint = False
    for node in ast.walk(root):
        if isinstance(node, ast.ImportFrom):
            if node.module == '__future__':
                futures |= set(n.name for n in node.names)
        elif isinstance(node, ast.Print):
            haveprint = True

    if 'absolute_import' not in futures:
        print('%s not using absolute_import' % f)
    if haveprint and 'print_function' not in futures:
        print('%s requires print_function' % f)

if __name__ == '__main__':
    for f in sys.argv[1:]:
        check_compat(f)

    sys.exit(0)