Mercurial > hg
annotate contrib/check-code.py @ 24937:f5518b47cdd1
revset: rename 'revsnode' to 'inputrev' in ancestors
We usually use 'node' for variable containing 20 bytes hash. There is nothing
nodish in this variable, so we rename it to "inputrev" as it old the next entry
of the iteration.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Wed, 26 Mar 2014 16:14:30 -0700 |
parents | 1f9127c9239b |
children | ded7302e1c83 |
rev | line source |
---|---|
10281 | 1 #!/usr/bin/env python |
2 # | |
3 # check-code - a style and portability checker for Mercurial | |
4 # | |
10290
7cc60de189d7
check-code: fix copyright date
Matt Mackall <mpm@selenic.com>
parents:
10287
diff
changeset
|
5 # Copyright 2010 Matt Mackall <mpm@selenic.com> |
10281 | 6 # |
7 # This software may be used and distributed according to the terms of the | |
8 # GNU General Public License version 2 or any later version. | |
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 |
8071b4eddefa
check-code: explain what to do when a check-code rule mismatches
Simon Heimberg <simohe@besonet.ch>
parents:
20239
diff
changeset
|
17 (you can append a short comment and match this, like: #re-raises, # no-py24) |
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 |
11816
e1359ad582f6
check-code: add exit status
Alecs King <alecsk@gmail.com>
parents:
11764
diff
changeset
|
22 import re, glob, os, sys |
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 |
19310
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
25 try: |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
26 import re2 |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
27 except ImportError: |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
28 re2 = None |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
29 |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
30 def compilere(pat, multiline=False): |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
31 if multiline: |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
32 pat = '(?m)' + pat |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
33 if re2: |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
34 try: |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
35 return re2.compile(pat) |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
36 except re2.error: |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
37 pass |
30ea54660d14
check-code: introduce function for using re2 when available
Simon Heimberg <simohe@besonet.ch>
parents:
19309
diff
changeset
|
38 return re.compile(pat) |
10281 | 39 |
40 def repquote(m): | |
19999
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
41 fromc = '.:' |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
42 tochr = 'pq' |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
43 def encodechr(i): |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
44 if i > 255: |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
45 return 'u' |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
46 c = chr(i) |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
47 if c in ' \n': |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
48 return c |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
49 if c.isalpha(): |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
50 return 'x' |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
51 if c.isdigit(): |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
52 return 'n' |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
53 try: |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
54 return tochr[fromc.find(c)] |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
55 except (ValueError, IndexError): |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
56 return 'o' |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
57 t = m.group('text') |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
58 tt = ''.join(encodechr(i) for i in xrange(256)) |
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
59 t = t.translate(tt) |
10722
c4fb2103e734
check-code: improve quote detection regexp, add tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10720
diff
changeset
|
60 return m.group('quote') + t + m.group('quote') |
10281 | 61 |
10727
62b8f15683f2
check-code: more tests and more robust python filtering
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10723
diff
changeset
|
62 def reppython(m): |
62b8f15683f2
check-code: more tests and more robust python filtering
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10723
diff
changeset
|
63 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
|
64 if comment: |
18959
2f6418d8a4c9
check-code: catch trailing space in comments
Mads Kiilerich <madski@unity3d.com>
parents:
18835
diff
changeset
|
65 l = len(comment.rstrip()) |
2f6418d8a4c9
check-code: catch trailing space in comments
Mads Kiilerich <madski@unity3d.com>
parents:
18835
diff
changeset
|
66 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
|
67 return repquote(m) |
10281 | 68 |
69 def repcomment(m): | |
70 return m.group(1) + "#" * len(m.group(2)) | |
71 | |
72 def repccomment(m): | |
73 t = re.sub(r"((?<=\n) )|\S", "x", m.group(2)) | |
74 return m.group(1) + t + "*/" | |
75 | |
76 def repcallspaces(m): | |
77 t = re.sub(r"\n\s+", "\n", m.group(2)) | |
78 return m.group(1) + t | |
79 | |
80 def repinclude(m): | |
81 return m.group(1) + "<foo>" | |
82 | |
83 def rephere(m): | |
84 t = re.sub(r"\S", "x", m.group(2)) | |
85 return m.group(1) + t | |
86 | |
87 | |
88 testpats = [ | |
14009
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
89 [ |
16495
5f9835ed3d6d
check-code: put grouping around regexps generated from testpats
Mads Kiilerich <mads@kiilerich.com>
parents:
16494
diff
changeset
|
90 (r'pushd|popd', "don't use 'pushd' or 'popd', use 'cd'"), |
15281
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
91 (r'\W\$?\(\([^\)\n]*\)\)', "don't use (()) or $(()), use 'expr'"), |
10374
3aa35db5e38c
check-code.py: make help strings consistent
Martin Geisler <mg@lazybytes.net>
parents:
10373
diff
changeset
|
92 (r'grep.*-q', "don't use 'grep -q', redirect to /dev/null"), |
19626
cf6b086d64cc
solaris: test cases can't use grep -a
Danek Duvall <danek.duvall@oracle.com>
parents:
19501
diff
changeset
|
93 (r'(?<!hg )grep.*-a', "don't use 'grep -a', use in-line python"), |
16332
42e95631887d
tests: remove sed -i from test-record
Matt Mackall <mpm@selenic.com>
parents:
16249
diff
changeset
|
94 (r'sed.*-i', "don't use 'sed -i', use a temporary file"), |
16965
91284af53508
test-alias: adapt for Windows
Mads Kiilerich <mads@kiilerich.com>
parents:
16705
diff
changeset
|
95 (r'\becho\b.*\\n', "don't use 'echo \\n', use printf"), |
11884
932448701e7d
check-code: catch "echo -n" in tests
Martin Geisler <mg@lazybytes.net>
parents:
11599
diff
changeset
|
96 (r'echo -n', "don't use 'echo -n', use printf"), |
23134
22e76e370611
test-revert.t: fix wc check-code false positive
Matt Mackall <mpm@selenic.com>
parents:
22448
diff
changeset
|
97 (r'(^|\|\s*)\bwc\b[^|]*$\n(?!.*\(re\))', "filter wc output"), |
10374
3aa35db5e38c
check-code.py: make help strings consistent
Martin Geisler <mg@lazybytes.net>
parents:
10373
diff
changeset
|
98 (r'head -c', "don't use 'head -c', use 'dd'"), |
19628
3193b23eec61
solaris: tests can't use tail -n
Danek Duvall <danek.duvall@oracle.com>
parents:
19626
diff
changeset
|
99 (r'tail -n', "don't use the '-n' option to tail, just use '-<num>'"), |
15389
3bece03bf3c6
tests: use md5sum.py instead of sha1sum, add check
Matt Mackall <mpm@selenic.com>
parents:
15372
diff
changeset
|
100 (r'sha1sum', "don't use sha1sum, use $TESTDIR/md5sum.py"), |
10374
3aa35db5e38c
check-code.py: make help strings consistent
Martin Geisler <mg@lazybytes.net>
parents:
10373
diff
changeset
|
101 (r'ls.*-\w*R', "don't use 'ls -R', use 'find'"), |
19380
ee07f9d142c9
check-code: do not warn on printf \\x or \\[1-9]
Simon Heimberg <simohe@besonet.ch>
parents:
19378
diff
changeset
|
102 (r'printf.*[^\\]\\([1-9]|0\d)', "don't use 'printf \NNN', use Python"), |
ee07f9d142c9
check-code: do not warn on printf \\x or \\[1-9]
Simon Heimberg <simohe@besonet.ch>
parents:
19378
diff
changeset
|
103 (r'printf.*[^\\]\\x', "don't use printf \\x, use Python"), |
10281 | 104 (r'\$\(.*\)', "don't use $(expr), use `expr`"), |
105 (r'rm -rf \*', "don't use naked rm -rf, target a directory"), | |
15372
695ac6aca77f
check-code: fix issues with finding patterns in unified tests, fix tests
Matt Mackall <mpm@selenic.com>
parents:
15364
diff
changeset
|
106 (r'(^|\|\s*)grep (-\w\s+)*[^|]*[(|]\w', |
10281 | 107 "use egrep for extended grep syntax"), |
108 (r'/bin/', "don't use explicit paths for tools"), | |
109 (r'[^\n]\Z', "no trailing newline"), | |
10658
95c7c4b7e67a
test-merge-default and check-code.py: No "export x=x" in sh
Mads Kiilerich <mads@kiilerich.com>
parents:
10451
diff
changeset
|
110 (r'export.*=', "don't export and assign at once"), |
15372
695ac6aca77f
check-code: fix issues with finding patterns in unified tests, fix tests
Matt Mackall <mpm@selenic.com>
parents:
15364
diff
changeset
|
111 (r'^source\b', "don't use 'source', use '.'"), |
12367
3acd5f7ab9d0
tests: compatibility fix.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
12366
diff
changeset
|
112 (r'touch -d', "don't use 'touch -d', use 'touch -t' instead"), |
15364
572c22c88be6
tests: fix check-code detection of anchored expressions, fix echo -n usage
Matt Mackall <mpm@selenic.com>
parents:
15334
diff
changeset
|
113 (r'ls +[^|\n-]+ +-', "options to 'ls' must come before filenames"), |
15281
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
114 (r'[^>\n]>\s*\$HGRCPATH', "don't overwrite $HGRCPATH, append to it"), |
15372
695ac6aca77f
check-code: fix issues with finding patterns in unified tests, fix tests
Matt Mackall <mpm@selenic.com>
parents:
15364
diff
changeset
|
115 (r'^stop\(\)', "don't use 'stop' as a shell function name"), |
15282
d4addef0ec74
tests: don't use 'test -e'
Mads Kiilerich <mads@kiilerich.com>
parents:
14978
diff
changeset
|
116 (r'(\[|\btest\b).*-e ', "don't use 'test -e', use 'test -f'"), |
16013
2a1d97630f7f
tests: don't use alias
Mads Kiilerich <mads@kiilerich.com>
parents:
15873
diff
changeset
|
117 (r'^alias\b.*=', "don't use alias, use a function"), |
16485
f48b075ff088
tests: solaris sh can not negate exit status with '!'
Mads Kiilerich <mads@kiilerich.com>
parents:
16483
diff
changeset
|
118 (r'if\s*!', "don't use '!' to negate exit status"), |
16494
e1f0305eabe4
tests: don't use /dev/urandom for largefiles testing
Mads Kiilerich <mads@kiilerich.com>
parents:
16487
diff
changeset
|
119 (r'/dev/u?random', "don't use entropy, use /dev/zero"), |
16496
abbabbbe4ec2
tests: use 'do sleep 0' instead of 'do true', also on first line of command
Mads Kiilerich <mads@kiilerich.com>
parents:
16495
diff
changeset
|
120 (r'do\s*true;\s*done', "don't use true as loop body, use sleep 0"), |
16497
c326fe884daa
tests: avoid tab indent on all kinds of lines of sh commands
Mads Kiilerich <mads@kiilerich.com>
parents:
16496
diff
changeset
|
121 (r'^( *)\t', "don't use tabs to indent"), |
19083
12f15e4b2ca0
check-code: fix sed 'i' command rule newline matching
Kevin Bullock <kbullock@ringworld.org>
parents:
19081
diff
changeset
|
122 (r'sed (-e )?\'(\d+|/[^/]*/)i(?!\\\n)', |
19080
5e4491c114b2
check-code: add a rule against a GNU sed-ism
Kevin Bullock <kbullock@ringworld.org>
parents:
19031
diff
changeset
|
123 "put a backslash-escaped newline after sed 'i' command"), |
20598
e57e2da803aa
solaris: diff -u emits "No differences encountered"
Danek Duvall <danek.duvall@oracle.com>
parents:
20532
diff
changeset
|
124 (r'^diff *-\w*u.*$\n(^ \$ |^$)', "prefix diff -u with cmp"), |
24362
58682838f8f7
check-code: enforce the usage of 'seq.py' instead of 'seq'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24205
diff
changeset
|
125 (r'seq ', "don't use 'seq', use $TESTDIR/seq.py") |
14009
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
126 ], |
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
127 # warnings |
16672
d046eb97d21e
tests: run most check-code sh checks on continued lines too
Mads Kiilerich <mads@kiilerich.com>
parents:
16590
diff
changeset
|
128 [ |
d046eb97d21e
tests: run most check-code sh checks on continued lines too
Mads Kiilerich <mads@kiilerich.com>
parents:
16590
diff
changeset
|
129 (r'^function', "don't use 'function', use old style"), |
d046eb97d21e
tests: run most check-code sh checks on continued lines too
Mads Kiilerich <mads@kiilerich.com>
parents:
16590
diff
changeset
|
130 (r'^diff.*-\w*N', "don't use 'diff -N'"), |
18508
813b7a1f7036
tests: use `pwd` instead of ${PWD} in test-convert-git.t - because of Solaris
Mads Kiilerich <mads@kiilerich.com>
parents:
18183
diff
changeset
|
131 (r'\$PWD|\${PWD}', "don't use $PWD, use `pwd`"), |
16672
d046eb97d21e
tests: run most check-code sh checks on continued lines too
Mads Kiilerich <mads@kiilerich.com>
parents:
16590
diff
changeset
|
132 (r'^([^"\'\n]|("[^"\n]*")|(\'[^\'\n]*\'))*\^', "^ must be quoted"), |
18575
667063b22a69
check-code: warn to use killdaemons instead of kill `cat PIDFILE`
Kevin Bullock <kbullock@ringworld.org>
parents:
18508
diff
changeset
|
133 (r'kill (`|\$\()', "don't use kill, use killdaemons.py") |
16672
d046eb97d21e
tests: run most check-code sh checks on continued lines too
Mads Kiilerich <mads@kiilerich.com>
parents:
16590
diff
changeset
|
134 ] |
10281 | 135 ] |
136 | |
137 testfilters = [ | |
138 (r"( *)(#([^\n]*\S)?)", repcomment), | |
139 (r"<<(\S+)((.|\n)*?\n\1)", rephere), | |
140 ] | |
141 | |
18832
a911e5dc2b00
check-code: extract windows glob warning message
Simon Heimberg <simohe@besonet.ch>
parents:
18762
diff
changeset
|
142 winglobmsg = "use (glob) to match Windows paths too" |
15372
695ac6aca77f
check-code: fix issues with finding patterns in unified tests, fix tests
Matt Mackall <mpm@selenic.com>
parents:
15364
diff
changeset
|
143 uprefix = r"^ \$ " |
12364
e128fa4615f2
check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents:
11886
diff
changeset
|
144 utestpats = [ |
14009
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
145 [ |
17347
2da47de36b6f
check-code: fix check for trailing whitespace on continued lines too
Mads Kiilerich <mads@kiilerich.com>
parents:
17346
diff
changeset
|
146 (r'^(\S.*|| [$>] .*)[ \t]\n', "trailing whitespace on non-output"), |
16673
775a8d33e6f0
tests: unify the last sh tests
Mads Kiilerich <mads@kiilerich.com>
parents:
16672
diff
changeset
|
147 (uprefix + r'.*\|\s*sed[^|>\n]*\n', |
775a8d33e6f0
tests: unify the last sh tests
Mads Kiilerich <mads@kiilerich.com>
parents:
16672
diff
changeset
|
148 "use regex test output patterns instead of sed"), |
12364
e128fa4615f2
check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents:
11886
diff
changeset
|
149 (uprefix + r'(true|exit 0)', "explicit zero exit unnecessary"), |
15607
fab28a577a38
test-svn-subrepo: fix reference output for svn 1.7
Patrick Mezard <pmezard@gmail.com>
parents:
15389
diff
changeset
|
150 (uprefix + r'.*(?<!\[)\$\?', "explicit exit code checks unnecessary"), |
12364
e128fa4615f2
check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents:
11886
diff
changeset
|
151 (uprefix + r'.*\|\| echo.*(fail|error)', |
e128fa4615f2
check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents:
11886
diff
changeset
|
152 "explicit exit code checks unnecessary"), |
e128fa4615f2
check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents:
11886
diff
changeset
|
153 (uprefix + r'set -e', "don't use set -e"), |
19873
b3de50b0c7aa
check-code: check that '>' is used for continued lines
Mads Kiilerich <madski@unity3d.com>
parents:
19872
diff
changeset
|
154 (uprefix + r'(\s|fi\b|done\b)', "use > for continued lines"), |
20423
ada289dfceb0
tests: rewrite path in test-shelve.t for not being mangled on msys
Simon Heimberg <simohe@besonet.ch>
parents:
20243
diff
changeset
|
155 (uprefix + r'.*:\.\S*/', "x:.y in a path does not work on msys, rewrite " |
ada289dfceb0
tests: rewrite path in test-shelve.t for not being mangled on msys
Simon Heimberg <simohe@besonet.ch>
parents:
20243
diff
changeset
|
156 "as x://.y, or see `hg log -k msys` for alternatives", r'-\S+:\.|' #-Rxxx |
24205
abcb1ee3b20a
check-code: allow disabling msys path check
Matt Mackall <mpm@selenic.com>
parents:
23936
diff
changeset
|
157 '# no-msys'), # in test-pull.t which is skipped on windows |
18832
a911e5dc2b00
check-code: extract windows glob warning message
Simon Heimberg <simohe@besonet.ch>
parents:
18762
diff
changeset
|
158 (r'^ saved backup bundle to \$TESTTMP.*\.hg$', winglobmsg), |
18835
4e7498a586e8
check-code: fix a check-code failure in check-code
Bryan O'Sullivan <bryano@fb.com>
parents:
18834
diff
changeset
|
159 (r'^ changeset .* references (corrupted|missing) \$TESTTMP/.*[^)]$', |
4e7498a586e8
check-code: fix a check-code failure in check-code
Bryan O'Sullivan <bryano@fb.com>
parents:
18834
diff
changeset
|
160 winglobmsg), |
20014
30eced973b28
check-code: document last ignore regexp
Simon Heimberg <simohe@besonet.ch>
parents:
20013
diff
changeset
|
161 (r'^ pulling from \$TESTTMP/.*[^)]$', winglobmsg, |
30eced973b28
check-code: document last ignore regexp
Simon Heimberg <simohe@besonet.ch>
parents:
20013
diff
changeset
|
162 '\$TESTTMP/unix-repo$'), # in test-issue1802.t which skipped on windows |
23936
30b016ef4bd8
check-code.py: avoid warning against "reverting subrepo ..." lines
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23139
diff
changeset
|
163 (r'^ reverting (?!subrepo ).*/.*[^)]$', winglobmsg), |
20013
38acecdd016c
check-code: drop unneeded ignore patterns
Simon Heimberg <simohe@besonet.ch>
parents:
20012
diff
changeset
|
164 (r'^ cloning subrepo \S+/.*[^)]$', winglobmsg), |
38acecdd016c
check-code: drop unneeded ignore patterns
Simon Heimberg <simohe@besonet.ch>
parents:
20012
diff
changeset
|
165 (r'^ pushing to \$TESTTMP/.*[^)]$', winglobmsg), |
38acecdd016c
check-code: drop unneeded ignore patterns
Simon Heimberg <simohe@besonet.ch>
parents:
20012
diff
changeset
|
166 (r'^ pushing subrepo \S+/\S+ to.*[^)]$', winglobmsg), |
19133
101b80eb7364
tests: check path separator in moves
Brendan Cully <brendan@kublai.com>
parents:
19123
diff
changeset
|
167 (r'^ moving \S+/.*[^)]$', winglobmsg), |
20013
38acecdd016c
check-code: drop unneeded ignore patterns
Simon Heimberg <simohe@besonet.ch>
parents:
20012
diff
changeset
|
168 (r'^ no changes made to subrepo since.*/.*[^)]$', winglobmsg), |
38acecdd016c
check-code: drop unneeded ignore patterns
Simon Heimberg <simohe@besonet.ch>
parents:
20012
diff
changeset
|
169 (r'^ .*: largefile \S+ not available from file:.*/.*[^)]$', winglobmsg), |
20471
ea005e754c9c
tests: lines with largefile .* file://$TESTTMP also match on windows
Simon Heimberg <simohe@besonet.ch>
parents:
20423
diff
changeset
|
170 (r'^ .*file://\$TESTTMP', |
ea005e754c9c
tests: lines with largefile .* file://$TESTTMP also match on windows
Simon Heimberg <simohe@besonet.ch>
parents:
20423
diff
changeset
|
171 'write "file:/*/$TESTTMP" + (glob) to match on windows too'), |
21930
a5168eb9b2bc
tests: cat error messages are different on Solaris
Danek Duvall <danek.duvall@oracle.com>
parents:
21791
diff
changeset
|
172 (r'^ (cat|find): .*: No such file or directory', |
a5168eb9b2bc
tests: cat error messages are different on Solaris
Danek Duvall <danek.duvall@oracle.com>
parents:
21791
diff
changeset
|
173 'use test -f to test for file existence'), |
14009
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
174 ], |
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
175 # warnings |
18683
a343eccd5ee2
check-code: warn about line glob match with no glob character (?*/)
Simon Heimberg <simohe@besonet.ch>
parents:
18575
diff
changeset
|
176 [ |
a343eccd5ee2
check-code: warn about line glob match with no glob character (?*/)
Simon Heimberg <simohe@besonet.ch>
parents:
18575
diff
changeset
|
177 (r'^ [^*?/\n]* \(glob\)$', |
19422
d9e86d656017
check-code: automatically preppend "warning: " to all warning messages
Simon Heimberg <simohe@besonet.ch>
parents:
19382
diff
changeset
|
178 "glob match with no glob character (?*/)"), |
18683
a343eccd5ee2
check-code: warn about line glob match with no glob character (?*/)
Simon Heimberg <simohe@besonet.ch>
parents:
18575
diff
changeset
|
179 ] |
12364
e128fa4615f2
check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents:
11886
diff
changeset
|
180 ] |
e128fa4615f2
check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents:
11886
diff
changeset
|
181 |
14203
b230922eb0c3
check-code: fix checking for sh style in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents:
14169
diff
changeset
|
182 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
|
183 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
|
184 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
|
185 m = tp[1] |
15372
695ac6aca77f
check-code: fix issues with finding patterns in unified tests, fix tests
Matt Mackall <mpm@selenic.com>
parents:
15364
diff
changeset
|
186 if p.startswith(r'^'): |
16672
d046eb97d21e
tests: run most check-code sh checks on continued lines too
Mads Kiilerich <mads@kiilerich.com>
parents:
16590
diff
changeset
|
187 p = r"^ [$>] (%s)" % p[1:] |
14203
b230922eb0c3
check-code: fix checking for sh style in .t tests
Mads Kiilerich <mads@kiilerich.com>
parents:
14169
diff
changeset
|
188 else: |
16672
d046eb97d21e
tests: run most check-code sh checks on continued lines too
Mads Kiilerich <mads@kiilerich.com>
parents:
16590
diff
changeset
|
189 p = r"^ [$>] .*(%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
|
190 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
|
191 |
e128fa4615f2
check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents:
11886
diff
changeset
|
192 utestfilters = [ |
17711
cf204e9829f4
check-code: replace heredocs in unified tests
Idan Kamara <idankk86@gmail.com>
parents:
17620
diff
changeset
|
193 (r"<<(\S+)((.|\n)*?\n > \1)", rephere), |
12364
e128fa4615f2
check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents:
11886
diff
changeset
|
194 (r"( *)(#([^\n]*\S)?)", repcomment), |
e128fa4615f2
check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents:
11886
diff
changeset
|
195 ] |
e128fa4615f2
check-code: add some basic support for unified tests
Matt Mackall <mpm@selenic.com>
parents:
11886
diff
changeset
|
196 |
10281 | 197 pypats = [ |
14009
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
198 [ |
20796
131f7fe06e9e
check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents:
20688
diff
changeset
|
199 (r'\([^)]*\*\w[^()]+\w+=', "can't pass varargs with keyword in Py2.5"), |
11568
d5d4e6a30613
check-code: check for tuple parameter unpacking (missing in py3k)
Renato Cunha <renatoc@gmail.com>
parents:
11522
diff
changeset
|
200 (r'^\s*def\s*\w+\s*\(.*,\s*\(', |
d5d4e6a30613
check-code: check for tuple parameter unpacking (missing in py3k)
Renato Cunha <renatoc@gmail.com>
parents:
11522
diff
changeset
|
201 "tuple parameter unpacking not available in Python 3+"), |
d5d4e6a30613
check-code: check for tuple parameter unpacking (missing in py3k)
Renato Cunha <renatoc@gmail.com>
parents:
11522
diff
changeset
|
202 (r'lambda\s*\(.*,.*\)', |
d5d4e6a30613
check-code: check for tuple parameter unpacking (missing in py3k)
Renato Cunha <renatoc@gmail.com>
parents:
11522
diff
changeset
|
203 "tuple parameter unpacking not available in Python 3+"), |
19793
6fb1b7728719
check-code: new rule to forbid imports of a.b on the same line as other imports
Augie Fackler <raf@durin42.com>
parents:
19745
diff
changeset
|
204 (r'import (.+,[^.]+\.[^.]+|[^.]+\.[^.]+,)', |
6fb1b7728719
check-code: new rule to forbid imports of a.b on the same line as other imports
Augie Fackler <raf@durin42.com>
parents:
19745
diff
changeset
|
205 '2to3 can\'t always rewrite "import qux, foo.bar", ' |
6fb1b7728719
check-code: new rule to forbid imports of a.b on the same line as other imports
Augie Fackler <raf@durin42.com>
parents:
19745
diff
changeset
|
206 'use "import foo.bar" on its own line instead.'), |
11764
16723af520b0
check-code: added a check for calls to the builtin cmp function
Renato Cunha <renatoc@gmail.com>
parents:
11672
diff
changeset
|
207 (r'(?<!def)\s+(cmp)\(', "cmp is not available in Python 3+"), |
11569
f8576644a222
check-code: added check for reduce usage
Renato Cunha <renatoc@gmail.com>
parents:
11568
diff
changeset
|
208 (r'\breduce\s*\(.*', "reduce is not available in Python 3+"), |
20688
a61ed1c2d7a7
check-code: disallow use of dict(key=value) construction
Augie Fackler <raf@durin42.com>
parents:
20598
diff
changeset
|
209 (r'dict\(.*=', 'dict() is different in Py2 and 3 and is slower than {}', |
a61ed1c2d7a7
check-code: disallow use of dict(key=value) construction
Augie Fackler <raf@durin42.com>
parents:
20598
diff
changeset
|
210 'dict-from-generator'), |
11602
ba2520dd1e29
check-code: catch dict.has_key
Martin Geisler <mg@lazybytes.net>
parents:
11601
diff
changeset
|
211 (r'\.has_key\b', "dict.has_key is not available in Python 3+"), |
18183
e1caaeb5a2ed
check-code: disallow defunct <> operator
Augie Fackler <raf@durin42.com>
parents:
18180
diff
changeset
|
212 (r'\s<>\s', '<> operator is not available in Python 3+, use !='), |
10281 | 213 (r'^\s*\t', "don't use tabs"), |
10412
5326800d6937
check-code: import some pylint checks
Matt Mackall <mpm@selenic.com>
parents:
10374
diff
changeset
|
214 (r'\S;\s*\n', "semicolon"), |
21097
e8ef59b351c3
check-code: detect "% inside _()" when there are leading whitespaces
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20870
diff
changeset
|
215 (r'[^_]_\([ \t\n]*(?:"[^"]+"[ \t\n+]*)+%', "don't use % inside _()"), |
e8ef59b351c3
check-code: detect "% inside _()" when there are leading whitespaces
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20870
diff
changeset
|
216 (r"[^_]_\([ \t\n]*(?:'[^']+'[ \t\n+]*)+%", "don't use % inside _()"), |
18054
b35e3364f94a
check-code: there must also be whitespace between ')' and operator
Mads Kiilerich <madski@unity3d.com>
parents:
17957
diff
changeset
|
217 (r'(\w|\)),\w', "missing whitespace after ,"), |
b35e3364f94a
check-code: there must also be whitespace between ')' and operator
Mads Kiilerich <madski@unity3d.com>
parents:
17957
diff
changeset
|
218 (r'(\w|\))[+/*\-<>]\w', "missing whitespace in expression"), |
18055
e440a2c0d944
check-code: make 'missing whitespace in assignment' more aggressive
Mads Kiilerich <madski@unity3d.com>
parents:
18054
diff
changeset
|
219 (r'^\s+(\w|\.)+=\w[^,()\n]*$', "missing whitespace in assignment"), |
22175
2965804483e3
check-code: extend try/except/finally check for multiple except clauses
Matt Mackall <mpm@selenic.com>
parents:
22101
diff
changeset
|
220 (r'(\s+)try:\n((?:\n|\1\s.*\n)+?)(\1except.*?:\n' |
2965804483e3
check-code: extend try/except/finally check for multiple except clauses
Matt Mackall <mpm@selenic.com>
parents:
22101
diff
changeset
|
221 r'((?:\n|\1\s.*\n)+?))+\1finally:', |
2965804483e3
check-code: extend try/except/finally check for multiple except clauses
Matt Mackall <mpm@selenic.com>
parents:
22101
diff
changeset
|
222 'no try/except/finally in Python 2.4'), |
19501
725507cd5216
check-code: add a check for the next() builtin, which was new in 2.6
Augie Fackler <raf@durin42.com>
parents:
19494
diff
changeset
|
223 (r'(?<!def)(\s+|^|\()next\(.+\)', |
725507cd5216
check-code: add a check for the next() builtin, which was new in 2.6
Augie Fackler <raf@durin42.com>
parents:
19494
diff
changeset
|
224 'no next(foo) in Python 2.4 and 2.5, use foo.next() instead'), |
17620
efd1a4378b64
check-code: catch yield inside try/finally (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
17428
diff
changeset
|
225 (r'(\s+)try:\n((?:\n|\1\s.*\n)*?)\1\s*yield\b.*?' |
efd1a4378b64
check-code: catch yield inside try/finally (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
17428
diff
changeset
|
226 r'((?:\n|\1\s.*\n)+?)\1finally:', |
efd1a4378b64
check-code: catch yield inside try/finally (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
17428
diff
changeset
|
227 'no yield inside try/finally in Python 2.4'), |
16702
1751d96d324f
check-code: promote 80+ character line warning to an error
Brodie Rao <brodie@sf.io>
parents:
16683
diff
changeset
|
228 (r'.{81}', "line too long"), |
15372
695ac6aca77f
check-code: fix issues with finding patterns in unified tests, fix tests
Matt Mackall <mpm@selenic.com>
parents:
15364
diff
changeset
|
229 (r' x+[xo][\'"]\n\s+[\'"]x', 'string join across lines with no space'), |
10281 | 230 (r'[^\n]\Z', "no trailing newline"), |
15281
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
231 (r'(\S[ \t]+|^[ \t]+)\n', "trailing whitespace"), |
16683 | 232 # (r'^\s+[^_ \n][^_. \n]+_[^_\n]+\s*=', |
233 # "don't use underbars in identifiers"), | |
15457
1470f8b00694
check-code: enable camelcase check, fix up problems
Matt Mackall <mpm@selenic.com>
parents:
15389
diff
changeset
|
234 (r'^\s+(self\.)?[A-za-z][a-z0-9]+[A-Z]\w* = ', |
1470f8b00694
check-code: enable camelcase check, fix up problems
Matt Mackall <mpm@selenic.com>
parents:
15389
diff
changeset
|
235 "don't use camelcase in identifiers"), |
15281
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
236 (r'^\s*(if|while|def|class|except|try)\s[^[\n]*:\s*[^\\n]#\s]+', |
10286 | 237 "linebreak after :"), |
15281
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
238 (r'class\s[^( \n]+:', "old-style class, use class foo(object)"), |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
239 (r'class\s[^( \n]+\(\):', |
14763
b071cd58af50
check-code: fix class style checking (with tests)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
14709
diff
changeset
|
240 "class foo() not available in Python 2.4, use class foo(object)"), |
13076
a861c7155f09
check-code: single check for Python keywords used as a function
Thomas Arendsen Hein <thomas@jtah.de>
parents:
13074
diff
changeset
|
241 (r'\b(%s)\(' % '|'.join(keyword.kwlist), |
a861c7155f09
check-code: single check for Python keywords used as a function
Thomas Arendsen Hein <thomas@jtah.de>
parents:
13074
diff
changeset
|
242 "Python keyword is not a function"), |
10412
5326800d6937
check-code: import some pylint checks
Matt Mackall <mpm@selenic.com>
parents:
10374
diff
changeset
|
243 (r',]', "unneeded trailing ',' in list"), |
10281 | 244 # (r'class\s[A-Z][^\(]*\((?!Exception)', |
245 # "don't capitalize non-exception classes"), | |
246 # (r'in range\(', "use xrange"), | |
247 # (r'^\s*print\s+', "avoid using print in core and extensions"), | |
248 (r'[\x80-\xff]', "non-ASCII character literal"), | |
249 (r'("\')\.format\(', "str.format() not available in Python 2.4"), | |
250 (r'^\s*with\s+', "with not available in Python 2.4"), | |
14267
6332c02b3d68
check-code: complain about set.isdisjoint
Matt Mackall <mpm@selenic.com>
parents:
14203
diff
changeset
|
251 (r'\.isdisjoint\(', "set.isdisjoint not available in Python 2.4"), |
13160
07d08c130892
check-code: catch "except as"
Matt Mackall <mpm@selenic.com>
parents:
13076
diff
changeset
|
252 (r'^\s*except.* as .*:', "except as not available in Python 2.4"), |
13161
11eb53464e68
check-code: catch os.path.relpath
Matt Mackall <mpm@selenic.com>
parents:
13160
diff
changeset
|
253 (r'^\s*os\.path\.relpath', "relpath not available in Python 2.4"), |
11345
4b81f82b03e3
check-code: reformat long lines
Martin Geisler <mg@aragost.com>
parents:
11343
diff
changeset
|
254 (r'(?<!def)\s+(any|all|format)\(', |
20238
81e905790b30
check-code: do not skip entire file, skip only one match instead
Simon Heimberg <simohe@besonet.ch>
parents:
20014
diff
changeset
|
255 "any/all/format not available in Python 2.4", 'no-py24'), |
10281 | 256 (r'if\s.*\selse', "if ... else form not available in Python 2.4"), |
13074
637627f31c74
check-code: check for gratuitous whitespace after Python keywords
Thomas Arendsen Hein <thomas@jtah.de>
parents:
13031
diff
changeset
|
257 (r'^\s*(%s)\s\s' % '|'.join(keyword.kwlist), |
637627f31c74
check-code: check for gratuitous whitespace after Python keywords
Thomas Arendsen Hein <thomas@jtah.de>
parents:
13031
diff
changeset
|
258 "gratuitous whitespace after Python keyword"), |
15281
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
259 (r'([\(\[][ \t]\S)|(\S[ \t][\)\]])', "gratuitous whitespace in () or []"), |
10281 | 260 # (r'\s\s=', "gratuitous whitespace before ="), |
17167
5f131ae05905
check-code: recognise %= as an operator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17111
diff
changeset
|
261 (r'[^>< ](\+=|-=|!=|<>|<=|>=|<<=|>>=|%=)\S', |
11345
4b81f82b03e3
check-code: reformat long lines
Martin Geisler <mg@aragost.com>
parents:
11343
diff
changeset
|
262 "missing whitespace around operator"), |
17167
5f131ae05905
check-code: recognise %= as an operator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17111
diff
changeset
|
263 (r'[^>< ](\+=|-=|!=|<>|<=|>=|<<=|>>=|%=)\s', |
11345
4b81f82b03e3
check-code: reformat long lines
Martin Geisler <mg@aragost.com>
parents:
11343
diff
changeset
|
264 "missing whitespace around operator"), |
17167
5f131ae05905
check-code: recognise %= as an operator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17111
diff
changeset
|
265 (r'\s(\+=|-=|!=|<>|<=|>=|<<=|>>=|%=)\S', |
11345
4b81f82b03e3
check-code: reformat long lines
Martin Geisler <mg@aragost.com>
parents:
11343
diff
changeset
|
266 "missing whitespace around operator"), |
17167
5f131ae05905
check-code: recognise %= as an operator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17111
diff
changeset
|
267 (r'[^^+=*/!<>&| %-](\s=|=\s)[^= ]', |
11345
4b81f82b03e3
check-code: reformat long lines
Martin Geisler <mg@aragost.com>
parents:
11343
diff
changeset
|
268 "wrong whitespace around ="), |
19872
681f7b9213a4
check-code: check for spaces around = for named parameters
Mads Kiilerich <madski@unity3d.com>
parents:
19793
diff
changeset
|
269 (r'\([^()]*( =[^=]|[^<>!=]= )', |
681f7b9213a4
check-code: check for spaces around = for named parameters
Mads Kiilerich <madski@unity3d.com>
parents:
19793
diff
changeset
|
270 "no whitespace around = for named parameters"), |
10451
63a9bfad50ff
check-code: two more rules
Matt Mackall <mpm@selenic.com>
parents:
10412
diff
changeset
|
271 (r'raise Exception', "don't raise generic exceptions"), |
18180
c582a71457e5
check-code: disallow two-argument form of raise
Augie Fackler <raf@durin42.com>
parents:
18055
diff
changeset
|
272 (r'raise [^,(]+, (\([^\)]+\)|[^,\(\)]+)$', |
c582a71457e5
check-code: disallow two-argument form of raise
Augie Fackler <raf@durin42.com>
parents:
18055
diff
changeset
|
273 "don't use old-style two-argument raise, use Exception(message)"), |
14009
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
274 (r' is\s+(not\s+)?["\'0-9-]', "object comparison with literal"), |
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
275 (r' [=!]=\s+(True|False|None)', |
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
276 "comparison with singleton, use 'is' or 'is not' instead"), |
14494
1ffeeb91c55d
check-code: flag 0/1 used as constant Boolean expression
Martin Geisler <mg@lazybytes.net>
parents:
14303
diff
changeset
|
277 (r'^\s*(while|if) [01]:', |
1ffeeb91c55d
check-code: flag 0/1 used as constant Boolean expression
Martin Geisler <mg@lazybytes.net>
parents:
14303
diff
changeset
|
278 "use True/False for constant Boolean expression"), |
16416
c3aedd526d53
mq: replace hasattr() with util.safehasattr(), update check-code.py
Patrick Mezard <patrick@mezard.eu>
parents:
16364
diff
changeset
|
279 (r'(?:(?<!def)\s+|\()hasattr', |
14978
5a0fdc715769
check-code: disallow use of hasattr()
Augie Fackler <durin42@gmail.com>
parents:
14831
diff
changeset
|
280 'hasattr(foo, bar) is broken, use util.safehasattr(foo, bar) instead'), |
14169
1b4b82063ce2
check-code: disallow calling opener(...).read() and opener(..).write()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14137
diff
changeset
|
281 (r'opener\([^)]*\).read\(', |
1b4b82063ce2
check-code: disallow calling opener(...).read() and opener(..).write()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14137
diff
changeset
|
282 "use opener.read() instead"), |
17428
72803c8edaa4
avoid using abbreviations that look like spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17424
diff
changeset
|
283 (r'BaseException', 'not in Python 2.4, use Exception'), |
72803c8edaa4
avoid using abbreviations that look like spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17424
diff
changeset
|
284 (r'os\.path\.relpath', 'os.path.relpath is not in Python 2.5'), |
14169
1b4b82063ce2
check-code: disallow calling opener(...).read() and opener(..).write()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14137
diff
changeset
|
285 (r'opener\([^)]*\).write\(', |
1b4b82063ce2
check-code: disallow calling opener(...).read() and opener(..).write()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14137
diff
changeset
|
286 "use opener.write() instead"), |
1b4b82063ce2
check-code: disallow calling opener(...).read() and opener(..).write()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14137
diff
changeset
|
287 (r'[\s\(](open|file)\([^)]*\)\.read\(', |
1b4b82063ce2
check-code: disallow calling opener(...).read() and opener(..).write()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14137
diff
changeset
|
288 "use util.readfile() instead"), |
1b4b82063ce2
check-code: disallow calling opener(...).read() and opener(..).write()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14137
diff
changeset
|
289 (r'[\s\(](open|file)\([^)]*\)\.write\(', |
19981
d1e14e7e5b40
check-code: fix an error message
Simon Heimberg <simohe@besonet.ch>
parents:
19873
diff
changeset
|
290 "use util.writefile() instead"), |
14169
1b4b82063ce2
check-code: disallow calling opener(...).read() and opener(..).write()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14137
diff
changeset
|
291 (r'^[\s\(]*(open(er)?|file)\([^)]*\)', |
1b4b82063ce2
check-code: disallow calling opener(...).read() and opener(..).write()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14137
diff
changeset
|
292 "always assign an opened file to a variable, and close it afterwards"), |
1b4b82063ce2
check-code: disallow calling opener(...).read() and opener(..).write()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14137
diff
changeset
|
293 (r'[\s\(](open|file)\([^)]*\)\.', |
1b4b82063ce2
check-code: disallow calling opener(...).read() and opener(..).write()
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14137
diff
changeset
|
294 "always assign an opened file to a variable, and close it afterwards"), |
23139
e53f6b72a0e4
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23134
diff
changeset
|
295 (r'(?i)descend[e]nt', "the proper spelling is descendAnt"), |
14709
6c7283faa967
check-code: don't mark debug messages for translation
Matt Mackall <mpm@selenic.com>
parents:
14549
diff
changeset
|
296 (r'\.debug\(\_', "don't mark debug messages for translation"), |
16590
7f76c97361e0
check-code: catch unnecessary s.strip().split() calls
Martin Geisler <mg@aragost.com>
parents:
16497
diff
changeset
|
297 (r'\.strip\(\)\.split\(\)', "no need to strip before splitting"), |
18762
a91387a37f05
check-code: do not prepend "warning" to a failure message
Simon Heimberg <simohe@besonet.ch>
parents:
18683
diff
changeset
|
298 (r'^\s*except\s*:', "naked except clause", r'#.*re-raises'), |
17299
e51d4aedace9
check-code: indent 4 spaces in py files
Mads Kiilerich <mads@kiilerich.com>
parents:
17167
diff
changeset
|
299 (r':\n( )*( ){1,3}[^ ]', "must indent 4 spaces"), |
17957
fbe43efe4a53
check-code: move i18n check from warning to error
Matt Mackall <mpm@selenic.com>
parents:
17711
diff
changeset
|
300 (r'ui\.(status|progress|write|note|warn)\([\'\"]x', |
fbe43efe4a53
check-code: move i18n check from warning to error
Matt Mackall <mpm@selenic.com>
parents:
17711
diff
changeset
|
301 "missing _() in ui message (use () to hide false-positives)"), |
19031
341083b02d1b
check-code: add check for lock release order
Matt Mackall <mpm@selenic.com>
parents:
18960
diff
changeset
|
302 (r'release\(.*wlock, .*lock\)', "wrong lock release order"), |
22448
8afaf7cef35a
check-code: look for misuse of __bool__
Yuya Nishihara <yuya@tcha.org>
parents:
22175
diff
changeset
|
303 (r'\b__bool__\b', "__bool__ should be __nonzero__ in Python 2"), |
24836
1f9127c9239b
check-code: check os.path.join(*, '') not working correctly with Python 2.7.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24453
diff
changeset
|
304 (r'os\.path\.join\(.*, *(""|\'\')\)', |
1f9127c9239b
check-code: check os.path.join(*, '') not working correctly with Python 2.7.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24453
diff
changeset
|
305 "use pathutil.normasprefix(path) instead of os.path.join(path, '')"), |
14009
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
306 ], |
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
307 # warnings |
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
308 [ |
19999
169cb9e47f8e
check-code: more replacement characters
Simon Heimberg <simohe@besonet.ch>
parents:
19998
diff
changeset
|
309 (r'(^| )pp +xxxxqq[ \n][^\n]', "add two newlines after '.. note::'"), |
14009
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
310 ] |
10281 | 311 ] |
312 | |
313 pyfilters = [ | |
10727
62b8f15683f2
check-code: more tests and more robust python filtering
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10723
diff
changeset
|
314 (r"""(?msx)(?P<comment>\#.*?$)| |
62b8f15683f2
check-code: more tests and more robust python filtering
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10723
diff
changeset
|
315 ((?P<quote>('''|\"\"\"|(?<!')'(?!')|(?<!")"(?!"))) |
62b8f15683f2
check-code: more tests and more robust python filtering
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10723
diff
changeset
|
316 (?P<text>(([^\\]|\\.)*?)) |
62b8f15683f2
check-code: more tests and more robust python filtering
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10723
diff
changeset
|
317 (?P=quote))""", reppython), |
10281 | 318 ] |
319 | |
18960
170fc0949fb6
check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents:
18959
diff
changeset
|
320 txtfilters = [] |
170fc0949fb6
check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents:
18959
diff
changeset
|
321 |
170fc0949fb6
check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents:
18959
diff
changeset
|
322 txtpats = [ |
170fc0949fb6
check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents:
18959
diff
changeset
|
323 [ |
170fc0949fb6
check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents:
18959
diff
changeset
|
324 ('\s$', 'trailing whitespace'), |
20532
f1a3ae7c15df
help: remove last occurrences of ".. note::" without two newlines
Simon Heimberg <simohe@besonet.ch>
parents:
20471
diff
changeset
|
325 ('.. note::[ \n][^\n]', 'add two newlines after note::') |
18960
170fc0949fb6
check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents:
18959
diff
changeset
|
326 ], |
170fc0949fb6
check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents:
18959
diff
changeset
|
327 [] |
170fc0949fb6
check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents:
18959
diff
changeset
|
328 ] |
170fc0949fb6
check-code: check txt files for trailing whitespace
Mads Kiilerich <madski@unity3d.com>
parents:
18959
diff
changeset
|
329 |
10281 | 330 cpats = [ |
14009
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
331 [ |
10281 | 332 (r'//', "don't use //-style comments"), |
333 (r'^ ', "don't use spaces to indent"), | |
334 (r'\S\t', "don't use tabs except for indent"), | |
15281
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
335 (r'(\S[ \t]+|^[ \t]+)\n', "trailing whitespace"), |
16702
1751d96d324f
check-code: promote 80+ character line warning to an error
Brodie Rao <brodie@sf.io>
parents:
16683
diff
changeset
|
336 (r'.{81}', "line too long"), |
10281 | 337 (r'(while|if|do|for)\(', "use space after while/if/do/for"), |
338 (r'return\(', "return is not a function"), | |
339 (r' ;', "no space before ;"), | |
24453
65f1a29685ab
check-code: in C code, prevent space before closing parenthesis
Laurent Charignon <lcharignon@fb.com>
parents:
24362
diff
changeset
|
340 (r'[^;] \)', "no space before )"), |
19745
22a70f31e3e9
check-code: add bracket style check
Matt Mackall <mpm@selenic.com>
parents:
19732
diff
changeset
|
341 (r'[)][{]', "space between ) and {"), |
10281 | 342 (r'\w+\* \w+', "use int *foo, not int* foo"), |
19731
436a3f728375
check-code: make casting style check more precise
Matt Mackall <mpm@selenic.com>
parents:
19628
diff
changeset
|
343 (r'\W\([^\)]+\) \w+', "use (int)foo, not (int) foo"), |
16413
1a420761fcb7
check-code: avoid false-positive on ++
Matt Mackall <mpm@selenic.com>
parents:
16373
diff
changeset
|
344 (r'\w+ (\+\+|--)', "use foo++, not foo ++"), |
10281 | 345 (r'\w,\w', "missing whitespace after ,"), |
13736
f3c4421e121c
osutil: fix up check-code issues
Matt Mackall <mpm@selenic.com>
parents:
13524
diff
changeset
|
346 (r'^[^#]\w[+/*]\w', "missing whitespace in expression"), |
10281 | 347 (r'^#\s+\w', "use #foo, not # foo"), |
348 (r'[^\n]\Z', "no trailing newline"), | |
13748
26f8844d1757
osutil: replace #import with #include, and add a check for it
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13736
diff
changeset
|
349 (r'^\s*#import\b', "use only #include in standard C code"), |
14009
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
350 ], |
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
351 # warnings |
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
352 [] |
10281 | 353 ] |
354 | |
355 cfilters = [ | |
356 (r'(/\*)(((\*(?!/))|[^*])*)\*/', repccomment), | |
10722
c4fb2103e734
check-code: improve quote detection regexp, add tests
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10720
diff
changeset
|
357 (r'''(?P<quote>(?<!")")(?P<text>([^"]|\\")+)"(?!")''', repquote), |
10281 | 358 (r'''(#\s*include\s+<)([^>]+)>''', repinclude), |
359 (r'(\()([^)]+\))', repcallspaces), | |
360 ] | |
361 | |
14137
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
362 inutilpats = [ |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
363 [ |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
364 (r'\bui\.', "don't use ui in util"), |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
365 ], |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
366 # warnings |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
367 [] |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
368 ] |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
369 |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
370 inrevlogpats = [ |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
371 [ |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
372 (r'\brepo\.', "don't use repo in revlog"), |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
373 ], |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
374 # warnings |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
375 [] |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
376 ] |
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
377 |
21487
c26464ce0781
check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents:
21222
diff
changeset
|
378 webtemplatefilters = [] |
c26464ce0781
check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents:
21222
diff
changeset
|
379 |
c26464ce0781
check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents:
21222
diff
changeset
|
380 webtemplatepats = [ |
c26464ce0781
check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents:
21222
diff
changeset
|
381 [], |
c26464ce0781
check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents:
21222
diff
changeset
|
382 [ |
c26464ce0781
check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents:
21222
diff
changeset
|
383 (r'{desc(\|(?!websub|firstline)[^\|]*)+}', |
c26464ce0781
check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents:
21222
diff
changeset
|
384 'follow desc keyword with either firstline or websub'), |
c26464ce0781
check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents:
21222
diff
changeset
|
385 ] |
c26464ce0781
check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents:
21222
diff
changeset
|
386 ] |
c26464ce0781
check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents:
21222
diff
changeset
|
387 |
10281 | 388 checks = [ |
21222
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
389 ('python', r'.*\.(py|cgi)$', r'^#!.*python', pyfilters, pypats), |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
390 ('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
|
391 ('c', r'.*\.[ch]$', '', cfilters, cpats), |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
392 ('unified test', r'.*\.t$', '', utestfilters, utestpats), |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
393 ('layering violation repo in revlog', r'mercurial/revlog\.py', '', |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
394 pyfilters, inrevlogpats), |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
395 ('layering violation ui in util', r'mercurial/util\.py', '', pyfilters, |
14137
83a94c2fe6f4
check-code: check for repo in revlog and ui in util
timeless <timeless@mozdev.org>
parents:
14136
diff
changeset
|
396 inutilpats), |
21222
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
397 ('txt', r'.*\.txt$', '', txtfilters, txtpats), |
21487
c26464ce0781
check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents:
21222
diff
changeset
|
398 ('web template', r'mercurial/templates/.*\.tmpl', '', |
c26464ce0781
check-code: check for consistent usage of the websub filter in hgweb templates
Steven Brown <StevenGBrown@gmail.com>
parents:
21222
diff
changeset
|
399 webtemplatefilters, webtemplatepats), |
10281 | 400 ] |
401 | |
19307
5443d40d524b
check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents:
19168
diff
changeset
|
402 def _preparepats(): |
5443d40d524b
check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents:
19168
diff
changeset
|
403 for c in checks: |
5443d40d524b
check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents:
19168
diff
changeset
|
404 failandwarn = c[-1] |
5443d40d524b
check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents:
19168
diff
changeset
|
405 for pats in failandwarn: |
5443d40d524b
check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents:
19168
diff
changeset
|
406 for i, pseq in enumerate(pats): |
5443d40d524b
check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents:
19168
diff
changeset
|
407 # 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
|
408 p = pseq[0] |
19307
5443d40d524b
check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents:
19168
diff
changeset
|
409 # \s doesn't match \n |
5443d40d524b
check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents:
19168
diff
changeset
|
410 p = re.sub(r'(?<!\\)\\s', r'[ \\t]', p) |
5443d40d524b
check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents:
19168
diff
changeset
|
411 # [^...] doesn't match newline |
5443d40d524b
check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents:
19168
diff
changeset
|
412 p = re.sub(r'(?<!\\)\[\^', r'[^\\n', p) |
5443d40d524b
check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents:
19168
diff
changeset
|
413 |
19308
84faaacbd3fa
check-code: compile all patterns on initialisation
Simon Heimberg <simohe@besonet.ch>
parents:
19307
diff
changeset
|
414 pats[i] = (re.compile(p, re.MULTILINE),) + pseq[1:] |
21222
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
415 filters = c[3] |
19309
7d77fa1cd537
check-code: compile filters when loading
Simon Heimberg <simohe@besonet.ch>
parents:
19308
diff
changeset
|
416 for i, flt in enumerate(filters): |
7d77fa1cd537
check-code: compile filters when loading
Simon Heimberg <simohe@besonet.ch>
parents:
19308
diff
changeset
|
417 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
|
418 _preparepats() |
5443d40d524b
check-code: only fix patterns once
Simon Heimberg <simohe@besonet.ch>
parents:
19168
diff
changeset
|
419 |
10719
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
420 class norepeatlogger(object): |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
421 def __init__(self): |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
422 self._lastseen = None |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
423 |
11604
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
424 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
|
425 """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
|
426 |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
427 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
|
428 of multiple errors. |
10281 | 429 |
10719
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
430 :fname: filename |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
431 :lineno: line number |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
432 :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
|
433 :msg: error message |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
434 """ |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
435 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
|
436 if msgid != self._lastseen: |
11604
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
437 if blame: |
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
438 print "%s:%d (%s):" % (fname, lineno, blame) |
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
439 else: |
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
440 print "%s:%d:" % (fname, lineno) |
10719
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
441 print " > %s" % line |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
442 self._lastseen = msgid |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
443 print " " + msg |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
444 |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
445 _defaultlogger = norepeatlogger() |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
446 |
11604
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
447 def getblame(f): |
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
448 lines = [] |
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
449 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
|
450 start, line = l.split(':', 1) |
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
451 user, rev = start.split() |
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
452 lines.append((line[1:-1], user, rev)) |
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
453 return lines |
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
454 |
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
455 def checkfile(f, logfunc=_defaultlogger.log, maxerr=None, warnings=False, |
15502
7917a104a285
check-code: add --nolineno option for hiding line numbers
Mads Kiilerich <mads@kiilerich.com>
parents:
15457
diff
changeset
|
456 blame=False, debug=False, lineno=True): |
10719
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
457 """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
|
458 |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
459 :f: filepath |
3be9ae49b628
code-code: Add a logfunc argument to checkfile
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10718
diff
changeset
|
460 :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
|
461 logfunc(filename, linenumber, linecontent, errormessage) |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17347
diff
changeset
|
462 :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
|
463 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
|
464 |
fbcccf9ec58f
check-code: add a return value to checkfile function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10719
diff
changeset
|
465 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
|
466 """ |
11604
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
467 blamecache = None |
10720
fbcccf9ec58f
check-code: add a return value to checkfile function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10719
diff
changeset
|
468 result = True |
21222
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
469 |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
470 try: |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
471 fp = open(f) |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
472 except IOError, e: |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
473 print "Skipping %s, %s" % (f, str(e).split(':', 1)[0]) |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
474 return result |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
475 pre = post = fp.read() |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
476 fp.close() |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
477 |
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
478 for name, match, magic, filters, pats in checks: |
14135
673abd432104
check-code: adding debug flag
timeless <timeless@mozdev.org>
parents:
14009
diff
changeset
|
479 if debug: |
673abd432104
check-code: adding debug flag
timeless <timeless@mozdev.org>
parents:
14009
diff
changeset
|
480 print name, f |
10281 | 481 fc = 0 |
21222
4840abc83970
check-code: look at shebang to identify Python scripts
Matt Mackall <mpm@selenic.com>
parents:
21097
diff
changeset
|
482 if not (re.match(match, f) or (magic and re.search(magic, f))): |
14135
673abd432104
check-code: adding debug flag
timeless <timeless@mozdev.org>
parents:
14009
diff
changeset
|
483 if debug: |
673abd432104
check-code: adding debug flag
timeless <timeless@mozdev.org>
parents:
14009
diff
changeset
|
484 print "Skipping %s for %s it doesn't match %s" % ( |
673abd432104
check-code: adding debug flag
timeless <timeless@mozdev.org>
parents:
14009
diff
changeset
|
485 name, match, f) |
10281 | 486 continue |
19382
5aeb03b48ab4
check-code: concatenate "check-code" on compile time
Simon Heimberg <simohe@besonet.ch>
parents:
19380
diff
changeset
|
487 if "no-" "check-code" in pre: |
20239
16b5f498f49c
check-code: always report when a file is skipped by "no-check-code"
Simon Heimberg <simohe@besonet.ch>
parents:
20238
diff
changeset
|
488 print "Skipping %s it has no-" "check-code" % f |
16b5f498f49c
check-code: always report when a file is skipped by "no-check-code"
Simon Heimberg <simohe@besonet.ch>
parents:
20238
diff
changeset
|
489 return "Skip" # skip checking this file |
10281 | 490 for p, r in filters: |
491 post = re.sub(p, r, post) | |
19422
d9e86d656017
check-code: automatically preppend "warning: " to all warning messages
Simon Heimberg <simohe@besonet.ch>
parents:
19382
diff
changeset
|
492 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
|
493 if warnings: |
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
494 pats = pats[0] + pats[1] |
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
495 else: |
64de9ca66511
check-code: separate warnings to avoid repetitive str.startswith
Idan Kamara <idankk86@gmail.com>
parents:
14005
diff
changeset
|
496 pats = pats[0] |
10281 | 497 # 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
|
498 |
14135
673abd432104
check-code: adding debug flag
timeless <timeless@mozdev.org>
parents:
14009
diff
changeset
|
499 if debug: |
673abd432104
check-code: adding debug flag
timeless <timeless@mozdev.org>
parents:
14009
diff
changeset
|
500 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
|
501 |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
502 prelines = None |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
503 errors = [] |
19422
d9e86d656017
check-code: automatically preppend "warning: " to all warning messages
Simon Heimberg <simohe@besonet.ch>
parents:
19382
diff
changeset
|
504 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
|
505 if len(pat) == 3: |
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16704
diff
changeset
|
506 p, msg, ignore = pat |
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16704
diff
changeset
|
507 else: |
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16704
diff
changeset
|
508 p, msg = pat |
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16704
diff
changeset
|
509 ignore = None |
20005
22154ec6fb8b
check-code: prepend warning prefix only once, but for each warning
Simon Heimberg <simohe@besonet.ch>
parents:
19999
diff
changeset
|
510 if i >= nerrs: |
22154ec6fb8b
check-code: prepend warning prefix only once, but for each warning
Simon Heimberg <simohe@besonet.ch>
parents:
19999
diff
changeset
|
511 msg = "warning: " + msg |
16705
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16704
diff
changeset
|
512 |
15281
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
513 pos = 0 |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
514 n = 0 |
19308
84faaacbd3fa
check-code: compile all patterns on initialisation
Simon Heimberg <simohe@besonet.ch>
parents:
19307
diff
changeset
|
515 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
|
516 if prelines is None: |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
517 prelines = pre.splitlines() |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
518 postlines = post.splitlines(True) |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
519 |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
520 start = m.start() |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
521 while n < len(postlines): |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
522 step = len(postlines[n]) |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
523 if pos + step > start: |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
524 break |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
525 pos += step |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
526 n += 1 |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
527 l = prelines[n] |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
528 |
20242
2dad90bdf29d
check-code: drop now unused check-code-ignore
Simon Heimberg <simohe@besonet.ch>
parents:
20241
diff
changeset
|
529 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
|
530 if debug: |
cc09cfea3dd4
check-code: print debug output when an ignore pattern matches
Simon Heimberg <simohe@besonet.ch>
parents:
20242
diff
changeset
|
531 print "Skipping %s for %s:%s (ignore pattern)" % ( |
cc09cfea3dd4
check-code: print debug output when an ignore pattern matches
Simon Heimberg <simohe@besonet.ch>
parents:
20242
diff
changeset
|
532 name, f, n) |
16705
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16704
diff
changeset
|
533 continue |
15281
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
534 bd = "" |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
535 if blame: |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
536 bd = 'working directory' |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
537 if not blamecache: |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
538 blamecache = getblame(f) |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
539 if n < len(blamecache): |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
540 bl, bu, br = blamecache[n] |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
541 if bl == l: |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
542 bd = '%s@%s' % (bu, br) |
20005
22154ec6fb8b
check-code: prepend warning prefix only once, but for each warning
Simon Heimberg <simohe@besonet.ch>
parents:
19999
diff
changeset
|
543 |
15502
7917a104a285
check-code: add --nolineno option for hiding line numbers
Mads Kiilerich <mads@kiilerich.com>
parents:
15457
diff
changeset
|
544 errors.append((f, lineno and n + 1, l, msg, bd)) |
15281
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
545 result = False |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
546 |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
547 errors.sort() |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
548 for e in errors: |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
549 logfunc(*e) |
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
550 fc += 1 |
15873
a153a86a472c
tests: keep track of all check-code.py warnings
Mads Kiilerich <mads@kiilerich.com>
parents:
15611
diff
changeset
|
551 if maxerr and fc >= maxerr: |
10281 | 552 print " (too many errors, giving up)" |
553 break | |
15281
aeeb2afcdc25
check-code: support multiline matches like try/except/finally
Matt Mackall <mpm@selenic.com>
parents:
14978
diff
changeset
|
554 |
10720
fbcccf9ec58f
check-code: add a return value to checkfile function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10719
diff
changeset
|
555 return result |
10717
b1f4fcef99b3
check-code: Add a ``checkfile`` function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10716
diff
changeset
|
556 |
10716
5f92bde72eef
check-code: Only call check-code if __name__ = "__main__".
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10707
diff
changeset
|
557 if __name__ == "__main__": |
10895
217557b26bc7
check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents:
10814
diff
changeset
|
558 parser = optparse.OptionParser("%prog [options] [files]") |
217557b26bc7
check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents:
10814
diff
changeset
|
559 parser.add_option("-w", "--warnings", action="store_true", |
217557b26bc7
check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents:
10814
diff
changeset
|
560 help="include warning-level checks") |
217557b26bc7
check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents:
10814
diff
changeset
|
561 parser.add_option("-p", "--per-file", type="int", |
217557b26bc7
check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents:
10814
diff
changeset
|
562 help="max warnings per file") |
11604
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
563 parser.add_option("-b", "--blame", action="store_true", |
c5d40818b270
check-code: add --blame switch
Matt Mackall <mpm@selenic.com>
parents:
11602
diff
changeset
|
564 help="use annotate to generate blame info") |
14135
673abd432104
check-code: adding debug flag
timeless <timeless@mozdev.org>
parents:
14009
diff
changeset
|
565 parser.add_option("", "--debug", action="store_true", |
673abd432104
check-code: adding debug flag
timeless <timeless@mozdev.org>
parents:
14009
diff
changeset
|
566 help="show debug information") |
15502
7917a104a285
check-code: add --nolineno option for hiding line numbers
Mads Kiilerich <mads@kiilerich.com>
parents:
15457
diff
changeset
|
567 parser.add_option("", "--nolineno", action="store_false", |
7917a104a285
check-code: add --nolineno option for hiding line numbers
Mads Kiilerich <mads@kiilerich.com>
parents:
15457
diff
changeset
|
568 dest='lineno', help="don't show line numbers") |
10895
217557b26bc7
check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents:
10814
diff
changeset
|
569 |
15502
7917a104a285
check-code: add --nolineno option for hiding line numbers
Mads Kiilerich <mads@kiilerich.com>
parents:
15457
diff
changeset
|
570 parser.set_defaults(per_file=15, warnings=False, blame=False, debug=False, |
7917a104a285
check-code: add --nolineno option for hiding line numbers
Mads Kiilerich <mads@kiilerich.com>
parents:
15457
diff
changeset
|
571 lineno=True) |
10895
217557b26bc7
check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents:
10814
diff
changeset
|
572 (options, args) = parser.parse_args() |
217557b26bc7
check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents:
10814
diff
changeset
|
573 |
217557b26bc7
check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents:
10814
diff
changeset
|
574 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
|
575 check = glob.glob("*") |
5f92bde72eef
check-code: Only call check-code if __name__ = "__main__".
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
10707
diff
changeset
|
576 else: |
10895
217557b26bc7
check-code: add a warnings level
Matt Mackall <mpm@selenic.com>
parents:
10814
diff
changeset
|
577 check = args |
10281 | 578 |
15544
53ef627cda30
check-code: fix return code initialization
Mads Kiilerich <mads@kiilerich.com>
parents:
15502
diff
changeset
|
579 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
|
580 for f in check: |
11816
e1359ad582f6
check-code: add exit status
Alecs King <alecsk@gmail.com>
parents:
11764
diff
changeset
|
581 if not checkfile(f, maxerr=options.per_file, warnings=options.warnings, |
15502
7917a104a285
check-code: add --nolineno option for hiding line numbers
Mads Kiilerich <mads@kiilerich.com>
parents:
15457
diff
changeset
|
582 blame=options.blame, debug=options.debug, |
7917a104a285
check-code: add --nolineno option for hiding line numbers
Mads Kiilerich <mads@kiilerich.com>
parents:
15457
diff
changeset
|
583 lineno=options.lineno): |
11816
e1359ad582f6
check-code: add exit status
Alecs King <alecsk@gmail.com>
parents:
11764
diff
changeset
|
584 ret = 1 |
e1359ad582f6
check-code: add exit status
Alecs King <alecsk@gmail.com>
parents:
11764
diff
changeset
|
585 sys.exit(ret) |