contrib/check-code.py
author Manuel Jacob <me@manueljacob.de>
Thu, 15 Sep 2022 01:48:38 +0200
changeset 49494 c96ed4029fda
parent 48946 642e31cb55f0
child 49570 3a2b6158374a
permissions -rwxr-xr-x
templates: add filter to reverse list The filter supports only lists because for lists, it’s straightforward to implement. Reversing text doesn’t seem very useful and is hard to implement. Reversing the bytes would break multi-bytes encodings. Reversing the code points would break characters consisting of multiple code points. Reversing graphemes is non-trivial without using a library not included in the standard library.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45830
c102b704edb5 global: use python3 in shebangs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43503
diff changeset
     1
#!/usr/bin/env python3
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     2
#
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     3
# check-code - a style and portability checker for Mercurial
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     4
#
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 45942
diff changeset
     5
# Copyright 2010 Olivia Mackall <olivia@selenic.com>
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     6
#
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     7
# This software may be used and distributed according to the terms of the
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     8
# GNU General Public License version 2 or any later version.
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     9
20241
8071b4eddefa check-code: explain what to do when a check-code rule mismatches
Simon Heimberg <simohe@besonet.ch>
parents: 20239
diff changeset
    10
"""style and portability checker for Mercurial
8071b4eddefa check-code: explain what to do when a check-code rule mismatches
Simon Heimberg <simohe@besonet.ch>
parents: 20239
diff changeset
    11
8071b4eddefa check-code: explain what to do when a check-code rule mismatches
Simon Heimberg <simohe@besonet.ch>
parents: 20239
diff changeset
    12
when a rule triggers wrong, do one of the following (prefer one from top):
8071b4eddefa check-code: explain what to do when a check-code rule mismatches
Simon Heimberg <simohe@besonet.ch>
parents: 20239
diff changeset
    13
 * do the work-around the rule suggests
8071b4eddefa check-code: explain what to do when a check-code rule mismatches
Simon Heimberg <simohe@besonet.ch>
parents: 20239
diff changeset
    14
 * doublecheck that it is a false match
8071b4eddefa check-code: explain what to do when a check-code rule mismatches
Simon Heimberg <simohe@besonet.ch>
parents: 20239
diff changeset
    15
 * improve the rule pattern
8071b4eddefa check-code: explain what to do when a check-code rule mismatches
Simon Heimberg <simohe@besonet.ch>
parents: 20239
diff changeset
    16
 * add an ignore pattern to the rule (3rd arg) which matches your good line
28700
35ad5bcdeb7e py24: remove check-code py24 notation
timeless <timeless@mozdev.org>
parents: 28595
diff changeset
    17
   (you can append a short comment and match this, like: #re-raises)
20241
8071b4eddefa check-code: explain what to do when a check-code rule mismatches
Simon Heimberg <simohe@besonet.ch>
parents: 20239
diff changeset
    18
 * change the pattern to a warning and list the exception in test-check-code-hg
8071b4eddefa check-code: explain what to do when a check-code rule mismatches
Simon Heimberg <simohe@besonet.ch>
parents: 20239
diff changeset
    19
 * ONLY use no--check-code for skipping entire files from external sources
8071b4eddefa check-code: explain what to do when a check-code rule mismatches
Simon Heimberg <simohe@besonet.ch>
parents: 20239
diff changeset
    20
"""
8071b4eddefa check-code: explain what to do when a check-code rule mismatches
Simon Heimberg <simohe@besonet.ch>
parents: 20239
diff changeset
    21
28509
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
    22
import glob
13074
637627f31c74 check-code: check for gratuitous whitespace after Python keywords
Thomas Arendsen Hein <thomas@jtah.de>
parents: 13031
diff changeset
    23
import keyword
10895
217557b26bc7 check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents: 10814
diff changeset
    24
import optparse
28509
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
    25
import os
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
    26
import re
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
    27
import sys
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    28
29145
c641b8dfb98c check-code: handle py3 open divergence
timeless <timeless@mozdev.org>
parents: 29144
diff changeset
    29
if sys.version_info[0] < 3:
c641b8dfb98c check-code: handle py3 open divergence
timeless <timeless@mozdev.org>
parents: 29144
diff changeset
    30
    opentext = open
c641b8dfb98c check-code: handle py3 open divergence
timeless <timeless@mozdev.org>
parents: 29144
diff changeset
    31
else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    32
29145
c641b8dfb98c check-code: handle py3 open divergence
timeless <timeless@mozdev.org>
parents: 29144
diff changeset
    33
    def opentext(f):
39056
c52a8af4052a contrib: have check-code look at files in latin1 instead of ascii
Augie Fackler <augie@google.com>
parents: 38784
diff changeset
    34
        return open(f, encoding='latin1')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    35
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    36
19310
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    37
try:
29143
8ed693ec5398 check-code: handle range/xrange divergence
timeless <timeless@mozdev.org>
parents: 29142
diff changeset
    38
    xrange
8ed693ec5398 check-code: handle range/xrange divergence
timeless <timeless@mozdev.org>
parents: 29142
diff changeset
    39
except NameError:
8ed693ec5398 check-code: handle range/xrange divergence
timeless <timeless@mozdev.org>
parents: 29142
diff changeset
    40
    xrange = range
8ed693ec5398 check-code: handle range/xrange divergence
timeless <timeless@mozdev.org>
parents: 29142
diff changeset
    41
try:
19310
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    42
    import re2
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    43
except ImportError:
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    44
    re2 = None
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    45
41826
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
    46
import testparseutil
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
    47
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    48
19310
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    49
def compilere(pat, multiline=False):
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    50
    if multiline:
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    51
        pat = '(?m)' + pat
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    52
    if re2:
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    53
        try:
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    54
            return re2.compile(pat)
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    55
        except re2.error:
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    56
            pass
30ea54660d14 check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents: 19309
diff changeset
    57
    return re.compile(pat)
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    58
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    59
29398
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    60
# check "rules depending on implementation of repquote()" in each
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    61
# patterns (especially pypats), before changing around repquote()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    62
_repquotefixedmap = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    63
    ' ': ' ',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    64
    '\n': '\n',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    65
    '.': 'p',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    66
    ':': 'q',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    67
    '%': '%',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    68
    '\\': 'b',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    69
    '*': 'A',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    70
    '+': 'P',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    71
    '-': 'M',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    72
}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    73
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    74
29398
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    75
def _repquoteencodechr(i):
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    76
    if i > 255:
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    77
        return 'u'
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    78
    c = chr(i)
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    79
    if c in _repquotefixedmap:
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    80
        return _repquotefixedmap[c]
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    81
    if c.isalpha():
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    82
        return 'x'
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    83
    if c.isdigit():
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    84
        return 'n'
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    85
    return 'o'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    86
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    87
29398
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    88
_repquotett = ''.join(_repquoteencodechr(i) for i in xrange(256))
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    89
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    90
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    91
def repquote(m):
19999
169cb9e47f8e check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents: 19998
diff changeset
    92
    t = m.group('text')
29398
2a54cf92c773 check-code: build translation table for repquote in global for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29397
diff changeset
    93
    t = t.translate(_repquotett)
10722
c4fb2103e734 check-code: improve quote detection regexp, add tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10720
diff changeset
    94
    return m.group('quote') + t + m.group('quote')
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    95
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
    96
10727
62b8f15683f2 check-code: more tests and more robust python filtering
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10723
diff changeset
    97
def reppython(m):
62b8f15683f2 check-code: more tests and more robust python filtering
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10723
diff changeset
    98
    comment = m.group('comment')
62b8f15683f2 check-code: more tests and more robust python filtering
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10723
diff changeset
    99
    if comment:
18959
2f6418d8a4c9 check-code: catch trailing space in comments
Mads Kiilerich <madski@unity3d.com>
parents: 18835
diff changeset
   100
        l = len(comment.rstrip())
2f6418d8a4c9 check-code: catch trailing space in comments
Mads Kiilerich <madski@unity3d.com>
parents: 18835
diff changeset
   101
        return "#" * l + comment[l:]
