contrib/check-code.py
changeset 16672 d046eb97d21e
parent 16590 7f76c97361e0
child 16673 775a8d33e6f0
equal deleted inserted replaced
16671:05b55f5ff8d1 16672:d046eb97d21e
    43 
    43 
    44 testpats = [
    44 testpats = [
    45   [
    45   [
    46     (r'pushd|popd', "don't use 'pushd' or 'popd', use 'cd'"),
    46     (r'pushd|popd', "don't use 'pushd' or 'popd', use 'cd'"),
    47     (r'\W\$?\(\([^\)\n]*\)\)', "don't use (()) or $(()), use 'expr'"),
    47     (r'\W\$?\(\([^\)\n]*\)\)', "don't use (()) or $(()), use 'expr'"),
    48     (r'^function', "don't use 'function', use old style"),
       
    49     (r'grep.*-q', "don't use 'grep -q', redirect to /dev/null"),
    48     (r'grep.*-q', "don't use 'grep -q', redirect to /dev/null"),
    50     (r'sed.*-i', "don't use 'sed -i', use a temporary file"),
    49     (r'sed.*-i', "don't use 'sed -i', use a temporary file"),
    51     (r'echo.*\\n', "don't use 'echo \\n', use printf"),
    50     (r'echo.*\\n', "don't use 'echo \\n', use printf"),
    52     (r'echo -n', "don't use 'echo -n', use printf"),
    51     (r'echo -n', "don't use 'echo -n', use printf"),
    53     (r'^diff.*-\w*N', "don't use 'diff -N'"),
       
    54     (r'(^| )wc[^|]*$\n(?!.*\(re\))', "filter wc output"),
    52     (r'(^| )wc[^|]*$\n(?!.*\(re\))', "filter wc output"),
    55     (r'head -c', "don't use 'head -c', use 'dd'"),
    53     (r'head -c', "don't use 'head -c', use 'dd'"),
    56     (r'sha1sum', "don't use sha1sum, use $TESTDIR/md5sum.py"),
    54     (r'sha1sum', "don't use sha1sum, use $TESTDIR/md5sum.py"),
    57     (r'ls.*-\w*R', "don't use 'ls -R', use 'find'"),
    55     (r'ls.*-\w*R', "don't use 'ls -R', use 'find'"),
    58     (r'printf.*\\([1-9]|0\d)', "don't use 'printf \NNN', use Python"),
    56     (r'printf.*\\([1-9]|0\d)', "don't use 'printf \NNN', use Python"),
    60     (r'\$\(.*\)', "don't use $(expr), use `expr`"),
    58     (r'\$\(.*\)', "don't use $(expr), use `expr`"),
    61     (r'rm -rf \*', "don't use naked rm -rf, target a directory"),
    59     (r'rm -rf \*', "don't use naked rm -rf, target a directory"),
    62     (r'(^|\|\s*)grep (-\w\s+)*[^|]*[(|]\w',
    60     (r'(^|\|\s*)grep (-\w\s+)*[^|]*[(|]\w',
    63      "use egrep for extended grep syntax"),
    61      "use egrep for extended grep syntax"),
    64     (r'/bin/', "don't use explicit paths for tools"),
    62     (r'/bin/', "don't use explicit paths for tools"),
    65     (r'\$PWD', "don't use $PWD, use `pwd`"),
       
    66     (r'[^\n]\Z', "no trailing newline"),
    63     (r'[^\n]\Z', "no trailing newline"),
    67     (r'export.*=', "don't export and assign at once"),
    64     (r'export.*=', "don't export and assign at once"),
    68     (r'^([^"\'\n]|("[^"\n]*")|(\'[^\'\n]*\'))*\^', "^ must be quoted"),
       
    69     (r'^source\b', "don't use 'source', use '.'"),
    65     (r'^source\b', "don't use 'source', use '.'"),
    70     (r'touch -d', "don't use 'touch -d', use 'touch -t' instead"),
    66     (r'touch -d', "don't use 'touch -d', use 'touch -t' instead"),
    71     (r'ls +[^|\n-]+ +-', "options to 'ls' must come before filenames"),
    67     (r'ls +[^|\n-]+ +-', "options to 'ls' must come before filenames"),
    72     (r'[^>\n]>\s*\$HGRCPATH', "don't overwrite $HGRCPATH, append to it"),
    68     (r'[^>\n]>\s*\$HGRCPATH', "don't overwrite $HGRCPATH, append to it"),
    73     (r'^stop\(\)', "don't use 'stop' as a shell function name"),
    69     (r'^stop\(\)', "don't use 'stop' as a shell function name"),
    77     (r'/dev/u?random', "don't use entropy, use /dev/zero"),
    73     (r'/dev/u?random', "don't use entropy, use /dev/zero"),
    78     (r'do\s*true;\s*done', "don't use true as loop body, use sleep 0"),
    74     (r'do\s*true;\s*done', "don't use true as loop body, use sleep 0"),
    79     (r'^( *)\t', "don't use tabs to indent"),
    75     (r'^( *)\t', "don't use tabs to indent"),
    80   ],
    76   ],
    81   # warnings
    77   # warnings
    82   []
    78   [
       
    79     (r'^function', "don't use 'function', use old style"),
       
    80     (r'^diff.*-\w*N', "don't use 'diff -N'"),
       
    81     (r'\$PWD', "don't use $PWD, use `pwd`"),
       
    82     (r'^([^"\'\n]|("[^"\n]*")|(\'[^\'\n]*\'))*\^', "^ must be quoted"),
       
    83   ]
    83 ]
    84 ]
    84 
    85 
    85 testfilters = [
    86 testfilters = [
    86     (r"( *)(#([^\n]*\S)?)", repcomment),
    87     (r"( *)(#([^\n]*\S)?)", repcomment),
    87     (r"<<(\S+)((.|\n)*?\n\1)", rephere),
    88     (r"<<(\S+)((.|\n)*?\n\1)", rephere),
   104 ]
   105 ]
   105 
   106 
   106 for i in [0, 1]:
   107 for i in [0, 1]:
   107     for p, m in testpats[i]:
   108     for p, m in testpats[i]:
   108         if p.startswith(r'^'):
   109         if p.startswith(r'^'):
   109             p = r"^  \$ (%s)" % p[1:]
   110             p = r"^  [$>] (%s)" % p[1:]
   110         else:
   111         else:
   111             p = r"^  \$ .*(%s)" % p
   112             p = r"^  [$>] .*(%s)" % p
   112         utestpats[i].append((p, m))
   113         utestpats[i].append((p, m))
   113 
   114 
   114 utestfilters = [
   115 utestfilters = [
   115     (r"( *)(#([^\n]*\S)?)", repcomment),
   116     (r"( *)(#([^\n]*\S)?)", repcomment),
   116 ]
   117 ]