diff --git a/fdroidserver/__main__.py b/fdroidserver/__main__.py index 2c863d27..9a088516 100755 --- a/fdroidserver/__main__.py +++ b/fdroidserver/__main__.py @@ -134,7 +134,7 @@ def main(): sys.exit(0) command = sys.argv[1] - if command not in COMMANDS and command not in available_plugins.keys(): + if command not in COMMANDS and command not in available_plugins: if command in ('-h', '--help'): print_help(available_plugins=available_plugins) sys.exit(0) diff --git a/fdroidserver/common.py b/fdroidserver/common.py index df8d686c..942e8fe6 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -1007,6 +1007,9 @@ class vcs: self.refreshed = False self.srclib = None + def _gettags(self): + raise NotImplementedError + def repotype(self): return None @@ -1800,7 +1803,7 @@ def parse_androidmanifests(paths, app): if re.match(r'.*[\'"\s]{flavour}[\'"\s].*\{{.*'.format(flavour=flavour), line): inside_required_flavour = 2 break - elif re.match(r'.*[\'"\s]{flavour}[\'"\s].*'.format(flavour=flavour), line): + if re.match(r'.*[\'"\s]{flavour}[\'"\s].*'.format(flavour=flavour), line): inside_required_flavour = 1 break diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 0661bb3a..0415f7f4 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -33,7 +33,6 @@ import shutil from . import _ from . import common from . import index -from . import update from .exception import FDroidException config = None @@ -524,7 +523,7 @@ def upload_apk_to_android_observatory(path): apkfilename = os.path.basename(path) r = requests.post('https://androidobservatory.org/', - data={'q': update.sha256sum(path), 'searchby': 'hash'}, + data={'q': common.sha256sum(path), 'searchby': 'hash'}, headers=net.HEADERS, timeout=300) if r.status_code == 200: # from now on XPath will be used to retrieve the message in the HTML @@ -624,7 +623,7 @@ def upload_apk_to_virustotal(virustotal_apikey, packageName, apkName, hash, + str(response['positives']) + ' times:' + '\n\t' + response['permalink']) break - elif r.status_code == 204: + if r.status_code == 204: logging.warning(_('virustotal.com is rate limiting, waiting to retry...')) time.sleep(30) # wait for public API rate limiting diff --git a/fdroidserver/metadata.py b/fdroidserver/metadata.py index 4fba148c..e5f82a69 100644 --- a/fdroidserver/metadata.py +++ b/fdroidserver/metadata.py @@ -504,8 +504,8 @@ def parse_yaml_srclib(metadatapath): cause=e) return thisinfo - for key in data.keys(): - if key not in thisinfo.keys(): + for key in data: + if key not in thisinfo: _warn_or_exception(_("Invalid srclib metadata: unknown key " "'{key}' in '{file}'") .format(key=key, file=metadatapath)) @@ -764,6 +764,8 @@ def parse_metadata(metadatapath): try: commit_id = common.get_head_commit_id(git.Repo(build_dir)) logging.debug(_('Including metadata from %s@%s') % (metadata_in_repo, commit_id)) + # See https://github.com/PyCQA/pylint/issues/2856 . + # pylint: disable-next=no-member except git.exc.InvalidGitRepositoryError: logging.debug(_('Including metadata from {path}').format(metadata_in_repo)) app_in_repo = parse_metadata(metadata_in_repo) diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index e489ce4b..f367a3a3 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -199,6 +199,7 @@ class FDroidBuildVm: def __init__(self, srvdir): """Create new server class.""" + self.provider = None self.srvdir = srvdir self.srvname = basename(srvdir) + '_default' self.vgrntfile = os.path.join(srvdir, 'Vagrantfile') diff --git a/makebuildserver b/makebuildserver index 5d181b53..39cbba06 100755 --- a/makebuildserver +++ b/makebuildserver @@ -91,7 +91,7 @@ with open('buildserver/Vagrantfile') as fp: m = re.search(r"""\.vm\.box\s*=\s*["'](.*)["']""", fp.read()) if not m: logging.error('Cannot find box name in buildserver/Vagrantfile!') - exit(1) + sys.exit(1) config['basebox'] = m.group(1) config['basebox_version'] = BASEBOX_VERSION_DEFAULT config['cachedir'] = os.path.join(os.getenv('HOME'), '.cache', 'fdroidserver') @@ -107,7 +107,7 @@ elif os.path.exists('makebs.config.py'): if show_config_deprecation: logging.error('Config is via %s and command line flags.' % configfile) parser.print_help() - exit(1) + sys.exit(1) logging.debug("Vagrantfile.yaml parsed -> %s", json.dumps(config, indent=4, sort_keys=True)) @@ -264,7 +264,7 @@ def main(): logging.debug('found \'vmx\' or \'svm\' in /proc/cpuinfo -> hwvirtex = \'on\'') else: logging.error('hwvirtex = \'on\' and no \'vmx\' or \'svm\' found in /proc/cpuinfo!') - exit(1) + sys.exit(1) serverdir = os.path.join(os.getcwd(), 'buildserver') logfilename = os.path.join(serverdir, 'up.log') @@ -312,7 +312,7 @@ def main(): version=config['basebox_version'])) sys.exit(1) # verify box - if config['basebox_version'] not in BASEBOX_CHECKSUMS.keys(): + if config['basebox_version'] not in BASEBOX_CHECKSUMS: logging.critical("can not verify '{box}', " "unknown basebox version '{version}'" .format(box=config['basebox'], diff --git a/pyproject.toml b/pyproject.toml index d351e8e3..489df45b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,13 @@ disable_error_code = "no-redef, misc, arg-type" # avoid hangs. jobs = 4 +# Minimum Python version to use for version dependent checks. Will default to the +# version used to run pylint. +py-version = "3.9" + +# Files or directories to be skipped. They should be base names, not paths. +ignore = ["apksigcopier.py"] + [tool.pylint.basic] # Good variable names which should always be accepted, separated by a comma. good-names = ["i", "j", "k", "ex", "Run", "f", "fp"] @@ -54,17 +61,13 @@ confidence = ["HIGH", "INFERENCE"] disable = [ "broad-exception-caught", "broad-exception-raised", - "consider-iterating-dictionary", - "consider-using-sys-exit", "invalid-name", "missing-class-docstring", "missing-function-docstring", "missing-module-docstring", - "no-else-break", "no-else-continue", "no-else-raise", "no-else-return", - "no-member", "subprocess-run-check", "use-dict-literal", ] diff --git a/tests/extra/manual-vmtools-test.py b/tests/extra/manual-vmtools-test.py index 03ef22f5..0f0c745b 100755 --- a/tests/extra/manual-vmtools-test.py +++ b/tests/extra/manual-vmtools-test.py @@ -1,4 +1,8 @@ #!/usr/bin/env python3 +# +# This script is some of the only documentation of certain processes +# that run in the buildserver setup. It is not really maintained, but +# is still here as a kind of reference. import os import sys @@ -17,6 +21,7 @@ if localmodule not in sys.path: from fdroidserver.vmtools import get_build_vm +# pylint: disable=no-member def main(args): if args.provider != None: diff --git a/tests/gradle-release-checksums.py b/tests/gradle-release-checksums.py index 38784052..1ec54c5f 100755 --- a/tests/gradle-release-checksums.py +++ b/tests/gradle-release-checksums.py @@ -6,6 +6,7 @@ import os import re import requests import subprocess +import sys from colorama import Fore, Style from distutils.version import LooseVersion @@ -92,7 +93,7 @@ with open('gradlew-fdroid', 'w') as fp: if os.getenv('CI_PROJECT_NAMESPACE') != 'fdroid': p = subprocess.run(['git', '--no-pager', 'diff']) print(p.stdout) - exit(errors) + sys.exit(errors) # This only runs after commits are pushed to fdroid/fdroidserver git_repo = git.repo.Repo('.') @@ -103,7 +104,7 @@ if git_repo.is_dirty() and ('gradlew-fdroid' in modified or 'makebuildserver' in print(Fore.RED + 'ERROR: GitLab Token not found in PERSONAL_ACCESS_TOKEN!' + Style.RESET_ALL) - exit(1) + sys.exit(1) branch = git_repo.create_head(os.path.basename(__file__), force=True) branch.checkout() @@ -116,6 +117,8 @@ if git_repo.is_dirty() and ('gradlew-fdroid' in modified or 'makebuildserver' in remote_name = 'fdroid-bot' try: remote = git_repo.create_remote(remote_name, url) + # See https://github.com/PyCQA/pylint/issues/2856 . + # pylint: disable-next=no-member except git.exc.GitCommandError: remote = git.remote.Remote(git_repo, remote_name) remote.set_url(url) diff --git a/tests/ndk-release-checksums.py b/tests/ndk-release-checksums.py index 2f39bc68..97b7038b 100755 --- a/tests/ndk-release-checksums.py +++ b/tests/ndk-release-checksums.py @@ -7,6 +7,7 @@ import os import re import requests import subprocess +import sys from colorama import Fore, Style @@ -26,7 +27,7 @@ with open('fdroidserver/common.py') as fp: to_compile = re.search(r'\nNDKS = [^\]]+\]', common_py).group() if not to_compile: - exit(1) + sys.exit(1) code = compile(to_compile, '', 'exec') config = {} exec(code, None, config) # nosec this is just a CI script @@ -78,7 +79,7 @@ with open('fdroidserver/common.py', 'w') as fp: if os.getenv('CI_PROJECT_NAMESPACE') != 'fdroid': p = subprocess.run(['git', '--no-pager', 'diff']) print(p.stdout) - exit(errors) + sys.exit(errors) # This only runs after commits are pushed to fdroid/fdroidserver @@ -99,6 +100,8 @@ if git_repo.is_dirty() and 'fdroidserver/common.py' in modified: remote_name = 'fdroid-bot' try: remote = git_repo.create_remote(remote_name, url) + # See https://github.com/PyCQA/pylint/issues/2856 . + # pylint: disable-next=no-member except git.exc.GitCommandError: remote = git.remote.Remote(git_repo, remote_name) remote.set_url(url) @@ -112,7 +115,7 @@ if git_repo.is_dirty() and 'fdroidserver/common.py' in modified: + 'ERROR: GitLab Token not found in PERSONAL_ACCESS_TOKEN!' + Style.RESET_ALL ) - exit(1) + sys.exit(1) gl = gitlab.Gitlab( os.getenv('CI_SERVER_URL'), api_version=4, private_token=private_token )