forked from pool/rpmlint
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
|
#############################################################################
|
||
|
# File : BashismsCheck.py
|
||
|
# Package : rpmlint
|
||
|
# Author : Guido Berhoerster
|
||
|
# Purpose : check /bin/sh shell scripts for bashisms
|
||
|
#############################################################################
|
||
|
|
||
|
import re
|
||
|
import AbstractCheck
|
||
|
import Config
|
||
|
import Pkg
|
||
|
from Filter import *
|
||
|
|
||
|
class BashismsCheck(AbstractCheck.AbstractFilesCheck):
|
||
|
RE_BIN_SH = re.compile('#!\s*(/usr)?/bin/sh(\s+|$)')
|
||
|
|
||
|
def __init__(self):
|
||
|
AbstractCheck.AbstractFilesCheck.__init__(self, "BashismsCheck", ".*")
|
||
|
|
||
|
def check_file(self, pkg, filename):
|
||
|
try:
|
||
|
f = open(filename)
|
||
|
except:
|
||
|
return
|
||
|
try:
|
||
|
first_line = f.read(256).split("\n")[0]
|
||
|
if self.RE_BIN_SH.match(first_line):
|
||
|
status, output = Pkg.getstatusoutput(["dash", "-n", filename])
|
||
|
if status == 2:
|
||
|
printWarning(pkg, "bin-sh-syntax-error", filename)
|
||
|
status, output = Pkg.getstatusoutput(["checkbashisms", filename])
|
||
|
if status == 1:
|
||
|
printInfo(pkg, "potential-bashisms", filename)
|
||
|
finally:
|
||
|
f.close()
|
||
|
|
||
|
check = BashismsCheck()
|
||
|
|
||
|
if Config.info:
|
||
|
addDetails('bin-sh-syntax-error',
|
||
|
'''A /bin/sh shell script contains a syntax error.''',
|
||
|
'potential-bashisms',
|
||
|
'''checkbashisms reported potential bashisms in a /bin/sh shell
|
||
|
script, you might want to manually check this script for bashisms.''')
|