Add a new "ebuild.patches" check for the PATCHES variable that's used by
authorZac Medico <zmedico@gentoo.org>
Sat, 29 Mar 2008 03:29:24 +0000 (03:29 -0000)
committerZac Medico <zmedico@gentoo.org>
Sat, 29 Mar 2008 03:29:24 +0000 (03:29 -0000)
base_src_unpack() from base.eclass. This generates a warning if the variable
is not defined as an array, since this is required for white space safety.
Thanks to Betelgeuse for the initial patch.

svn path=/main/trunk/; revision=9587

bin/repoman
man/repoman.1
pym/repoman/checks.py
pym/repoman/errors.py

index 1ebf71d587808935659aace6eeaa4c616eb24781..4b6d4b52d7943940dfe1fff6f75913b357cc2dbb 100755 (executable)
@@ -244,6 +244,7 @@ qahelp={
        "changelog.missing":"Missing ChangeLog files",
        "ebuild.disjointed":"Ebuilds not added to cvs when the matching digest has been added",
        "ebuild.notadded":"Ebuilds that exist but have not been added to cvs",
+       "ebuild.patches":"PATCHES variable should be a bash array to ensure white space safety",
        "changelog.notadded":"ChangeLogs that exist but have not been added to cvs",
        "filedir.missing":"Package lacks a files directory",
        "file.executable":"Ebuilds, digests, metadata.xml, Manifest, and ChangeLog do note need the executable bit",
@@ -326,6 +327,7 @@ qawarnings=[
 "RESTRICT.invalid",
 "ebuild.minorsyn",
 "ebuild.badheader",
+"ebuild.patches",
 "file.size",
 "java.eclassesnotused",
 "metadata.missing",
index 649356acec2d55c5ca8926d5a083778f601d5a80..b8ab6d9b2ffb2ca01cccceb7e9263e857ee15efe 100644 (file)
@@ -219,6 +219,9 @@ Ebuilds that exist but have not been added to cvs
 .B ebuild.output
 A simple sourcing of the ebuild produces output; this breaks ebuild policy.
 .TP
+.B ebuild.patches
+PATCHES variable should be a bash array to ensure white space safety
+.TP
 .B ebuild.syntax
 Error generating cache entry for ebuild; typically caused by ebuild syntax error
 or digest verification failure.
index aa5bf18453cf568b7aba12663b8052f7ce1a6303..bc1c2911547fa38ebcd62175f4fae259301463e1 100644 (file)
@@ -18,8 +18,8 @@ class LineCheck(object):
 
        def check(self, num, line):
                """Run the check on line and return error if there is one"""
-               pass
-
+               if self.re.match(line):
+                       return self.error
 
 class EbuildHeader(LineCheck):
        """Ensure ebuilds have proper headers
@@ -191,6 +191,11 @@ class EbuildUselessCdS(LineCheck):
                elif self.method_re.match(line):
                        self.check_next_line = True
 
+class EbuildPatches(LineCheck):
+       """Ensure ebuilds use bash arrays for PATCHES to ensure white space safety"""
+       repoman_check_name = 'ebuild.patches'
+       re = re.compile(r'^\s*PATCHES=[^\(]')
+       error = errors.PATCHES_ERROR
 
 class EbuildQuotedA(LineCheck):
        """Ensure ebuilds have no quoting around ${A}"""
@@ -206,7 +211,8 @@ class EbuildQuotedA(LineCheck):
 _constant_checks = tuple((c() for c in (
        EbuildWhitespace, EbuildQuote,
        EbuildAssignment, EbuildUselessDodoc,
-       EbuildUselessCdS, EbuildNestedDie, EbuildQuotedA)))
+       EbuildUselessCdS, EbuildNestedDie,
+       EbuildPatches, EbuildQuotedA)))
 
 def run_checks(contents, st_mtime):
        checks = list(_constant_checks)
index d1aad1d8a2ed7850d453f2e4ff0c35d02a414fe6..90fa83820295bba178dc2a480754d9f8dceb2484 100644 (file)
@@ -11,4 +11,5 @@ TRAILING_WHITESPACE_ERROR = 'Trailing whitespace error on line: %d'
 READONLY_ASSIGNMENT_ERROR = 'Ebuild contains assignment to read-only variable on line: %d'
 MISSING_QUOTES_ERROR = 'Unquoted Variable on line: %d'
 NESTED_DIE_ERROR = 'Ebuild calls die in a subshell on line: %d'
+PATCHES_ERROR = 'PATCHES is not a bash array on line: %d'
 REDUNDANT_CD_S_ERROR = 'Ebuild has redundant cd ${S} statement on line: %d'