Merge branch 'modernize-pylint' into 'master'

modernize pylint

See merge request !252
This commit is contained in:
Torsten Grote 2017-05-25 14:00:36 +00:00
commit fe2d65df73
9 changed files with 75 additions and 73 deletions

View file

@ -1,39 +0,0 @@
#
# started from http://www.logilab.org/blogentry/78354
#
from logilab.astng import MANAGER
from logilab.astng.builder import ASTNGBuilder
def hashlib_transform(module):
if module.name == 'hashlib':
fake = ASTNGBuilder(MANAGER).string_build('''
class fakehash(object):
digest_size = -1
def __init__(self, value): pass
def digest(self):
return u''
def hexdigest(self):
return u''
def update(self, value): pass
class md5(fakehash):
pass
class sha1(fakehash):
pass
class sha256(fakehash):
pass
''')
for hashfunc in ('sha256', 'sha1', 'md5'):
module.locals[hashfunc] = fake.locals[hashfunc]
def register(linter):
"""called when loaded by pylint --load-plugins, register our tranformation
function here
"""
MANAGER.register_transformer(hashlib_transform)

45
.pylint-rcfile Normal file
View file

@ -0,0 +1,45 @@
[MASTER]
# Use multiple processes to speed up Pylint.
jobs=4
# Allow loading of arbitrary C extensions. Extensions are imported into the
# active Python interpreter and may run arbitrary code.
unsafe-load-any-extension=no
[MESSAGES CONTROL]
# Only show warnings with the listed confidence levels. Leave empty to show
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
confidence=HIGH,INFERENCE
# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifiers separated by comma (,) or put this
# option multiple times (only on the command line, not in the configuration
# file where it should appear only once).You can also use "--disable=all" to
# disable everything first and then reenable specific checks. For example, if
# you want to run only the similarities checker, you can use "--disable=all
# --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use"--disable=all --enable=classes
# --disable=W"
disable=invalid-name,missing-docstring,no-member
[MISCELLANEOUS]
# List of note tags to take in consideration, separated by a comma.
notes=FIXME,XXX,TODO
[BASIC]
# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_,e,f,fp
[ELIF]
# Maximum number of nested blocks for function / method body
max-nested-blocks=5

View file

@ -735,7 +735,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext
src = os.path.normpath(apks[0]) src = os.path.normpath(apks[0])
# Make sure it's not debuggable... # Make sure it's not debuggable...
if common.isApkAndDebuggable(src, config): if common.isApkAndDebuggable(src):
raise BuildException("APK is debuggable") raise BuildException("APK is debuggable")
# By way of a sanity check, make sure the version and version # By way of a sanity check, make sure the version and version

View file

@ -241,7 +241,7 @@ def check_repomanifest(app, branch=None):
return (None, msg) return (None, msg)
def check_repotrunk(app, branch=None): def check_repotrunk(app):
try: try:
if app.RepoType == 'srclib': if app.RepoType == 'srclib':
@ -370,7 +370,7 @@ def fetch_autoname(app, tag):
return commitmsg return commitmsg
def checkupdates_app(app, first=True): def checkupdates_app(app):
# If a change is made, commitmsg should be set to a description of it. # If a change is made, commitmsg should be set to a description of it.
# Only if this is set will changes be written back to the metadata. # Only if this is set will changes be written back to the metadata.

View file

@ -655,7 +655,7 @@ class vcs:
# Derived classes need to implement this. It's called once basic checking # Derived classes need to implement this. It's called once basic checking
# has been performend. # has been performend.
def gotorevisionx(self, rev): def gotorevisionx(self, rev): # pylint: disable=unused-argument
raise VCSException("This VCS type doesn't define gotorevisionx") raise VCSException("This VCS type doesn't define gotorevisionx")
# Initialise and update submodules # Initialise and update submodules
@ -1683,7 +1683,7 @@ def get_apk_debuggable_androguard(apkfile):
return False return False
def isApkAndDebuggable(apkfile, config): def isApkAndDebuggable(apkfile):
"""Returns True if the given file is an APK and is debuggable """Returns True if the given file is an APK and is debuggable
:param apkfile: full path to the apk to check""" :param apkfile: full path to the apk to check"""

View file

