tests/check-perf-code.py
author Arseniy Alekseyev <aalekseyev@janestreet.com>
Thu, 15 Feb 2024 15:21:43 +0000
branchstable
changeset 51388 cb5175edd225
parent 48875 6000f5b25c9b
permissions -rwxr-xr-x
cext: fix potential memory leaks of list items appended with PyList_Append Also reduce the duplication in the tricky code that uses PyList_Append by extracting it into a function `pylist_append_owned`.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45830
c102b704edb5 global: use python3 in shebangs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
     1
#!/usr/bin/env python3
29570
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
     2
#
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
     3
# check-perf-code - (historical) portability checker for contrib/perf.py
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
     4
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
     5
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
     6
import os
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
     7
import sys
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
     8
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
     9
# write static check patterns here
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    10
perfpypats = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    11
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    12
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    13
            r'(branchmap|repoview|repoviewutil)\.subsettable',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    14
            "use getbranchmapsubsettable() for early Mercurial",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    15
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    16
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    17
            r'\.(vfs|svfs|opener|sopener)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    18
            "use getvfs()/getsvfs() for early Mercurial",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    19
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    20
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    21
            r'ui\.configint',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    22
            "use getint() instead of ui.configint() for early Mercurial",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    23
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    24
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    25
    # warnings
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    26
    [],
29570
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    27
]
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    28
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    29
29571
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    30
def modulewhitelist(names):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    31
    replacement = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    32
        ('.py', ''),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    33
        ('.c', ''),  # trim suffix
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    34
        ('mercurial%s' % '/', ''),  # trim "mercurial/" path
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    35
    ]
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 30149
diff changeset
    36
    ignored = {'__init__'}
29571
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    37
    modules = {}
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    38
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    39
    # convert from file name to module name, and count # of appearances
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    40
    for name in names:
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    41
        name = name.strip()
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    42
        for old, new in replacement:
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    43
            name = name.replace(old, new)
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    44
        if name not in ignored:
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    45
            modules[name] = modules.get(name, 0) + 1
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    46
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    47
    # list up module names, which appear multiple times
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    48
    whitelist = []
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    49
    for name, count in modules.items():
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    50
        if count > 1:
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    51
            whitelist.append(name)
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    52
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    53
    return whitelist
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    54
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    55
29570
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    56
if __name__ == "__main__":
29571
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    57
    # in this case, it is assumed that result of "hg files" at
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    58
    # multiple revisions is given via stdin
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    59
    whitelist = modulewhitelist(sys.stdin)
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    60
    assert whitelist, "module whitelist is empty"
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    61
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    62
    # build up module whitelist check from file names given at runtime
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    63
    perfpypats[0].append(
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    64
        # this matching pattern assumes importing modules from
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    65
        # "mercurial" package in the current style below, for simplicity
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    66
        #
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    67
        #    from mercurial import (
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    68
        #        foo,
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    69
        #        bar,
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    70
        #        baz
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    71
        #    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    72
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    73
            (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    74
                r'from mercurial import [(][a-z0-9, \n#]*\n(?! *%s,|^[ #]*\n|[)])'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    75
                % ',| *'.join(whitelist)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    76
            ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    77
            "import newer module separately in try clause for early Mercurial",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    78
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    79
    )
29571
d1a7d9c279bb tests: check importing modules in perf.py for historical portability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29570
diff changeset
    80
29570
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    81
    # import contrib/check-code.py as checkcode
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    82
    assert 'RUNTESTDIR' in os.environ, "use check-perf-code.py in *.t script"
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    83
    contribpath = os.path.join(os.environ['RUNTESTDIR'], '..', 'contrib')
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    84
    sys.path.insert(0, contribpath)
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    85
    checkcode = __import__('check-code')
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    86
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    87
    # register perf.py specific entry with "checks" in check-code.py
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    88
    checkcode.checks.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    89
        ('perf.py', r'contrib/perf.py$', '', checkcode.pyfilters, perfpypats)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42138
diff changeset
    90
    )
29570
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    91
cbd240188e4e tests: introduce check-perf-code.py to add extra checks on perf.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
diff changeset
    92
    sys.exit(checkcode.main())