tests/test-contrib-check-code.t
changeset 40094 ff47ba7a2903
parent 35315 e223c0438f89
child 41761 e2472b12c842
equal deleted inserted replaced
40093:726cfc47f17a 40094:ff47ba7a2903
     1   $ cat > correct.py <<EOF
     1   $ cat > correct.py <<NO_CHECK_EOF
     2   > def toto(arg1, arg2):
     2   > def toto(arg1, arg2):
     3   >     del arg2
     3   >     del arg2
     4   >     return (5 + 6, 9)
     4   >     return (5 + 6, 9)
     5   > EOF
     5   > NO_CHECK_EOF
     6   $ cat > wrong.py <<EOF
     6   $ cat > wrong.py <<NO_CHECK_EOF
     7   > def toto( arg1, arg2):
     7   > def toto( arg1, arg2):
     8   >     del(arg2)
     8   >     del(arg2)
     9   >     return ( 5+6, 9)
     9   >     return ( 5+6, 9)
    10   > EOF
    10   > NO_CHECK_EOF
    11   $ cat > quote.py <<EOF
    11   $ cat > quote.py <<NO_CHECK_EOF
    12   > # let's use quote in comments
    12   > # let's use quote in comments
    13   > (''' ( 4x5 )
    13   > (''' ( 4x5 )
    14   > but """\\''' and finally''',
    14   > but """\\''' and finally''',
    15   > """let's fool checkpatch""", '1+2',
    15   > """let's fool checkpatch""", '1+2',
    16   > '"""', 42+1, """and
    16   > '"""', 42+1, """and
    17   > ( 4-1 ) """, "( 1+1 )\" and ")
    17   > ( 4-1 ) """, "( 1+1 )\" and ")
    18   > a, '\\\\\\\\', "\\\\\\" x-2", "c-1"
    18   > a, '\\\\\\\\', "\\\\\\" x-2", "c-1"
    19   > EOF
    19   > NO_CHECK_EOF
    20   $ cat > classstyle.py <<EOF
    20   $ cat > classstyle.py <<NO_CHECK_EOF
    21   > class newstyle_class(object):
    21   > class newstyle_class(object):
    22   >     pass
    22   >     pass
    23   > 
    23   > 
    24   > class oldstyle_class:
    24   > class oldstyle_class:
    25   >     pass
    25   >     pass
    27   > class empty():
    27   > class empty():
    28   >     pass
    28   >     pass
    29   > 
    29   > 
    30   > no_class = 1:
    30   > no_class = 1:
    31   >     pass
    31   >     pass
    32   > EOF
    32   > NO_CHECK_EOF
    33   $ check_code="$TESTDIR"/../contrib/check-code.py
    33   $ check_code="$TESTDIR"/../contrib/check-code.py
    34   $ "$check_code" ./wrong.py ./correct.py ./quote.py ./classstyle.py
    34   $ "$check_code" ./wrong.py ./correct.py ./quote.py ./classstyle.py
    35   ./wrong.py:1:
    35   ./wrong.py:1:
    36    > def toto( arg1, arg2):
    36    > def toto( arg1, arg2):
    37    gratuitous whitespace in () or []
    37    gratuitous whitespace in () or []
    50    old-style class, use class foo(object)
    50    old-style class, use class foo(object)
    51   ./classstyle.py:7:
    51   ./classstyle.py:7:
    52    > class empty():
    52    > class empty():
    53    class foo() creates old style object, use class foo(object)
    53    class foo() creates old style object, use class foo(object)
    54   [1]
    54   [1]
    55   $ cat > python3-compat.py << EOF
    55   $ cat > python3-compat.py << NO_CHECK_EOF
    56   > foo <> bar
    56   > foo <> bar
    57   > reduce(lambda a, b: a + b, [1, 2, 3, 4])
    57   > reduce(lambda a, b: a + b, [1, 2, 3, 4])
    58   > dict(key=value)
    58   > dict(key=value)
    59   > EOF
    59   > NO_CHECK_EOF
    60   $ "$check_code" python3-compat.py
    60   $ "$check_code" python3-compat.py
    61   python3-compat.py:1:
    61   python3-compat.py:1:
    62    > foo <> bar
    62    > foo <> bar
    63    <> operator is not available in Python 3+, use !=
    63    <> operator is not available in Python 3+, use !=
    64   python3-compat.py:2:
    64   python3-compat.py:2:
    67   python3-compat.py:3:
    67   python3-compat.py:3:
    68    > dict(key=value)
    68    > dict(key=value)
    69    dict() is different in Py2 and 3 and is slower than {}
    69    dict() is different in Py2 and 3 and is slower than {}
    70   [1]
    70   [1]
    71 
    71 
    72   $ cat > foo.c <<EOF
    72   $ cat > foo.c <<NO_CHECK_EOF
    73   > void narf() {
    73   > void narf() {
    74   > 	strcpy(foo, bar);
    74   > 	strcpy(foo, bar);
    75   > 	// strcpy_s is okay, but this comment is not
    75   > 	// strcpy_s is okay, but this comment is not
    76   > 	strcpy_s(foo, bar);
    76   > 	strcpy_s(foo, bar);
    77   > }
    77   > }
    78   > EOF
    78   > NO_CHECK_EOF
    79   $ "$check_code" ./foo.c
    79   $ "$check_code" ./foo.c
    80   ./foo.c:2:
    80   ./foo.c:2:
    81    > 	strcpy(foo, bar);
    81    > 	strcpy(foo, bar);
    82    don't use strcpy, use strlcpy or memcpy
    82    don't use strcpy, use strlcpy or memcpy
    83   ./foo.c:3:
    83   ./foo.c:3:
    84    > 	// strcpy_s is okay, but this comment is not
    84    > 	// strcpy_s is okay, but this comment is not
    85    don't use //-style comments
    85    don't use //-style comments
    86   [1]
    86   [1]
    87 
    87 
    88   $ cat > is-op.py <<EOF
    88   $ cat > is-op.py <<NO_CHECK_EOF
    89   > # is-operator comparing number or string literal
    89   > # is-operator comparing number or string literal
    90   > x = None
    90   > x = None
    91   > y = x is 'foo'
    91   > y = x is 'foo'
    92   > y = x is "foo"
    92   > y = x is "foo"
    93   > y = x is 5346
    93   > y = x is 5346
    94   > y = x is -6
    94   > y = x is -6
    95   > y = x is not 'foo'
    95   > y = x is not 'foo'
    96   > y = x is not "foo"
    96   > y = x is not "foo"
    97   > y = x is not 5346
    97   > y = x is not 5346
    98   > y = x is not -6
    98   > y = x is not -6
    99   > EOF
    99   > NO_CHECK_EOF
   100 
   100 
   101   $ "$check_code" ./is-op.py
   101   $ "$check_code" ./is-op.py
   102   ./is-op.py:3:
   102   ./is-op.py:3:
   103    > y = x is 'foo'
   103    > y = x is 'foo'
   104    object comparison with literal
   104    object comparison with literal
   123   ./is-op.py:10:
   123   ./is-op.py:10:
   124    > y = x is not -6
   124    > y = x is not -6
   125    object comparison with literal
   125    object comparison with literal
   126   [1]
   126   [1]
   127 
   127 
   128   $ cat > for-nolineno.py <<EOF
   128   $ cat > for-nolineno.py <<NO_CHECK_EOF
   129   > except:
   129   > except:
   130   > EOF
   130   > NO_CHECK_EOF
   131   $ "$check_code" for-nolineno.py --nolineno
   131   $ "$check_code" for-nolineno.py --nolineno
   132   for-nolineno.py:0:
   132   for-nolineno.py:0:
   133    > except:
   133    > except:
   134    naked except clause
   134    naked except clause
   135   [1]
   135   [1]
   136 
   136 
   137   $ cat > warning.t <<EOF
   137   $ cat > warning.t <<NO_CHECK_EOF
   138   >   $ function warnonly {
   138   >   $ function warnonly {
   139   >   > }
   139   >   > }
   140   >   $ diff -N aaa
   140   >   $ diff -N aaa
   141   >   $ function onwarn {}
   141   >   $ function onwarn {}
   142   > EOF
   142   > NO_CHECK_EOF
   143   $ "$check_code" warning.t
   143   $ "$check_code" warning.t
   144   $ "$check_code" --warn warning.t
   144   $ "$check_code" --warn warning.t
   145   warning.t:1:
   145   warning.t:1:
   146    >   $ function warnonly {
   146    >   $ function warnonly {
   147    warning: don't use 'function', use old style
   147    warning: don't use 'function', use old style
   150    warning: don't use 'diff -N'
   150    warning: don't use 'diff -N'
   151   warning.t:4:
   151   warning.t:4:
   152    >   $ function onwarn {}
   152    >   $ function onwarn {}
   153    warning: don't use 'function', use old style
   153    warning: don't use 'function', use old style
   154   [1]
   154   [1]
   155   $ cat > error.t <<EOF
   155   $ cat > error.t <<NO_CHECK_EOF
   156   >   $ [ foo == bar ]
   156   >   $ [ foo == bar ]
   157   > EOF
   157   > NO_CHECK_EOF
   158   $ "$check_code" error.t
   158   $ "$check_code" error.t
   159   error.t:1:
   159   error.t:1:
   160    >   $ [ foo == bar ]
   160    >   $ [ foo == bar ]
   161    [ foo == bar ] is a bashism, use [ foo = bar ] instead
   161    [ foo == bar ] is a bashism, use [ foo = bar ] instead
   162   [1]
   162   [1]
   163   $ rm error.t
   163   $ rm error.t
   164   $ cat > raise-format.py <<EOF
   164   $ cat > raise-format.py <<NO_CHECK_EOF
   165   > raise SomeException, message
   165   > raise SomeException, message
   166   > # this next line is okay
   166   > # this next line is okay
   167   > raise SomeException(arg1, arg2)
   167   > raise SomeException(arg1, arg2)
   168   > EOF
   168   > NO_CHECK_EOF
   169   $ "$check_code" not-existing.py raise-format.py
   169   $ "$check_code" not-existing.py raise-format.py
   170   Skipping*not-existing.py* (glob)
   170   Skipping*not-existing.py* (glob)
   171   raise-format.py:1:
   171   raise-format.py:1:
   172    > raise SomeException, message
   172    > raise SomeException, message
   173    don't use old-style two-argument raise, use Exception(message)
   173    don't use old-style two-argument raise, use Exception(message)
   174   [1]
   174   [1]
   175 
   175 
   176   $ cat <<EOF > tab.t
   176   $ cat <<NO_CHECK_EOF > tab.t
   177   > 	indent
   177   > 	indent
   178   >   > 	heredoc
   178   >   > 	heredoc
   179   > EOF
   179   > NO_CHECK_EOF
   180   $ "$check_code" tab.t
   180   $ "$check_code" tab.t
   181   tab.t:1:
   181   tab.t:1:
   182    > 	indent
   182    > 	indent
   183    don't use tabs to indent
   183    don't use tabs to indent
   184   [1]
   184   [1]
   185   $ rm tab.t
   185   $ rm tab.t
   186 
   186 
   187   $ cat > rst.py <<EOF
   187   $ cat > rst.py <<NO_CHECK_EOF
   188   > """problematic rst text
   188   > """problematic rst text
   189   > 
   189   > 
   190   > .. note::
   190   > .. note::
   191   >     wrong
   191   >     wrong
   192   > """
   192   > """
   211   >   good
   211   >   good
   212   > 
   212   > 
   213   >     .. note::
   213   >     .. note::
   214   >         plus bad
   214   >         plus bad
   215   > """
   215   > """
   216   > EOF
   216   > NO_CHECK_EOF
   217   $ $check_code -w rst.py
   217   $ $check_code -w rst.py
   218   rst.py:3:
   218   rst.py:3:
   219    > .. note::
   219    > .. note::
   220    warning: add two newlines after '.. note::'
   220    warning: add two newlines after '.. note::'
   221   rst.py:26:
   221   rst.py:26:
   222    >     .. note::
   222    >     .. note::
   223    warning: add two newlines after '.. note::'
   223    warning: add two newlines after '.. note::'
   224   [1]
   224   [1]
   225 
   225 
   226   $ cat > ./map-inside-gettext.py <<EOF
   226   $ cat > ./map-inside-gettext.py <<NO_CHECK_EOF
   227   > print(_("map inside gettext %s" % v))
   227   > print(_("map inside gettext %s" % v))
   228   > 
   228   > 
   229   > print(_("concatenating " " by " " space %s" % v))
   229   > print(_("concatenating " " by " " space %s" % v))
   230   > print(_("concatenating " + " by " + " '+' %s" % v))
   230   > print(_("concatenating " + " by " + " '+' %s" % v))
   231   > 
   231   > 
   232   > print(_("mapping operation in different line %s"
   232   > print(_("mapping operation in different line %s"
   233   >         % v))
   233   >         % v))
   234   > 
   234   > 
   235   > print(_(
   235   > print(_(
   236   >         "leading spaces inside of '(' %s" % v))
   236   >         "leading spaces inside of '(' %s" % v))
   237   > EOF
   237   > NO_CHECK_EOF
   238   $ "$check_code" ./map-inside-gettext.py
   238   $ "$check_code" ./map-inside-gettext.py
   239   ./map-inside-gettext.py:1:
   239   ./map-inside-gettext.py:1:
   240    > print(_("map inside gettext %s" % v))
   240    > print(_("map inside gettext %s" % v))
   241    don't use % inside _()
   241    don't use % inside _()
   242   ./map-inside-gettext.py:3:
   242   ./map-inside-gettext.py:3:
   254   [1]
   254   [1]
   255 
   255 
   256 web templates
   256 web templates
   257 
   257 
   258   $ mkdir -p mercurial/templates
   258   $ mkdir -p mercurial/templates
   259   $ cat > mercurial/templates/example.tmpl <<EOF
   259   $ cat > mercurial/templates/example.tmpl <<NO_CHECK_EOF
   260   > {desc}
   260   > {desc}
   261   > {desc|escape}
   261   > {desc|escape}
   262   > {desc|firstline}
   262   > {desc|firstline}
   263   > {desc|websub}
   263   > {desc|websub}
   264   > EOF
   264   > NO_CHECK_EOF
   265 
   265 
   266   $ "$check_code" --warnings mercurial/templates/example.tmpl
   266   $ "$check_code" --warnings mercurial/templates/example.tmpl
   267   mercurial/templates/example.tmpl:2:
   267   mercurial/templates/example.tmpl:2:
   268    > {desc|escape}
   268    > {desc|escape}
   269    warning: follow desc keyword with either firstline or websub
   269    warning: follow desc keyword with either firstline or websub
   270   [1]
   270   [1]
   271 
   271 
   272 'string join across lines with no space' detection
   272 'string join across lines with no space' detection
   273 
   273 
   274   $ cat > stringjoin.py <<EOF
   274   $ cat > stringjoin.py <<NO_CHECK_EOF
   275   > foo = (' foo'
   275   > foo = (' foo'
   276   >        'bar foo.'
   276   >        'bar foo.'
   277   >        'bar foo:'
   277   >        'bar foo:'
   278   >        'bar foo@'
   278   >        'bar foo@'
   279   >        'bar foo%'
   279   >        'bar foo%'
   280   >        'bar foo*'
   280   >        'bar foo*'
   281   >        'bar foo+'
   281   >        'bar foo+'
   282   >        'bar foo-'
   282   >        'bar foo-'
   283   >        'bar')
   283   >        'bar')
   284   > EOF
   284   > NO_CHECK_EOF
   285 
   285 
   286 'missing _() in ui message' detection
   286 'missing _() in ui message' detection
   287 
   287 
   288   $ cat > uigettext.py <<EOF
   288   $ cat > uigettext.py <<NO_CHECK_EOF
   289   > ui.status("% 10s %05d % -3.2f %*s %%"
   289   > ui.status("% 10s %05d % -3.2f %*s %%"
   290   >           # this use '\\\\' instead of '\\', because the latter in
   290   >           # this use '\\\\' instead of '\\', because the latter in
   291   >           # heredoc on shell becomes just '\'
   291   >           # heredoc on shell becomes just '\'
   292   >           '\\\\ \n \t \0'
   292   >           '\\\\ \n \t \0'
   293   >           """12345
   293   >           """12345
   294   >           """
   294   >           """
   295   >           '''.:*+-=
   295   >           '''.:*+-=
   296   >           ''' "%-6d \n 123456 .:*+-= foobar")
   296   >           ''' "%-6d \n 123456 .:*+-= foobar")
   297   > EOF
   297   > NO_CHECK_EOF
   298 
   298 
   299 superfluous pass
   299 superfluous pass
   300 
   300 
   301   $ cat > superfluous_pass.py <<EOF
   301   $ cat > superfluous_pass.py <<NO_CHECK_EOF
   302   > # correct examples
   302   > # correct examples
   303   > if foo:
   303   > if foo:
   304   >     pass
   304   >     pass
   305   > else:
   305   > else:
   306   >     # comment-only line means still need pass
   306   >     # comment-only line means still need pass
   324   > class empty(object):
   324   > class empty(object):
   325   >     """multiline
   325   >     """multiline
   326   >     docstring also
   326   >     docstring also
   327   >     means no pass"""
   327   >     means no pass"""
   328   >     pass
   328   >     pass
   329   > EOF
   329   > NO_CHECK_EOF
   330 
   330 
   331 (Checking multiple invalid files at once examines whether caching
   331 (Checking multiple invalid files at once examines whether caching
   332 translation table for repquote() works as expected or not. All files
   332 translation table for repquote() works as expected or not. All files
   333 should break rules depending on result of repquote(), in this case)
   333 should break rules depending on result of repquote(), in this case)
   334 
   334