@ -39,9 +39,10 @@ def get_gradle_compile_commands(build):
return [re.compile(r'\s*' + c, re.IGNORECASE) for c in compileCommands] return [re.compile(r'\s*' + c, re.IGNORECASE) for c in compileCommands]
# Scan the source code in the given directory (and all subdirectories) def scan_source(build_dir, build):
# and return the number of fatal problems encountered """Scan the source code in the given directory (and all subdirectories)
def scan_source(build_dir, root_dir, build): and return the number of fatal problems encountered
"""
count = 0 count = 0
@ -111,7 +112,7 @@ def scan_source(build_dir, root_dir, build):
return True return True
return False return False
def ignoreproblem(what, fd, fp): def ignoreproblem(what, fd):
logging.info('Ignoring %s at %s' % (what, fd)) logging.info('Ignoring %s at %s' % (what, fd))
return 0 return 0
@ -127,7 +128,7 @@ def scan_source(build_dir, root_dir, build):
def handleproblem(what, fd, fp): def handleproblem(what, fd, fp):
if toignore(fd): if toignore(fd):
return ignoreproblem(what, fd, fp) return ignoreproblem(what, fd)
if todelete(fd): if todelete(fd):
return removeproblem(what, fd, fp) return removeproblem(what, fd, fp)
logging.error('Found %s at %s' % (what, fd)) logging.error('Found %s at %s' % (what, fd))
@ -301,12 +302,12 @@ def main():
logging.info("...scanning version " + build.versionName) logging.info("...scanning version " + build.versionName)
# Prepare the source code... # Prepare the source code...
root_dir, _ = common.prepare_source(vcs, app, build, common.prepare_source(vcs, app, build,
build_dir, srclib_dir, build_dir, srclib_dir,
extlib_dir, False) extlib_dir, False)
# Do the scan... # Do the scan...
count = scan_source(build_dir, root_dir, build) count = scan_source(build_dir, build)
if count > 0: if count > 0:
logging.warn('Scanner found %d problems in %s (%s)' % ( logging.warn('Scanner found %d problems in %s (%s)' % (
count, appid, build.versionCode)) count, appid, build.versionCode))

View file

@ -1137,7 +1137,7 @@ def scan_apk(apkcache, apkfilename, repodir, knownapks, use_date_from_apk):
apk['minSdkVersion'] = 1 apk['minSdkVersion'] = 1
# Check for debuggable apks... # Check for debuggable apks...
if common.isApkAndDebuggable(apkfile, config): if common.isApkAndDebuggable(apkfile):
logging.warning('{0} is set to android:debuggable="true"'.format(apkfile)) logging.warning('{0} is set to android:debuggable="true"'.format(apkfile))
# Get the signature (or md5 of, to be precise)... # Get the signature (or md5 of, to be precise)...
@ -1538,7 +1538,7 @@ def main():
config['keydname'] = 'CN=' + config['repo_keyalias'] + ', OU=F-Droid' config['keydname'] = 'CN=' + config['repo_keyalias'] + ', OU=F-Droid'
common.write_to_config(config, 'keydname', config['keydname']) common.write_to_config(config, 'keydname', config['keydname'])
if 'keystore' not in config: if 'keystore' not in config:
config['keystore'] = common.default_config.keystore config['keystore'] = common.default_config['keystore']
common.write_to_config(config, 'keystore', config['keystore']) common.write_to_config(config, 'keystore', config['keystore'])
password = common.genpassword() password = common.genpassword()

View file

@ -78,7 +78,7 @@ class CommonTest(unittest.TestCase):
testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-badsig.apk')) testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-badsig.apk'))
testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-badcert.apk')) testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-badcert.apk'))
for apkfile in testfiles: for apkfile in testfiles:
debuggable = fdroidserver.common.isApkAndDebuggable(apkfile, config) debuggable = fdroidserver.common.isApkAndDebuggable(apkfile)
self.assertTrue(debuggable, self.assertTrue(debuggable,
"debuggable APK state was not properly parsed!") "debuggable APK state was not properly parsed!")
# these are set NOT debuggable # these are set NOT debuggable
@ -86,7 +86,7 @@ class CommonTest(unittest.TestCase):
testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-release.apk')) testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-release.apk'))
testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-release-unsigned.apk')) testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-release-unsigned.apk'))
for apkfile in testfiles: for apkfile in testfiles:
debuggable = fdroidserver.common.isApkAndDebuggable(apkfile, config) debuggable = fdroidserver.common.isApkAndDebuggable(apkfile)
self.assertFalse(debuggable, self.assertFalse(debuggable,
"debuggable APK state was not properly parsed!") "debuggable APK state was not properly parsed!")

View file

@ -87,19 +87,14 @@ sh hooks/pre-commit
#------------------------------------------------------------------------------# #------------------------------------------------------------------------------#
# run pylint # run pylint
cd $WORKSPACE # only run it where it will work, for example, the pyvenvs above don't have pylint
set +e if which pylint3 && python3 -c "import pylint" 2> /dev/null; then
# use the pyvenv so pylint checks against its installed libs cd $WORKSPACE
PYTHONPATH=$WORKSPACE/.pylint-plugins python3 /usr/bin/pylint \ pylint3 --rcfile=.pylint-rcfile --output-format=colorized --reports=n \
--output-format=parseable --reports=n \ fdroid \
--load-plugins astng_hashlib \ makebuildserver \
fdroidserver/*.py fdroid makebuildserver setup.py > $WORKSPACE/pylint.parseable setup.py \
fdroidserver/*.py \
# to only tell jenkins there was an error if we got ERROR or FATAL, uncomment these: tests/*.py \
# running pylint in the pyvenv/virtualenv is causing this FATAL error, which is a bug: tests/*.TestCase
# https://bitbucket.org/logilab/pylint/issue/73/pylint-is-unable-to-import fi
[ $(($? & 1)) = "1" ] && echo "FATALs found"
[ $(($? & 2)) = "2" ] && exit 2
[ $(($? & 4)) = "4" ] && exit 4
set -e