10727
62b8f15683f2 check-code: more tests and more robust python filtering
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10723
diff changeset
   102
    return repquote(m)
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   103
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   104
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   105
def repcomment(m):
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   106
    return m.group(1) + "#" * len(m.group(2))
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   107
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   108
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   109
def repccomment(m):
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   110
    t = re.sub(r"((?<=\n) )|\S", "x", m.group(2))
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   111
    return m.group(1) + t + "*/"
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   112
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   113
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   114
def repcallspaces(m):
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   115
    t = re.sub(r"\n\s+", "\n", m.group(2))
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   116
    return m.group(1) + t
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   117
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   118
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   119
def repinclude(m):
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   120
    return m.group(1) + "<foo>"
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   121
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   122
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   123
def rephere(m):
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   124
    t = re.sub(r"\S", "x", m.group(2))
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   125
    return m.group(1) + t
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   126
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   127
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   128
testpats = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   129
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   130
        (r'\b(push|pop)d\b', "don't use 'pushd' or 'popd', use 'cd'"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   131
        (r'\W\$?\(\([^\)\n]*\)\)', "don't use (()) or $(()), use 'expr'"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   132
        (r'grep.*-q', "don't use 'grep -q', redirect to /dev/null"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   133
        (r'(?<!hg )grep.* -a', "don't use 'grep -a', use in-line python"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   134
        (r'sed.*-i', "don't use 'sed -i', use a temporary file"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   135
        (r'\becho\b.*\\n', "don't use 'echo \\n', use printf"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   136
        (r'echo -n', "don't use 'echo -n', use printf"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   137
        (r'(^|\|\s*)\bwc\b[^|]*$\n(?!.*\(re\))', "filter wc output"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   138
        (r'head -c', "don't use 'head -c', use 'dd'"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   139
        (r'tail -n', "don't use the '-n' option to tail, just use '-<num>'"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   140
        (r'sha1sum', "don't use sha1sum, use $TESTDIR/md5sum.py"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   141
        (r'\bls\b.*-\w*R', "don't use 'ls -R', use 'find'"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   142
        (r'printf.*[^\\]\\([1-9]|0\d)', r"don't use 'printf \NNN', use Python"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   143
        (r'printf.*[^\\]\\x', "don't use printf \\x, use Python"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   144
        (r'rm -rf \*', "don't use naked rm -rf, target a directory"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   145
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   146
            r'\[[^\]]+==',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   147
            '[ foo == bar ] is a bashism, use [ foo = bar ] instead',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   148
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   149
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   150
            r'(^|\|\s*)grep (-\w\s+)*[^|]*[(|]\w',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   151
            "use egrep for extended grep syntax",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   152
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   153
        (r'(^|\|\s*)e?grep .*\\S', "don't use \\S in regular expression"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   154
        (r'(?<!!)/bin/', "don't use explicit paths for tools"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   155
        (r'#!.*/bash', "don't use bash in shebang, use sh"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   156
        (r'[^\n]\Z', "no trailing newline"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   157
        (r'export .*=', "don't export and assign at once"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   158
        (r'^source\b', "don't use 'source', use '.'"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   159
        (r'touch -d', "don't use 'touch -d', use 'touch -t' instead"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   160
        (r'\bls +[^|\n-]+ +-', "options to 'ls' must come before filenames"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   161
        (r'[^>\n]>\s*\$HGRCPATH', "don't overwrite $HGRCPATH, append to it"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   162
        (r'^stop\(\)', "don't use 'stop' as a shell function name"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   163
        (r'(\[|\btest\b).*-e ', "don't use 'test -e', use 'test -f'"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   164
        (r'\[\[\s+[^\]]*\]\]', "don't use '[[ ]]', use '[ ]'"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   165
        (r'^alias\b.*=', "don't use alias, use a function"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   166
        (r'if\s*!', "don't use '!' to negate exit status"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   167
        (r'/dev/u?random', "don't use entropy, use /dev/zero"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   168
        (r'do\s*true;\s*done', "don't use true as loop body, use sleep 0"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   169
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   170
            r'sed (-e )?\'(\d+|/[^/]*/)i(?!\\\n)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   171
            "put a backslash-escaped newline after sed 'i' command",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   172
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   173
        (r'^diff *-\w*[uU].*$\n(^  \$ |^$)', "prefix diff -u/-U with cmp"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   174
        (r'^\s+(if)? diff *-\w*[uU]', "prefix diff -u/-U with cmp"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   175
        (r'[\s="`\']python\s(?!bindings)', "don't use 'python', use '$PYTHON'"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   176
        (r'seq ', "don't use 'seq', use $TESTDIR/seq.py"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   177
        (r'\butil\.Abort\b', "directly use error.Abort"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   178
        (r'\|&', "don't use |&, use 2>&1"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   179
        (r'\w =  +\w', "only one space after = allowed"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   180
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   181
            r'\bsed\b.*[^\\]\\n',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   182
            "don't use 'sed ... \\n', use a \\ and a newline",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   183
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   184
        (r'env.*-u', "don't use 'env -u VAR', use 'unset VAR'"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   185
        (r'cp.* -r ', "don't use 'cp -r', use 'cp -R'"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   186
        (r'grep.* -[ABC]', "don't use grep's context flags"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   187
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   188
            r'find.*-printf',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   189
            "don't use 'find -printf', it doesn't exist on BSD find(1)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   190
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   191
        (r'\$RANDOM ', "don't use bash-only $RANDOM to generate random values"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   192
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   193
    # warnings
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   194
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   195
        (r'^function', "don't use 'function', use old style"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   196
        (r'^diff.*-\w*N', "don't use 'diff -N'"),
47979
b84fe613de33 check-code: make it possible to ignore the PWD check in some situation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47856
diff changeset
   197
        (r'\$PWD|\${PWD}', "don't use $PWD, use `pwd`", "no-pwd-check"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   198
        (r'^([^"\'\n]|("[^"\n]*")|(\'[^\'\n]*\'))*\^', "^ must be quoted"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   199
        (r'kill (`|\$\()', "don't use kill, use killdaemons.py"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   200
    ],
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   201
]
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   202
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   203
testfilters = [
34060
e267d4ee4f2d check-code: forbid using bash in shebang
Jun Wu <quark@fb.com>
parents: 33369
diff changeset
   204
    (r"( *)(#([^!][^\n]*\S)?)", repcomment),
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   205
    (r"<<(\S+)((.|\n)*?\n\1)", rephere),
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   206
]
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   207
15372
695ac6aca77f check-code: fix issues with finding patterns in unified tests, fix tests
Matt Mackall <mpm@selenic.com>
parents: 15364
diff changeset
   208
uprefix = r"^  \$ "
12364
e128fa4615f2 check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11886
diff changeset
   209
utestpats = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   210
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   211
        (r'^(\S.*||  [$>] \S.*)[ \t]\n', "trailing whitespace on non-output"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   212
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   213
            uprefix + r'.*\|\s*sed[^|>\n]*\n',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   214
            "use regex test output patterns instead of sed",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   215
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   216
        (uprefix + r'(true|exit 0)', "explicit zero exit unnecessary"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   217
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   218
            uprefix + r'.*\|\| echo.*(fail|error)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   219
            "explicit exit code checks unnecessary",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   220
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   221
        (uprefix + r'set -e', "don't use set -e"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   222
        (uprefix + r'(\s|fi\b|done\b)', "use > for continued lines"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   223
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   224
            uprefix + r'.*:\.\S*/',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   225
            "x:.y in a path does not work on msys, rewrite "
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   226
            "as x://.y, or see `hg log -k msys` for alternatives",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   227
            r'-\S+:\.|' '# no-msys',  # -Rxxx
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   228
        ),  # in test-pull.t which is skipped on windows
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   229
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   230
            r'^  [^$>].*27\.0\.0\.1',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   231
            'use $LOCALIP not an explicit loopback address',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   232
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   233
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   234
            r'^  (?![>$] ).*\$LOCALIP.*[^)]$',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   235
            'mark $LOCALIP output lines with (glob) to help tests in BSD jails',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   236
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   237
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   238
            r'^  (cat|find): .*: \$ENOENT\$',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   239
            'use test -f to test for file existence',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   240
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   241
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   242
            r'^  diff -[^ -]*p',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   243
            "don't use (external) diff with -p for portability",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   244
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   245
        (r' readlink ', 'use readlink.py instead of readlink'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   246
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   247
            r'^  [-+][-+][-+] .* [-+]0000 \(glob\)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   248
            "glob timezone field in diff output for portability",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   249
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   250
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   251
            r'^  @@ -[0-9]+ [+][0-9]+,[0-9]+ @@',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   252
            "use '@@ -N* +N,n @@ (glob)' style chunk header for portability",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   253
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   254
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   255
            r'^  @@ -[0-9]+,[0-9]+ [+][0-9]+ @@',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   256
            "use '@@ -N,n +N* @@ (glob)' style chunk header for portability",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   257
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   258
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   259
            r'^  @@ -[0-9]+ [+][0-9]+ @@',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   260
            "use '@@ -N* +N* @@ (glob)' style chunk header for portability",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   261
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   262
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   263
            uprefix + r'hg( +-[^ ]+( +[^ ]+)?)* +extdiff'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   264
            r'( +(-[^ po-]+|--(?!program|option)[^ ]+|[^-][^ ]*))*$',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   265
            "use $RUNTESTDIR/pdiff via extdiff (or -o/-p for false-positives)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   266
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   267
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   268
    # warnings
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   269
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   270
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   271
            r'^  (?!.*\$LOCALIP)[^*?/\n]* \(glob\)$',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   272
            "glob match with no glob string (?, *, /, and $LOCALIP)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   273
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   274
    ],
12364
e128fa4615f2 check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11886
diff changeset
   275
]
e128fa4615f2 check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11886
diff changeset
   276
35315
e223c0438f89 check-code: allow tabs in heredoc
Yuya Nishihara <yuya@tcha.org>
parents: 35251
diff changeset
   277
# transform plain test rules to unified test's
14203
b230922eb0c3 check-code: fix checking for sh style in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 14169
diff changeset
   278
for i in [0, 1]:
22101
6fa40bd78bc8 check-code: allow an escape pattern to be specified for testpattern
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22100
diff changeset
   279
    for tp in testpats[i]:
6fa40bd78bc8 check-code: allow an escape pattern to be specified for testpattern
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22100
diff changeset
   280
        p = tp[0]
6fa40bd78bc8 check-code: allow an escape pattern to be specified for testpattern
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22100
diff changeset
   281
        m = tp[1]
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43112
diff changeset
   282
        if p.startswith('^'):
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43112
diff changeset
   283
            p = "^  [$>] (%s)" % p[1:]
14203
b230922eb0c3 check-code: fix checking for sh style in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents: 14169
diff changeset
   284
        else:
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43112
diff changeset
   285
            p = "^  [$>] .*(%s)" % p
22101
6fa40bd78bc8 check-code: allow an escape pattern to be specified for testpattern
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22100
diff changeset
   286
        utestpats[i].append((p, m) + tp[2:])
12364
e128fa4615f2 check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11886
diff changeset
   287
35315
e223c0438f89 check-code: allow tabs in heredoc
Yuya Nishihara <yuya@tcha.org>
parents: 35251
diff changeset
   288
# don't transform the following rules:
e223c0438f89 check-code: allow tabs in heredoc
Yuya Nishihara <yuya@tcha.org>
parents: 35251
diff changeset
   289
# "  > \t" and "  \t" should be allowed in unified tests
e223c0438f89 check-code: allow tabs in heredoc
Yuya Nishihara <yuya@tcha.org>
parents: 35251
diff changeset
   290
testpats[0].append((r'^( *)\t', "don't use tabs to indent"))
e223c0438f89 check-code: allow tabs in heredoc
Yuya Nishihara <yuya@tcha.org>
parents: 35251
diff changeset
   291
utestpats[0].append((r'^( ?)\t', "don't use tabs to indent"))
e223c0438f89 check-code: allow tabs in heredoc
Yuya Nishihara <yuya@tcha.org>
parents: 35251
diff changeset
   292
12364
e128fa4615f2 check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11886
diff changeset
   293
utestfilters = [
17711
cf204e9829f4 check-code: replace heredocs in unified tests
Idan Kamara <idankk86@gmail.com>
parents: 17620
diff changeset
   294
    (r"<<(\S+)((.|\n)*?\n  > \1)", rephere),
34060
e267d4ee4f2d check-code: forbid using bash in shebang
Jun Wu <quark@fb.com>
parents: 33369
diff changeset
   295
    (r"( +)(#([^!][^\n]*\S)?)", repcomment),
12364
e128fa4615f2 check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11886
diff changeset
   296
]
e128fa4615f2 check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents: 11886
diff changeset
   297
41821
14e8d042993a contrib: split pypats list in check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41761
diff changeset
   298
# common patterns to check *.py
14e8d042993a contrib: split pypats list in check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41761
diff changeset
   299
commonpypats = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   300
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   301
        (r'\\$', 'Use () to wrap long lines in Python, not \\'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   302
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   303
            r'^\s*def\s*\w+\s*\(.*,\s*\(',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   304
            "tuple parameter unpacking not available in Python 3+",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   305
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   306
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   307
            r'lambda\s*\(.*,.*\)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   308
            "tuple parameter unpacking not available in Python 3+",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   309
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   310
        (r'(?<!def)\s+(cmp)\(', "cmp is not available in Python 3+"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   311
        (r'(?<!\.)\breduce\s*\(.*', "reduce is not available in Python 3+"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   312
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   313
            r'\bdict\(.*=',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   314
            'dict() is different in Py2 and 3 and is slower than {}',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   315
            'dict-from-generator',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   316
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   317
        (r'\.has_key\b', "dict.has_key is not available in Python 3+"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   318
        (r'\s<>\s', '<> operator is not available in Python 3+, use !='),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   319
        (r'^\s*\t', "don't use tabs"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   320
        (r'\S;\s*\n', "semicolon"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   321
        (r'[^_]_\([ \t\n]*(?:"[^"]+"[ \t\n+]*)+%', "don't use % inside _()"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   322
        (r"[^_]_\([ \t\n]*(?:'[^']+'[ \t\n+]*)+%", "don't use % inside _()"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   323
        (r'(\w|\)),\w', "missing whitespace after ,"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   324
        (r'(\w|\))[+/*\-<>]\w', "missing whitespace in expression"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   325
        (r'\w\s=\s\s+\w', "gratuitous whitespace after ="),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   326
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   327
            (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   328
                # a line ending with a colon, potentially with trailing comments
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   329
                r':([ \t]*#[^\n]*)?\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   330
                # one that is not a pass and not only a comment
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   331
                r'(?P<indent>[ \t]+)[^#][^\n]+\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   332
                # more lines at the same indent level
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   333
                r'((?P=indent)[^\n]+\n)*'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   334
                # a pass at the same indent level, which is bogus
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   335
                r'(?P=indent)pass[ \t\n#]'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   336
            ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   337
            'omit superfluous pass',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   338
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   339
        (r'[^\n]\Z', "no trailing newline"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   340
        (r'(\S[ \t]+|^[ \t]+)\n', "trailing whitespace"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   341
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   342
            r'^\s*(if|while|def|class|except|try)\s[^[\n]*:\s*[^\\n]#\s]+',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   343
            "linebreak after :",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   344
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   345
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   346
            r'\b(%s)\('
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   347
            % '|'.join(k for k in keyword.kwlist if k not in ('print', 'exec')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   348
            "Python keyword is not a function",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   349
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   350
        #    (r'class\s[A-Z][^\(]*\((?!Exception)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   351
        #     "don't capitalize non-exception classes"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   352
        #    (r'in range\(', "use xrange"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   353
        #    (r'^\s*print\s+', "avoid using print in core and extensions"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   354
        (r'[\x80-\xff]', "non-ASCII character literal"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   355
        (r'("\')\.format\(', "str.format() has no bytes counterpart, use %"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   356
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   357
            r'([\(\[][ \t]\S)|(\S[ \t][\)\]])',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   358
            "gratuitous whitespace in () or []",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   359
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   360
        #    (r'\s\s=', "gratuitous whitespace before ="),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   361
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   362
            r'[^>< ](\+=|-=|!=|<>|<=|>=|<<=|>>=|%=)\S',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   363
            "missing whitespace around operator",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   364
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   365
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   366
            r'[^>< ](\+=|-=|!=|<>|<=|>=|<<=|>>=|%=)\s',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   367
            "missing whitespace around operator",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   368
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   369
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   370
            r'\s(\+=|-=|!=|<>|<=|>=|<<=|>>=|%=)\S',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   371
            "missing whitespace around operator",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   372
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   373
        (r'[^^+=*/!<>&| %-](\s=|=\s)[^= ]', "wrong whitespace around ="),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   374
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   375
            r'\([^()]*( =[^=]|[^<>!=]= )',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   376
            "no whitespace around = for named parameters",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   377
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   378
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   379
            r'raise [^,(]+, (\([^\)]+\)|[^,\(\)]+)$',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   380
            "don't use old-style two-argument raise, use Exception(message)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   381
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   382
        (r' is\s+(not\s+)?["\'0-9-]', "object comparison with literal"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   383
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   384
            r' [=!]=\s+(True|False|None)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   385
            "comparison with singleton, use 'is' or 'is not' instead",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   386
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   387
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   388
            r'^\s*(while|if) [01]:',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   389
            "use True/False for constant Boolean expression",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   390
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   391
        (r'^\s*if False(:| +and)', 'Remove code instead of using `if False`'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   392
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   393
            r'(?:(?<!def)\s+|\()hasattr\(',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   394
            'hasattr(foo, bar) is broken on py2, use util.safehasattr(foo, bar) '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   395
            'instead',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   396
            r'#.*hasattr-py3-only',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   397
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   398
        (r'opener\([^)]*\).read\(', "use opener.read() instead"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   399
        (r'opener\([^)]*\).write\(', "use opener.write() instead"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   400
        (r'(?i)descend[e]nt', "the proper spelling is descendAnt"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   401
        (r'\.debug\(\_', "don't mark debug messages for translation"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   402
        (r'\.strip\(\)\.split\(\)', "no need to strip before splitting"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   403
        (r'^\s*except\s*:', "naked except clause", r'#.*re-raises'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   404
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   405
            r'^\s*except\s([^\(,]+|\([^\)]+\))\s*,',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   406
            'legacy exception syntax; use "as" instead of ","',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   407
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   408
        (r'release\(.*wlock, .*lock\)', "wrong lock release order"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   409
        (r'\bdef\s+__bool__\b', "__bool__ should be __nonzero__ in Python 2"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   410
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   411
            r'os\.path\.join\(.*, *(""|\'\')\)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   412
            "use pathutil.normasprefix(path) instead of os.path.join(path, '')",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   413
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   414
        (r'\s0[0-7]+\b', 'legacy octal syntax; use "0o" prefix instead of "0"'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   415
        # XXX only catch mutable arguments on the first line of the definition
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   416
        (r'def.*[( ]\w+=\{\}', "don't use mutable default arguments"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   417
        (r'\butil\.Abort\b', "directly use error.Abort"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   418
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   419
            r'^@(\w*\.)?cachefunc',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   420
            "module-level @cachefunc is risky, please avoid",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   421
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   422
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   423
            r'^(from|import) mercurial\.(cext|pure|cffi)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   424
            "use mercurial.policy.importmod instead",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   425
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   426
        (r'\.next\(\)', "don't use .next(), use next(...)"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   427
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   428
            r'([a-z]*).revision\(\1\.node\(',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   429
            "don't convert rev to node before passing to revision(nodeorrev)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   430
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   431
        (r'platform\.system\(\)', "don't use platform.system(), use pycompat"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   432
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   433
    # warnings
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   434
    [],
41821
14e8d042993a contrib: split pypats list in check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41761
diff changeset
   435
]
14e8d042993a contrib: split pypats list in check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41761
diff changeset
   436
14e8d042993a contrib: split pypats list in check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41761
diff changeset
   437
# patterns to check normal *.py files
14e8d042993a contrib: split pypats list in check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41761
diff changeset
   438
pypats = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   439
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   440
        # Ideally, these should be placed in "commonpypats" for
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   441
        # consistency of coding rules in Mercurial source tree.
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   442
        # But on the other hand, these are not so seriously required for
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   443
        # python code fragments embedded in test scripts. Fixing test
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   444
        # scripts for these patterns requires many changes, and has less
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   445
        # profit than effort.
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   446
        (r'raise Exception', "don't raise generic exceptions"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   447
        (r'[\s\(](open|file)\([^)]*\)\.read\(', "use util.readfile() instead"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   448
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   449
            r'[\s\(](open|file)\([^)]*\)\.write\(',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   450
            "use util.writefile() instead",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   451
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   452
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   453
            r'^[\s\(]*(open(er)?|file)\([^)]*\)(?!\.close\(\))',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   454
            "always assign an opened file to a variable, and close it afterwards",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   455
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   456
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   457
            r'[\s\(](open|file)\([^)]*\)\.(?!close\(\))',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   458
            "always assign an opened file to a variable, and close it afterwards",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   459
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   460
        (r':\n(    )*( ){1,3}[^ ]', "must indent 4 spaces"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   461
        (r'^import atexit', "don't use atexit, use ui.atexit"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   462
        # rules depending on implementation of repquote()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   463
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   464
            r' x+[xpqo%APM][\'"]\n\s+[\'"]x',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   465
            'string join across lines with no space',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   466
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   467
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   468
            r'''(?x)ui\.(status|progress|write|note|warn)\(
29397
844f72885fb9 check-code: detect "missing _() in ui message" more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29330
diff changeset
   469
         [ \t\n#]*
844f72885fb9 check-code: detect "missing _() in ui message" more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29330
diff changeset
   470
         (?# any strings/comments might precede a string, which
844f72885fb9 check-code: detect "missing _() in ui message" more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29330
diff changeset
   471
           # contains translatable message)
43081
e65e7290041e contrib: fix check-code to be able to detect missing _() with bytestrings
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   472
         b?((['"]|\'\'\'|""")[ \npq%bAPMxno]*(['"]|\'\'\'|""")[ \t\n#]+)*
29397
844f72885fb9 check-code: detect "missing _() in ui message" more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29330
diff changeset
   473
         (?# sequence consisting of below might precede translatable message
844f72885fb9 check-code: detect "missing _() in ui message" more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29330
diff changeset
   474
           # - formatting string: "% 10s", "%05d", "% -3.2f", "%*s", "%%" ...
844f72885fb9 check-code: detect "missing _() in ui message" more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29330
diff changeset
   475
           # - escaped character: "\\", "\n", "\0" ...
844f72885fb9 check-code: detect "missing _() in ui message" more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29330
diff changeset
   476
           # - character other than '%', 'b' as '\', and 'x' as alphabet)
844f72885fb9 check-code: detect "missing _() in ui message" more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29330
diff changeset
   477
         (['"]|\'\'\'|""")
844f72885fb9 check-code: detect "missing _() in ui message" more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29330
diff changeset
   478
         ((%([ n]?[PM]?([np]+|A))?x)|%%|b[bnx]|[ \nnpqAPMo])*x
844f72885fb9 check-code: detect "missing _() in ui message" more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29330
diff changeset
   479
         (?# this regexp can't use [^...] style,
844f72885fb9 check-code: detect "missing _() in ui message" more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29330
diff changeset
   480
           # because _preparepats forcibly adds "\n" into [^...],
844f72885fb9 check-code: detect "missing _() in ui message" more exactly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29330
diff changeset
   481
           # even though this regexp wants match it against "\n")''',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   482
            "missing _() in ui message (use () to hide false-positives)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   483
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   484
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   485
    + commonpypats[0],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   486
    # warnings
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   487
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   488
        # rules depending on implementation of repquote()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   489
        (r'(^| )pp +xxxxqq[ \n][^\n]', "add two newlines after '.. note::'"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   490
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   491
    + commonpypats[1],
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   492
]
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   493
41826
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   494
# patterns to check *.py for embedded ones in test script
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   495
embeddedpypats = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   496
    [] + commonpypats[0],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   497
    # warnings
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   498
    [] + commonpypats[1],
41826
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   499
]
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   500
41821
14e8d042993a contrib: split pypats list in check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41761
diff changeset
   501
# common filters to convert *.py
14e8d042993a contrib: split pypats list in check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41761
diff changeset
   502
commonpyfilters = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   503
    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   504
        r"""(?msx)(?P<comment>\#.*?$)|
10727
62b8f15683f2 check-code: more tests and more robust python filtering
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10723
diff changeset
   505
         ((?P<quote>('''|\"\"\"|(?<!')'(?!')|(?<!")"(?!")))
62b8f15683f2 check-code: more tests and more robust python filtering
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10723
diff changeset
   506
          (?P<text>(([^\\]|\\.)*?))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   507
          (?P=quote))""",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   508
        reppython,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   509
    ),
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   510
]
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   511
47635
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   512
# pattern only for mercurial and extensions
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   513
core_py_pats = [
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   514
    [
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   515
        # Windows tend to get confused about capitalization of the drive letter
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   516
        #
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   517
        # see mercurial.windows.abspath for details
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   518
        (
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   519
            r'os\.path\.abspath',
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   520
            "use util.abspath instead (windows)",
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   521
            r'#.*re-exports',
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   522
        ),
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   523
    ],
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   524
    # warnings
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   525
    [],
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   526
]
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   527
41821
14e8d042993a contrib: split pypats list in check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41761
diff changeset
   528
# filters to convert normal *.py files
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   529
pyfilters = [] + commonpyfilters
41821
14e8d042993a contrib: split pypats list in check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41761
diff changeset
   530
34648
4889b84b15f2 check-code: suggest pycompat.is(posix|windows|darwin)
Jun Wu <quark@fb.com>
parents: 34642
diff changeset
   531
# non-filter patterns
4889b84b15f2 check-code: suggest pycompat.is(posix|windows|darwin)
Jun Wu <quark@fb.com>
parents: 34642
diff changeset
   532
pynfpats = [
4889b84b15f2 check-code: suggest pycompat.is(posix|windows|darwin)
Jun Wu <quark@fb.com>
parents: 34642
diff changeset
   533
    [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   534
        (r'pycompat\.osname\s*[=!]=\s*[\'"]nt[\'"]', "use pycompat.iswindows"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   535
        (r'pycompat\.osname\s*[=!]=\s*[\'"]posix[\'"]', "use pycompat.isposix"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   536
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   537
            r'pycompat\.sysplatform\s*[!=]=\s*[\'"]darwin[\'"]',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   538
            "use pycompat.isdarwin",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   539
        ),
34648
4889b84b15f2 check-code: suggest pycompat.is(posix|windows|darwin)
Jun Wu <quark@fb.com>
parents: 34642
diff changeset
   540
    ],
4889b84b15f2 check-code: suggest pycompat.is(posix|windows|darwin)
Jun Wu <quark@fb.com>
parents: 34642
diff changeset
   541
    # warnings
4889b84b15f2 check-code: suggest pycompat.is(posix|windows|darwin)
Jun Wu <quark@fb.com>
parents: 34642
diff changeset
   542
    [],
4889b84b15f2 check-code: suggest pycompat.is(posix|windows|darwin)
Jun Wu <quark@fb.com>
parents: 34642
diff changeset
   543
]
4889b84b15f2 check-code: suggest pycompat.is(posix|windows|darwin)
Jun Wu <quark@fb.com>
parents: 34642
diff changeset
   544
41826
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   545
# filters to convert *.py for embedded ones in test script
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   546
embeddedpyfilters = [] + commonpyfilters
41826
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   547
31602
772878ac930e checkcode: enforce lowercase for extension docstring title
Jun Wu <quark@fb.com>
parents: 31572
diff changeset
   548
# extension non-filter patterns
772878ac930e checkcode: enforce lowercase for extension docstring title
Jun Wu <quark@fb.com>
parents: 31572
diff changeset
   549
pyextnfpats = [
772878ac930e checkcode: enforce lowercase for extension docstring title
Jun Wu <quark@fb.com>
parents: 31572
diff changeset
   550
    [(r'^"""\n?[A-Z]', "don't capitalize docstring title")],
772878ac930e checkcode: enforce lowercase for extension docstring title
Jun Wu <quark@fb.com>
parents: 31572
diff changeset
   551
    # warnings
772878ac930e checkcode: enforce lowercase for extension docstring title
Jun Wu <quark@fb.com>
parents: 31572
diff changeset
   552
    [],
772878ac930e checkcode: enforce lowercase for extension docstring title
Jun Wu <quark@fb.com>
parents: 31572
diff changeset
   553
]
772878ac930e checkcode: enforce lowercase for extension docstring title
Jun Wu <quark@fb.com>
parents: 31572
diff changeset
   554
18960
170fc0949fb6 check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents: 18959
diff changeset
   555
txtfilters = []
170fc0949fb6 check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents: 18959
diff changeset
   556
170fc0949fb6 check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents: 18959
diff changeset
   557
txtpats = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   558
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   559
        (r'\s$', 'trailing whitespace'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   560
        ('.. note::[ \n][^\n]', 'add two newlines after note::'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   561
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   562
    [],
18960
170fc0949fb6 check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents: 18959
diff changeset
   563
]
170fc0949fb6 check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents: 18959
diff changeset
   564
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   565
cpats = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   566
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   567
        (r'//', "don't use //-style comments"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   568
        (r'\S\t', "don't use tabs except for indent"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   569
        (r'(\S[ \t]+|^[ \t]+)\n', "trailing whitespace"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   570
        (r'(while|if|do|for)\(', "use space after while/if/do/for"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   571
        (r'return\(', "return is not a function"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   572
        (r' ;', "no space before ;"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   573
        (r'[^;] \)', "no space before )"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   574
        (r'[)][{]', "space between ) and {"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   575
        (r'\w+\* \w+', "use int *foo, not int* foo"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   576
        (r'\W\([^\)]+\) \w+', "use (int)foo, not (int) foo"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   577
        (r'\w+ (\+\+|--)', "use foo++, not foo ++"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   578
        (r'\w,\w', "missing whitespace after ,"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   579
        (r'^[^#]\w[+/*]\w', "missing whitespace in expression"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   580
        (r'\w\s=\s\s+\w', "gratuitous whitespace after ="),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   581
        (r'^#\s+\w', "use #foo, not # foo"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   582
        (r'[^\n]\Z', "no trailing newline"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   583
        (r'^\s*#import\b', "use only #include in standard C code"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   584
        (r'strcpy\(', "don't use strcpy, use strlcpy or memcpy"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   585
        (r'strcat\(', "don't use strcat"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   586
        # rules depending on implementation of repquote()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   587
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   588
    # warnings
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   589
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   590
        # rules depending on implementation of repquote()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   591
    ],
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   592
]
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   593
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   594
cfilters = [
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   595
    (r'(/\*)(((\*(?!/))|[^*])*)\*/', repccomment),
10722
c4fb2103e734 check-code: improve quote detection regexp, add tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10720
diff changeset
   596
    (r'''(?P<quote>(?<!")")(?P<text>([^"]|\\")+)"(?!")''', repquote),
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   597
    (r'''(#\s*include\s+<)([^>]+)>''', repinclude),
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   598
    (r'(\()([^)]+\))', repcallspaces),
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   599
]
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   600
14137
83a94c2fe6f4 check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents: 14136
diff changeset
   601
inutilpats = [
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
   602
    [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
   603
        (r'\bui\.', "don't use ui in util"),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
   604
    ],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   605
    # warnings
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   606
    [],
14137
83a94c2fe6f4 check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents: 14136
diff changeset
   607
]
83a94c2fe6f4 check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents: 14136
diff changeset
   608
83a94c2fe6f4 check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents: 14136
diff changeset
   609
inrevlogpats = [
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
   610
    [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
   611
        (r'\brepo\.', "don't use repo in revlog"),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45830
diff changeset
   612
    ],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   613
    # warnings
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   614
    [],
14137
83a94c2fe6f4 check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents: 14136
diff changeset
   615
]
83a94c2fe6f4 check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents: 14136
diff changeset
   616
21487
c26464ce0781 check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents: 21222
diff changeset
   617
webtemplatefilters = []
c26464ce0781 check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents: 21222
diff changeset
   618
c26464ce0781 check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents: 21222
diff changeset
   619
webtemplatepats = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   620
    [],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   621
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   622
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   623
            r'{desc(\|(?!websub|firstline)[^\|]*)+}',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   624
            'follow desc keyword with either firstline or websub',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   625
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   626
    ],
21487
c26464ce0781 check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents: 21222
diff changeset
   627
]
c26464ce0781 check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents: 21222
diff changeset
   628
30246
b4c0f8d5edd2 contrib: check reference to old selenic.com domain
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30245
diff changeset
   629
allfilesfilters = []
b4c0f8d5edd2 contrib: check reference to old selenic.com domain
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30245
diff changeset
   630
b4c0f8d5edd2 contrib: check reference to old selenic.com domain
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30245
diff changeset
   631
allfilespats = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   632
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   633
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   634
            r'(http|https)://[a-zA-Z0-9./]*selenic.com/',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   635
            'use mercurial-scm.org domain URL',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   636
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   637
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   638
            r'mercurial@selenic\.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   639
            'use mercurial-scm.org domain for mercurial ML address',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   640
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   641
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   642
            r'mercurial-devel@selenic\.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   643
            'use mercurial-scm.org domain for mercurial-devel ML address',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   644
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   645
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   646
    # warnings
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   647
    [],
30246
b4c0f8d5edd2 contrib: check reference to old selenic.com domain
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30245
diff changeset
   648
]
b4c0f8d5edd2 contrib: check reference to old selenic.com domain
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30245
diff changeset
   649
30665
01721d382c16 py3: add warnings in check-code related to py3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30557
diff changeset
   650
py3pats = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   651
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   652
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   653
            r'os\.environ',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   654
            "use encoding.environ instead (py3)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   655
            r'#.*re-exports',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   656
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   657
        (r'os\.name', "use pycompat.osname instead (py3)"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   658
        (r'os\.getcwd', "use encoding.getcwd instead (py3)", r'#.*re-exports'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   659
        (r'os\.sep', "use pycompat.ossep instead (py3)"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   660
        (r'os\.pathsep', "use pycompat.ospathsep instead (py3)"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   661
        (r'os\.altsep', "use pycompat.osaltsep instead (py3)"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   662
        (r'sys\.platform', "use pycompat.sysplatform instead (py3)"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   663
        (r'getopt\.getopt', "use pycompat.getoptb instead (py3)"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   664
        (r'os\.getenv', "use encoding.environ.get instead"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   665
        (r'os\.setenv', "modifying the environ dict is not preferred"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   666
        (r'(?<!pycompat\.)xrange', "use pycompat.xrange instead (py3)"),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   667
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   668
    # warnings
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   669
    [],
30665
01721d382c16 py3: add warnings in check-code related to py3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30557
diff changeset
   670
]
01721d382c16 py3: add warnings in check-code related to py3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30557
diff changeset
   671
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   672
checks = [
21222
4840abc83970 check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents: 21097
diff changeset
   673
    ('python', r'.*\.(py|cgi)$', r'^#!.*python', pyfilters, pypats),
34648
4889b84b15f2 check-code: suggest pycompat.is(posix|windows|darwin)
Jun Wu <quark@fb.com>
parents: 34642
diff changeset
   674
    ('python', r'.*\.(py|cgi)$', r'^#!.*python', [], pynfpats),
31602
772878ac930e checkcode: enforce lowercase for extension docstring title
Jun Wu <quark@fb.com>
parents: 31572
diff changeset
   675
    ('python', r'.*hgext.*\.py$', '', [], pyextnfpats),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   676
    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   677
        'python 3',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   678
        r'.*(hgext|mercurial)/(?!demandimport|policy|pycompat).*\.py',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   679
        '',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   680
        pyfilters,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   681
        py3pats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   682
    ),
47635
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   683
    (
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   684
        'core files',
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   685
        r'.*(hgext|mercurial)/(?!demandimport|policy|pycompat).*\.py',
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   686
        '',
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   687
        pyfilters,
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   688
        core_py_pats,
752109dc2fb7 check-code: add a rules to catch os.path.abspath
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47499
diff changeset
   689
    ),
21222
4840abc83970 check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents: 21097
diff changeset
   690
    ('test script', r'(.*/)?test-[^.~]*$', '', testfilters, testpats),
4840abc83970 check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents: 21097
diff changeset
   691
    ('c', r'.*\.[ch]$', '', cfilters, cpats),
4840abc83970 check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents: 21097
diff changeset
   692
    ('unified test', r'.*\.t$', '', utestfilters, utestpats),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   693
    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   694
        'layering violation repo in revlog',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   695
        r'mercurial/revlog\.py',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   696
        '',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   697
        pyfilters,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   698
        inrevlogpats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   699
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   700
    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   701
        'layering violation ui in util',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   702
        r'mercurial/util\.py',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   703
        '',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   704
        pyfilters,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   705
        inutilpats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   706
    ),
21222
4840abc83970 check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents: 21097
diff changeset
   707
    ('txt', r'.*\.txt$', '', txtfilters, txtpats),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   708
    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   709
        'web template',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   710
        r'mercurial/templates/.*\.tmpl',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   711
        '',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   712
        webtemplatefilters,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   713
        webtemplatepats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   714
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   715
    ('all except for .po', r'.*(?<!\.po)$', '', allfilesfilters, allfilespats),
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   716
]
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   717
41826
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   718
# (desc,
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   719
#  func to pick up embedded code fragments,
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   720
#  list of patterns to convert target files
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   721
#  list of patterns to detect errors/warnings)
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   722
embeddedchecks = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   723
    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   724
        'embedded python',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   725
        testparseutil.pyembedded,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   726
        embeddedpyfilters,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   727
        embeddedpypats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   728
    )
41826
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   729
]
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   730
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   731
19307
5443d40d524b check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents: 19168
diff changeset
   732
def _preparepats():
41822
55ae5cd31f76 contrib: refactor preparation logic for patterns of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41821
diff changeset
   733
    def preparefailandwarn(failandwarn):
19307
5443d40d524b check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents: 19168
diff changeset
   734
        for pats in failandwarn:
5443d40d524b check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents: 19168
diff changeset
   735
            for i, pseq in enumerate(pats):
5443d40d524b check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents: 19168
diff changeset
   736
                # fix-up regexes for multi-line searches
19378
9de689d20230 cleanup: drop unused variables and an unused import
Simon Heimberg <simohe@besonet.ch>
parents: 19310
diff changeset
   737
                p = pseq[0]
36957
a8d540d2628c contrib: fix a subtle bug in check-code's regex rewriting
Augie Fackler <augie@google.com>
parents: 36949
diff changeset
   738
                # \s doesn't match \n (done in two steps)
a8d540d2628c contrib: fix a subtle bug in check-code's regex rewriting
Augie Fackler <augie@google.com>
parents: 36949
diff changeset
   739
                # first, we replace \s that appears in a set already
a8d540d2628c contrib: fix a subtle bug in check-code's regex rewriting
Augie Fackler <augie@google.com>
parents: 36949
diff changeset
   740
                p = re.sub(r'\[\\s', r'[ \\t', p)
a8d540d2628c contrib: fix a subtle bug in check-code's regex rewriting
Augie Fackler <augie@google.com>
parents: 36949
diff changeset
   741
                # now we replace other \s instances.
a8d540d2628c contrib: fix a subtle bug in check-code's regex rewriting
Augie Fackler <augie@google.com>
parents: 36949
diff changeset
   742
                p = re.sub(r'(?<!(\\|\[))\\s', r'[ \\t]', p)
19307
5443d40d524b check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents: 19168
diff changeset
   743
                # [^...] doesn't match newline
5443d40d524b check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents: 19168
diff changeset
   744
                p = re.sub(r'(?<!\\)\[\^', r'[^\\n', p)
5443d40d524b check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents: 19168
diff changeset
   745
19308
84faaacbd3fa check-code: compile all patterns on initialisation
Simon Heimberg <simohe@besonet.ch>
parents: 19307
diff changeset
   746
                pats[i] = (re.compile(p, re.MULTILINE),) + pseq[1:]
41822
55ae5cd31f76 contrib: refactor preparation logic for patterns of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41821
diff changeset
   747
55ae5cd31f76 contrib: refactor preparation logic for patterns of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41821
diff changeset
   748
    def preparefilters(filters):
19309
7d77fa1cd537 check-code: compile filters when loading
Simon Heimberg <simohe@besonet.ch>
parents: 19308
diff changeset
   749
        for i, flt in enumerate(filters):
7d77fa1cd537 check-code: compile filters when loading
Simon Heimberg <simohe@besonet.ch>
parents: 19308
diff changeset
   750
            filters[i] = re.compile(flt[0]), flt[1]
19307
5443d40d524b check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents: 19168
diff changeset
   751
41826
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   752
    for cs in (checks, embeddedchecks):
41822
55ae5cd31f76 contrib: refactor preparation logic for patterns of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41821
diff changeset
   753
        for c in cs:
55ae5cd31f76 contrib: refactor preparation logic for patterns of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41821
diff changeset
   754
            failandwarn = c[-1]
55ae5cd31f76 contrib: refactor preparation logic for patterns of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41821
diff changeset
   755
            preparefailandwarn(failandwarn)
55ae5cd31f76 contrib: refactor preparation logic for patterns of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41821
diff changeset
   756
55ae5cd31f76 contrib: refactor preparation logic for patterns of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41821
diff changeset
   757
            filters = c[-2]
55ae5cd31f76 contrib: refactor preparation logic for patterns of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41821
diff changeset
   758
            preparefilters(filters)
55ae5cd31f76 contrib: refactor preparation logic for patterns of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41821
diff changeset
   759
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   760
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48945
diff changeset
   761
class norepeatlogger:
10719
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   762
    def __init__(self):
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   763
        self._lastseen = None
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   764
11604
c5d40818b270 check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents: 11602
diff changeset
   765
    def log(self, fname, lineno, line, msg, blame):
10719
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   766
        """print error related a to given line of a given file.
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   767
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   768
        The faulty line will also be printed but only once in the case
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   769
        of multiple errors.
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   770
10719
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   771
        :fname: filename
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   772
        :lineno: line number
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   773
        :line: actual content of the line
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   774
        :msg: error message
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   775
        """
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   776
        msgid = fname, lineno, line
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   777
        if msgid != self._lastseen:
11604
c5d40818b270 check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents: 11602
diff changeset
   778
            if blame:
28509
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
   779
                print("%s:%d (%s):" % (fname, lineno, blame))
11604
c5d40818b270 check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents: 11602
diff changeset
   780
            else:
28509
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
   781
                print("%s:%d:" % (fname, lineno))
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
   782
            print(" > %s" % line)
10719
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   783
            self._lastseen = msgid
28509
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
   784
        print(" " + msg)
10719
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   785
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   786
10719
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   787
_defaultlogger = norepeatlogger()
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   788
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   789
11604
c5d40818b270 check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents: 11602
diff changeset
   790
def getblame(f):
c5d40818b270 check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents: 11602
diff changeset
   791
    lines = []
c5d40818b270 check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents: 11602
diff changeset
   792
    for l in os.popen('hg annotate -un %s' % f):
c5d40818b270 check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents: 11602
diff changeset
   793
        start, line = l.split(':', 1)
c5d40818b270 check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents: 11602
diff changeset
   794
        user, rev = start.split()
c5d40818b270 check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents: 11602
diff changeset
   795
        lines.append((line[1:-1], user, rev))
c5d40818b270 check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents: 11602
diff changeset
   796
    return lines
c5d40818b270 check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents: 11602
diff changeset
   797
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   798
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   799
def checkfile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   800
    f,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   801
    logfunc=_defaultlogger.log,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   802
    maxerr=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   803
    warnings=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   804
    blame=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   805
    debug=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   806
    lineno=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   807
):
10719
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   808
    """checks style and portability of a given file
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   809
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   810
    :f: filepath
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   811
    :logfunc: function used to report error
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   812
              logfunc(filename, linenumber, linecontent, errormessage)
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17347
diff changeset
   813
    :maxerr: number of error to display before aborting.
15873
a153a86a472c tests: keep track of all check-code.py warnings
Mads Kiilerich <mads@kiilerich.com>
parents: 15611
diff changeset
   814
             Set to false (default) to report all errors
10720
fbcccf9ec58f check-code: add a return value to checkfile function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10719
diff changeset
   815
fbcccf9ec58f check-code: add a return value to checkfile function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10719
diff changeset
   816
    return True if no error is found, False otherwise.
10719
3be9ae49b628 code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10718
diff changeset
   817
    """
10720
fbcccf9ec58f check-code: add a return value to checkfile function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10719
diff changeset
   818
    result = True
21222
4840abc83970 check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents: 21097
diff changeset
   819
4840abc83970 check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents: 21097
diff changeset
   820
    try:
29145
c641b8dfb98c check-code: handle py3 open divergence
timeless <timeless@mozdev.org>
parents: 29144
diff changeset
   821
        with opentext(f) as fp:
c641b8dfb98c check-code: handle py3 open divergence
timeless <timeless@mozdev.org>
parents: 29144
diff changeset
   822
            try:
41365
876494fd967d cleanup: delete lots of unused local variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 39818
diff changeset
   823
                pre = fp.read()
29145
c641b8dfb98c check-code: handle py3 open divergence
timeless <timeless@mozdev.org>
parents: 29144
diff changeset
   824
            except UnicodeDecodeError as e:
c641b8dfb98c check-code: handle py3 open divergence
timeless <timeless@mozdev.org>
parents: 29144
diff changeset
   825
                print("%s while reading %s" % (e, f))
c641b8dfb98c check-code: handle py3 open divergence
timeless <timeless@mozdev.org>
parents: 29144
diff changeset
   826
                return result
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25659
diff changeset
   827
    except IOError as e:
28509
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
   828
        print("Skipping %s, %s" % (f, str(e).split(':', 1)[0]))
21222
4840abc83970 check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents: 21097
diff changeset
   829
        return result
4840abc83970 check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents: 21097
diff changeset
   830
41823
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   831
    # context information shared while single checkfile() invocation
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   832
    context = {'blamecache': None}
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   833
21222
4840abc83970 check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents: 21097
diff changeset
   834
    for name, match, magic, filters, pats in checks:
14135
673abd432104 check-code: adding debug flag
timeless <timeless@mozdev.org>
parents: 14009
diff changeset
   835
        if debug:
28509
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
   836
            print(name, f)
28050
7e9e39228de6 check-code: examine magic pattern matching against contents of a file
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28035
diff changeset
   837
        if not (re.match(match, f) or (magic and re.search(magic, pre))):
14135
673abd432104 check-code: adding debug flag
timeless <timeless@mozdev.org>
parents: 14009
diff changeset
   838
            if debug:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   839
                print(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   840
                    "Skipping %s for %s it doesn't match %s" % (name, match, f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   841
                )
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   842
            continue
19382
5aeb03b48ab4 check-code: concatenate "check-code" on compile time
Simon Heimberg <simohe@besonet.ch>
parents: 19380
diff changeset
   843
        if "no-" "check-code" in pre:
27560
15b06f306c1f check-code: improve test-check-code error diffs
timeless <timeless@mozdev.org>
parents: 27557
diff changeset
   844
            # If you're looking at this line, it's because a file has:
15b06f306c1f check-code: improve test-check-code error diffs
timeless <timeless@mozdev.org>
parents: 27557
diff changeset
   845
            # no- check- code
15b06f306c1f check-code: improve test-check-code error diffs
timeless <timeless@mozdev.org>
parents: 27557
diff changeset
   846
            # but the reason to output skipping is to make life for
15b06f306c1f check-code: improve test-check-code error diffs
timeless <timeless@mozdev.org>
parents: 27557
diff changeset
   847
            # tests easier. So, instead of writing it with a normal
15b06f306c1f check-code: improve test-check-code error diffs
timeless <timeless@mozdev.org>
parents: 27557
diff changeset
   848
            # spelling, we write it with the expected spelling from
15b06f306c1f check-code: improve test-check-code error diffs
timeless <timeless@mozdev.org>
parents: 27557
diff changeset
   849
            # tests/test-check-code.t
28509
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
   850
            print("Skipping %s it has no-che?k-code (glob)" % f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   851
            return "Skip"  # skip checking this file
41823
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   852
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   853
        fc = _checkfiledata(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   854
            name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   855
            f,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   856
            pre,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   857
            filters,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   858
            pats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   859
            context,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   860
            logfunc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   861
            maxerr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   862
            warnings,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   863
            blame,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   864
            debug,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   865
            lineno,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   866
        )
41824
519b2faea261 contrib: change return value of file checking function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41823
diff changeset
   867
        if fc:
41823
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   868
            result = False
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   869
41826
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   870
    if f.endswith('.t') and "no-" "check-code" not in pre:
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   871
        if debug:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   872
            print("Checking embedded code in %s" % f)
41826
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   873
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   874
        prelines = pre.splitlines()
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   875
        embeddederros = []
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   876
        for name, embedded, filters, pats in embeddedchecks:
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   877
            # "reset curmax at each repetition" treats maxerr as "max
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   878
            # nubmer of errors in an actual file per entry of
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   879
            # (embedded)checks"
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   880
            curmaxerr = maxerr
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   881
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   882
            for found in embedded(f, prelines, embeddederros):
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   883
                filename, starts, ends, code = found
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   884
                fc = _checkfiledata(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   885
                    name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   886
                    f,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   887
                    code,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   888
                    filters,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   889
                    pats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   890
                    context,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   891
                    logfunc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   892
                    curmaxerr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   893
                    warnings,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   894
                    blame,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   895
                    debug,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   896
                    lineno,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   897
                    offset=starts - 1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   898
                )
41826
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   899
                if fc:
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   900
                    result = False
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   901
                    if curmaxerr:
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   902
                        if fc >= curmaxerr:
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   903
                            break
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   904
                        curmaxerr -= fc
867883d454ea contrib: make check-code.py check code fragments embedded in test scripts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41825
diff changeset
   905
41823
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   906
    return result
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   907
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   908
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   909
def _checkfiledata(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   910
    name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   911
    f,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   912
    filedata,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   913
    filters,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   914
    pats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   915
    context,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   916
    logfunc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   917
    maxerr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   918
    warnings,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   919
    blame,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   920
    debug,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   921
    lineno,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   922
    offset=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   923
):
41823
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   924
    """Execute actual error check for file data
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   925
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   926
    :name: of the checking category
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   927
    :f: filepath
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   928
    :filedata: content of a file
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   929
    :filters: to be applied before checking
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   930
    :pats: to detect errors
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   931
    :context: a dict of information shared while single checkfile() invocation
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   932
              Valid keys: 'blamecache'.
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   933
    :logfunc: function used to report error
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   934
              logfunc(filename, linenumber, linecontent, errormessage)
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   935
    :maxerr: number of error to display before aborting, or False to
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   936
             report all errors
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   937
    :warnings: whether warning level checks should be applied
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   938
    :blame: whether blame information should be displayed at error reporting
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   939
    :debug: whether debug information should be displayed
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   940
    :lineno: whether lineno should be displayed at error reporting
41825
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
   941
    :offset: line number offset of 'filedata' in 'f' for checking
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
   942
             an embedded code fragment, or None (offset=0 is different
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
   943
             from offset=None)
41823
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   944
41824
519b2faea261 contrib: change return value of file checking function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41823
diff changeset
   945
    returns number of detected errors.
41823
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   946
    """
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   947
    blamecache = context['blamecache']
41825
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
   948
    if offset is None:
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
   949
        lineoffset = 0
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
   950
    else:
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
   951
        lineoffset = offset
41823
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   952
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   953
    fc = 0
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   954
    pre = post = filedata
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
   955
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   956
    if True:  # TODO: get rid of this redundant 'if' block
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   957
        for p, r in filters:
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   958
            post = re.sub(p, r, post)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   959
        nerrs = len(pats[0])  # nerr elements are errors
14009
64de9ca66511 check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents: 14005
diff changeset
   960
        if warnings:
64de9ca66511 check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents: 14005
diff changeset
   961
            pats = pats[0] + pats[1]
64de9ca66511 check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents: 14005
diff changeset
   962
        else:
64de9ca66511 check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents: 14005
diff changeset
   963
            pats = pats[0]
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   964
        # print post # uncomment to show filtered version
15281
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   965
14135
673abd432104 check-code: adding debug flag
timeless <timeless@mozdev.org>
parents: 14009
diff changeset
   966
        if debug:
28509
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
   967
            print("Checking %s for %s" % (name, f))
15281
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   968
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   969
        prelines = None
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   970
        errors = []
19422
d9e86d656017 check-code: automatically preppend "warning: " to all warning messages
Simon Heimberg <simohe@besonet.ch>
parents: 19382
diff changeset
   971
        for i, pat in enumerate(pats):
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16704
diff changeset
   972
            if len(pat) == 3:
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16704
diff changeset
   973
                p, msg, ignore = pat
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16704
diff changeset
   974
            else:
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16704
diff changeset
   975
                p, msg = pat
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16704
diff changeset
   976
                ignore = None
20005
22154ec6fb8b check-code: prepend warning prefix only once, but for each warning
Simon Heimberg <simohe@besonet.ch>
parents: 19999
diff changeset
   977
            if i >= nerrs:
22154ec6fb8b check-code: prepend warning prefix only once, but for each warning
Simon Heimberg <simohe@besonet.ch>
parents: 19999
diff changeset
   978
                msg = "warning: " + msg
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16704
diff changeset
   979
15281
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   980
            pos = 0
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   981
            n = 0
19308
84faaacbd3fa check-code: compile all patterns on initialisation
Simon Heimberg <simohe@besonet.ch>
parents: 19307
diff changeset
   982
            for m in p.finditer(post):
15281
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   983
                if prelines is None:
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   984
                    prelines = pre.splitlines()
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   985
                    postlines = post.splitlines(True)
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   986
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   987
                start = m.start()
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   988
                while n < len(postlines):
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   989
                    step = len(postlines[n])
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   990
                    if pos + step > start:
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   991
                        break
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   992
                    pos += step
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   993
                    n += 1
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   994
                l = prelines[n]
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
   995
20242
2dad90bdf29d check-code: drop now unused check-code-ignore
Simon Heimberg <simohe@besonet.ch>
parents: 20241
diff changeset
   996
                if ignore and re.search(ignore, l, re.MULTILINE):
20243
cc09cfea3dd4 check-code: print debug output when an ignore pattern matches
Simon Heimberg <simohe@besonet.ch>
parents: 20242
diff changeset
   997
                    if debug:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   998
                        print(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
   999
                            "Skipping %s for %s:%s (ignore pattern)"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1000
                            % (name, f, (n + lineoffset))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1001
                        )
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16704
diff changeset
  1002
                    continue
15281
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
  1003
                bd = ""
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
  1004
                if blame:
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
  1005
                    bd = 'working directory'
41823
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
  1006
                    if blamecache is None:
15281
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
  1007
                        blamecache = getblame(f)
41823
7a139fc60eb0 contrib: factor out actual error check for file data of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41822
diff changeset
  1008
                        context['blamecache'] = blamecache
41825
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1009
                    if (n + lineoffset) < len(blamecache):
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1010
                        bl, bu, br = blamecache[(n + lineoffset)]
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1011
                        if offset is None and bl == l:
15281
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
  1012
                            bd = '%s@%s' % (bu, br)
41825
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1013
                        elif offset is not None and bl.endswith(l):
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1014
                            # "offset is not None" means "checking
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1015
                            # embedded code fragment". In this case,
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1016
                            # "l" does not have information about the
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1017
                            # beginning of an *original* line in the
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1018
                            # file (e.g. '  > ').
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1019
                            # Therefore, use "str.endswith()", and
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1020
                            # show "maybe" for a little loose
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1021
                            # examination.
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1022
                            bd = '%s@%s, maybe' % (bu, br)
20005
22154ec6fb8b check-code: prepend warning prefix only once, but for each warning
Simon Heimberg <simohe@besonet.ch>
parents: 19999
diff changeset
  1023
41825
6d6bd9039ecd contrib: add line offset information to file check function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41824
diff changeset
  1024
                errors.append((f, lineno and (n + lineoffset + 1), l, msg, bd))
15281
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
  1025
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
  1026
        errors.sort()
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
  1027
        for e in errors:
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
  1028
            logfunc(*e)
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
  1029
            fc += 1
15873
a153a86a472c tests: keep track of all check-code.py warnings
Mads Kiilerich <mads@kiilerich.com>
parents: 15611
diff changeset
  1030
            if maxerr and fc >= maxerr:
28509
9e3ecb6f4995 check-code: use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28399
diff changeset
  1031
                print(" (too many errors, giving up)")
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1032
                break
15281
aeeb2afcdc25 check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 14978
diff changeset
  1033
41824
519b2faea261 contrib: change return value of file checking function of check-code.py
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 41823
diff changeset
  1034
    return fc
10717
b1f4fcef99b3 check-code: Add a ``checkfile`` function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10716
diff changeset
  1035
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1036
29568
7825f6154a65 check-code: factor out boot procedure into main
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29566
diff changeset
  1037
def main():
31824
4804644489cf check-code: use "-" to specify a list of files from stdin
Jun Wu <quark@fb.com>
parents: 31816
diff changeset
  1038
    parser = optparse.OptionParser("%prog [options] [files | -]")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1039
    parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1040
        "-w",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1041
        "--warnings",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1042
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1043
        help="include warning-level checks",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1044
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1045
    parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1046
        "-p", "--per-file", type="int", help="max warnings per file"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1047
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1048
    parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1049
        "-b",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1050
        "--blame",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1051
        action="store_true",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1052
        help="use annotate to generate blame info",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1053
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1054
    parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1055
        "", "--debug", action="store_true", help="show debug information"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1056
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1057
    parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1058
        "",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1059
        "--nolineno",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1060
        action="store_false",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1061
        dest='lineno',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1062
        help="don't show line numbers",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1063
    )
10895
217557b26bc7 check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents: 10814
diff changeset
  1064
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1065
    parser.set_defaults(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1066
        per_file=15, warnings=False, blame=False, debug=False, lineno=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1067
    )
10895
217557b26bc7 check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents: 10814
diff changeset
  1068
    (options, args) = parser.parse_args()
217557b26bc7 check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents: 10814
diff changeset
  1069
217557b26bc7 check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents: 10814
diff changeset
  1070
    if len(args) == 0:
10716
5f92bde72eef check-code: Only call check-code if __name__ = "__main__".
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10707
diff changeset
  1071
        check = glob.glob("*")
31824
4804644489cf check-code: use "-" to specify a list of files from stdin
Jun Wu <quark@fb.com>
parents: 31816
diff changeset
  1072
    elif args == ['-']:
4804644489cf check-code: use "-" to specify a list of files from stdin
Jun Wu <quark@fb.com>
parents: 31816
diff changeset
  1073
        # read file list from stdin
4804644489cf check-code: use "-" to specify a list of files from stdin
Jun Wu <quark@fb.com>
parents: 31816
diff changeset
  1074
        check = sys.stdin.read().splitlines()
10716
5f92bde72eef check-code: Only call check-code if __name__ = "__main__".
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10707
diff changeset
  1075
    else:
10895
217557b26bc7 check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents: 10814
diff changeset
  1076
        check = args
10281
e7d3b509af8b Introduce check-code.py
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1077
29569
3d52e7c78a6b check-code: move fixing up regexp into main procedure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29568
diff changeset
  1078
    _preparepats()
3d52e7c78a6b check-code: move fixing up regexp into main procedure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29568
diff changeset
  1079
15544
53ef627cda30 check-code: fix return code initialization
Mads Kiilerich <mads@kiilerich.com>
parents: 15502
diff changeset
  1080
    ret = 0
10716
5f92bde72eef check-code: Only call check-code if __name__ = "__main__".
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 10707
diff changeset
  1081
    for f in check:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1082
        if not checkfile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1083
            f,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1084
            maxerr=options.per_file,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1085
            warnings=options.warnings,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1086
            blame=options.blame,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1087
            debug=options.debug,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1088
            lineno=options.lineno,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1089
        ):
11816
e1359ad582f6 check-code: add exit status
Alecs King <alecsk@gmail.com>
parents: 11764
diff changeset
  1090
            ret = 1
29568
7825f6154a65 check-code: factor out boot procedure into main
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29566
diff changeset
  1091
    return ret
7825f6154a65 check-code: factor out boot procedure into main
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29566
diff changeset
  1092
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43063
diff changeset
  1093
29568
7825f6154a65 check-code: factor out boot procedure into main
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29566
diff changeset
  1094
if __name__ == "__main__":
7825f6154a65 check-code: factor out boot procedure into main
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29566
diff changeset
  1095
    sys.exit(main())