try:
from repoman.checks import EbuildWhitespace, EbuildHeader, EbuildQuote, \
- EbuildAssignment, EbuildNestedDie, EbuildUselessDodoc
+ EbuildAssignment, EbuildNestedDie, EbuildUselessDodoc, EbuildUselessCdS
except ImportError:
from os import path as osp
sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), 'pym'))
from repoman.checks import EbuildWhitespace, EbuildHeader, EbuildQuote, \
- EbuildAssignment, EbuildNestedDie, EbuildUselessDodoc
+ EbuildAssignment, EbuildNestedDie, EbuildUselessDodoc, EbuildUselessCdS
try:
import cStringIO as StringIO
myear = time.gmtime(os.stat(path)[ST_MTIME])[0]
contents = StringIO.StringIO(open(path, 'rb').read())
for check in (EbuildWhitespace, EbuildQuote,
- EbuildAssignment, EbuildUselessDodoc):
+ EbuildAssignment, EbuildUselessDodoc, EbuildUselessCdS):
c = check(contents)
errors = c.Run()
for e in errors:
from repoman.errors import COPYRIGHT_ERROR, LICENSE_ERROR, CVS_HEADER_ERROR, \
LEADING_SPACES_ERROR, READONLY_ASSIGNMENT_ERROR, TRAILING_WHITESPACE_ERROR, \
- MISSING_QUOTES_ERROR, NESTED_DIE_ERROR
+ MISSING_QUOTES_ERROR, NESTED_DIE_ERROR, REDUNDANT_CD_S_ERROR
class ContentCheckException(Exception):
errors.append((num + 1, "Useless dodoc '%s'" % \
(match.group(2), ) + " on line: %d"))
return errors
+
+class EbuildUselessCdS(ContentCheck):
+ """Check for redundant cd ${S} statements"""
+ repoman_check_name = 'ebuild.minorsyn'
+ method_re = re.compile(r'^\s*src_(compile|install|test)\s*\(\)')
+ cds_re = re.compile(r'^\s*cd\s+"\$(\{S\}|S)"\s')
+
+ def __init__(self, contents):
+ ContentCheck.__init__(self, contents)
+
+ def Run(self):
+ errors = []
+ check_next_line = False
+ for num, line in enumerate(self.contents):
+ if check_next_line:
+ check_next_line = False
+ if self.cds_re.match(line):
+ errors.append((num + 1, REDUNDANT_CD_S_ERROR))
+ elif self.method_re.match(line):
+ check_next_line = True
+ return errors
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'
+REDUNDANT_CD_S_ERROR = 'Ebuild has redundant cd ${S} statement on line: %d'