Mercurial > public > mercurial-scm > hg-stable
comparison contrib/check-code.py @ 29278:5eda83fb09fc
check-code: centralize rules depending on implementation of repquote
This decreases the cost of checking which regexp should be adjusted at
change of repquote().
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Tue, 31 May 2016 21:02:30 +0900 |
parents | 79a11506803f |
children | 438caf194160 |
comparison
equal
deleted
inserted
replaced
29277:79a11506803f | 29278:5eda83fb09fc |
---|---|
49 except re2.error: | 49 except re2.error: |
50 pass | 50 pass |
51 return re.compile(pat) | 51 return re.compile(pat) |
52 | 52 |
53 def repquote(m): | 53 def repquote(m): |
54 # check "rules depending on implementation of repquote()" in each | |
55 # patterns (especially pypats), before changing this function | |
54 fixedmap = {' ': ' ', '\n': '\n', '.': 'p', ':': 'q'} | 56 fixedmap = {' ': ' ', '\n': '\n', '.': 'p', ':': 'q'} |
55 def encodechr(i): | 57 def encodechr(i): |
56 if i > 255: | 58 if i > 255: |
57 return 'u' | 59 return 'u' |
58 c = chr(i) | 60 c = chr(i) |
242 (r'(\w|\)),\w', "missing whitespace after ,"), | 244 (r'(\w|\)),\w', "missing whitespace after ,"), |
243 (r'(\w|\))[+/*\-<>]\w', "missing whitespace in expression"), | 245 (r'(\w|\))[+/*\-<>]\w', "missing whitespace in expression"), |
244 (r'^\s+(\w|\.)+=\w[^,()\n]*$', "missing whitespace in assignment"), | 246 (r'^\s+(\w|\.)+=\w[^,()\n]*$', "missing whitespace in assignment"), |
245 (r'\w\s=\s\s+\w', "gratuitous whitespace after ="), | 247 (r'\w\s=\s\s+\w', "gratuitous whitespace after ="), |
246 (r'.{81}', "line too long"), | 248 (r'.{81}', "line too long"), |
247 (r' x+[xpqo][\'"]\n\s+[\'"]x', 'string join across lines with no space'), | |
248 (r'[^\n]\Z', "no trailing newline"), | 249 (r'[^\n]\Z', "no trailing newline"), |
249 (r'(\S[ \t]+|^[ \t]+)\n', "trailing whitespace"), | 250 (r'(\S[ \t]+|^[ \t]+)\n', "trailing whitespace"), |
250 # (r'^\s+[^_ \n][^_. \n]+_[^_\n]+\s*=', | 251 # (r'^\s+[^_ \n][^_. \n]+_[^_\n]+\s*=', |
251 # "don't use underbars in identifiers"), | 252 # "don't use underbars in identifiers"), |
252 (r'^\s+(self\.)?[A-za-z][a-z0-9]+[A-Z]\w* = ', | 253 (r'^\s+(self\.)?[A-za-z][a-z0-9]+[A-Z]\w* = ', |
309 (r'\.strip\(\)\.split\(\)', "no need to strip before splitting"), | 310 (r'\.strip\(\)\.split\(\)', "no need to strip before splitting"), |
310 (r'^\s*except\s*:', "naked except clause", r'#.*re-raises'), | 311 (r'^\s*except\s*:', "naked except clause", r'#.*re-raises'), |
311 (r'^\s*except\s([^\(,]+|\([^\)]+\))\s*,', | 312 (r'^\s*except\s([^\(,]+|\([^\)]+\))\s*,', |
312 'legacy exception syntax; use "as" instead of ","'), | 313 'legacy exception syntax; use "as" instead of ","'), |
313 (r':\n( )*( ){1,3}[^ ]', "must indent 4 spaces"), | 314 (r':\n( )*( ){1,3}[^ ]', "must indent 4 spaces"), |
314 (r'ui\.(status|progress|write|note|warn)\([\'\"]x', | |
315 "missing _() in ui message (use () to hide false-positives)"), | |
316 (r'release\(.*wlock, .*lock\)', "wrong lock release order"), | 315 (r'release\(.*wlock, .*lock\)', "wrong lock release order"), |
317 (r'\b__bool__\b', "__bool__ should be __nonzero__ in Python 2"), | 316 (r'\b__bool__\b', "__bool__ should be __nonzero__ in Python 2"), |
318 (r'os\.path\.join\(.*, *(""|\'\')\)', | 317 (r'os\.path\.join\(.*, *(""|\'\')\)', |
319 "use pathutil.normasprefix(path) instead of os.path.join(path, '')"), | 318 "use pathutil.normasprefix(path) instead of os.path.join(path, '')"), |
320 (r'\s0[0-7]+\b', 'legacy octal syntax; use "0o" prefix instead of "0"'), | 319 (r'\s0[0-7]+\b', 'legacy octal syntax; use "0o" prefix instead of "0"'), |
323 (r'\butil\.Abort\b', "directly use error.Abort"), | 322 (r'\butil\.Abort\b', "directly use error.Abort"), |
324 (r'^import Queue', "don't use Queue, use util.queue + util.empty"), | 323 (r'^import Queue', "don't use Queue, use util.queue + util.empty"), |
325 (r'^import cStringIO', "don't use cStringIO.StringIO, use util.stringio"), | 324 (r'^import cStringIO', "don't use cStringIO.StringIO, use util.stringio"), |
326 (r'^import urllib', "don't use urllib, use util.urlreq/util.urlerr"), | 325 (r'^import urllib', "don't use urllib, use util.urlreq/util.urlerr"), |
327 (r'\.next\(\)', "don't use .next(), use next(...)"), | 326 (r'\.next\(\)', "don't use .next(), use next(...)"), |
327 | |
328 # rules depending on implementation of repquote() | |
329 (r' x+[xpqo][\'"]\n\s+[\'"]x', 'string join across lines with no space'), | |
330 (r'ui\.(status|progress|write|note|warn)\([\'\"]x', | |
331 "missing _() in ui message (use () to hide false-positives)"), | |
328 ], | 332 ], |
329 # warnings | 333 # warnings |
330 [ | 334 [ |
335 # rules depending on implementation of repquote() | |
331 (r'(^| )pp +xxxxqq[ \n][^\n]', "add two newlines after '.. note::'"), | 336 (r'(^| )pp +xxxxqq[ \n][^\n]', "add two newlines after '.. note::'"), |
332 ] | 337 ] |
333 ] | 338 ] |
334 | 339 |
335 pyfilters = [ | 340 pyfilters = [ |
370 (r'^#\s+\w', "use #foo, not # foo"), | 375 (r'^#\s+\w', "use #foo, not # foo"), |
371 (r'[^\n]\Z', "no trailing newline"), | 376 (r'[^\n]\Z', "no trailing newline"), |
372 (r'^\s*#import\b', "use only #include in standard C code"), | 377 (r'^\s*#import\b', "use only #include in standard C code"), |
373 (r'strcpy\(', "don't use strcpy, use strlcpy or memcpy"), | 378 (r'strcpy\(', "don't use strcpy, use strlcpy or memcpy"), |
374 (r'strcat\(', "don't use strcat"), | 379 (r'strcat\(', "don't use strcat"), |
380 | |
381 # rules depending on implementation of repquote() | |
375 ], | 382 ], |
376 # warnings | 383 # warnings |
377 [] | 384 [ |
385 # rules depending on implementation of repquote() | |
386 ] | |
378 ] | 387 ] |
379 | 388 |
380 cfilters = [ | 389 cfilters = [ |
381 (r'(/\*)(((\*(?!/))|[^*])*)\*/', repccomment), | 390 (r'(/\*)(((\*(?!/))|[^*])*)\*/', repccomment), |
382 (r'''(?P<quote>(?<!")")(?P<text>([^"]|\\")+)"(?!")''', repquote), | 391 (r'''(?P<quote>(?<!")")(?P<text>([^"]|\\")+)"(?!")''', repquote), |