Skip to content
Snippets Groups Projects
Verified Commit bfa51fb4 authored by Newbyte's avatar Newbyte :snowflake:
Browse files

mrhlpr, mrtest: Add lots of type hints and fix type errors

parent fdbfe7ca
No related branches found
No related tags found
1 merge request!52mrhlpr, mrtest: Add lots of type hints and fix type errors + CI: Run mypy with --disallow-untyped-calls
......@@ -75,7 +75,9 @@ def download_json(origin: GitLabOrigin, pathname: str, no_cache: bool = False) -
return json.load(handle)
def download_artifacts_zip(api, source_project_id, job, no_cache=False):
def download_artifacts_zip(
api: str, source_project_id: int, job: dict, no_cache: bool = False
) -> str:
"""Download the job artifacts zip file, with a cache.
:param api: gitlab API url, from parse_git_origin()["api"]
......
......@@ -5,7 +5,7 @@
import platform
def get_arch_alpine_native():
def get_arch_alpine_native() -> str:
""":returns: string for the architecture used in Alpine, e.g. 'armv7'"""
machine = platform.machine()
......@@ -23,7 +23,7 @@ def get_arch_alpine_native():
raise ValueError(f"Cannot map platform.machine '{machine}' to the right Alpine Linux arch")
def get_build_job(api_pipeline_jobs):
def get_build_job(api_pipeline_jobs: dict) -> dict | None:
""":param api_pipeline_jobs: dict from gitlab's pipelines/:id/jobs api
:returns: job dict of the build job with the native arch or None"""
......
......@@ -8,7 +8,10 @@ import logging
import os
def get_no_state_str(runner):
Runner = dict[str, bool | int | str]
def get_no_state_str(runner: Runner) -> str:
"""Create a human-readable json string of runner, with information about
current state (active or not) removed.
:returns: json string"""
......@@ -25,7 +28,7 @@ def get_no_state_str(runner):
return json.dumps(no_state, indent=4)
def get_runner_trusted_path(no_state_str, mkdir=False):
def get_runner_trusted_path(no_state_str: str, mkdir: bool = False) -> str:
""":param runner_no_state_str: as returned by get_no_state_str()
:returns: path to store that the given runner is trusted"""
config_dir = f"{os.getenv('HOME')}/.config/mrhlpr/known_runners"
......@@ -36,7 +39,7 @@ def get_runner_trusted_path(no_state_str, mkdir=False):
return f"{config_dir}/{key}"
def is_runner_known(no_state_str):
def is_runner_known(no_state_str: str) -> bool:
"""
:param no_state_str: from get_no_state_str()
"""
......@@ -50,7 +53,7 @@ def is_runner_known(no_state_str):
return no_state_str == handle.read()
def mark_as_known(no_state_str):
def mark_as_known(no_state_str: str) -> None:
"""
:param no_state_str: from get_no_state_str()
"""
......@@ -61,7 +64,7 @@ def mark_as_known(no_state_str):
return
def verify(runner):
def verify(runner: Runner) -> None:
"""Verify that a runner ist trusted, or ask the user if they want to trust
it. Exit if the user does not trust it.
:param runner: as returned from the gitlab jobs api:
......
......@@ -4,15 +4,17 @@
import os
from mrhlpr.gitlab import GitLabOrigin
def get_sudo():
def get_sudo() -> str:
""":returns: either "doas" or "sudo" """
if os.path.exists("/usr/bin/doas"):
return "doas"
return "sudo"
def get_virtual_group(origin, mr_id):
def get_virtual_group(origin: GitLabOrigin, mr_id: int) -> str:
"""Generate a virtual group id to be passed to apk when installing
packages from a merge request.
:param origin: gitlab origin information, see gitlab.parse_git_origin()
......@@ -20,5 +22,5 @@ def get_virtual_group(origin, mr_id):
return f".mrtest-{mr_id}-{origin.project}"
def is_root_user():
def is_root_user() -> bool:
return os.geteuid() == 0
......@@ -13,9 +13,10 @@ from urllib.error import HTTPError
import mrhlpr.mr
import mrtest.origin
import mrtest.select_package
from mrhlpr.gitlab import GitLabOrigin
def extract_apks(zip_path, selection):
def extract_apks(zip_path: str, selection: list[str]) -> list[str]:
"""
:param zip_path: to the downloaded artifacts zip
:param selection: list of apks inside the zip archive
......@@ -47,7 +48,7 @@ def extract_apks(zip_path, selection):
return ret
def run_apk_add(origin, mr_id, apk_paths):
def run_apk_add(origin: GitLabOrigin, mr_id: int, apk_paths: list[str]) -> None:
"""
:param origin: gitlab origin information, see gitlab.parse_git_origin()
:param mr_id: merge request ID
......@@ -69,7 +70,7 @@ def run_apk_add(origin, mr_id, apk_paths):
subprocess.run(cmd, check=True)
def confirm_mr_id(origin, mr_id: int, action: Literal["add", "upgrade"]) -> None:
def confirm_mr_id(origin: GitLabOrigin, mr_id: int, action: Literal["add", "upgrade"]) -> None:
"""
:param origin: gitlab origin information, see gitlab.parse_git_origin()
:param mr_id: merge request ID
......@@ -106,7 +107,7 @@ def confirm_mr_id(origin, mr_id: int, action: Literal["add", "upgrade"]) -> None
print("---")
def add_packages(origin, mr_id, no_cache):
def add_packages(origin: GitLabOrigin, mr_id: int, no_cache: bool) -> None:
"""
:param origin: gitlab origin information, see gitlab.parse_git_origin()
:param mr_id: merge request ID
......
......@@ -55,7 +55,7 @@ def get_installed_all() -> dict[str, Optional[str]]:
return ret
def get_installed(pkg):
def get_installed(pkg: str) -> str | None:
"""
:param pkg: path to an apk file, ending in .../$pkgname-$version.apk
"""
......@@ -66,3 +66,5 @@ def get_installed(pkg):
if pkgname in installed_all:
return installed_all[pkgname]
return None
......@@ -17,7 +17,7 @@ except ImportError:
pass
def parse_args_parser_add(sub):
def parse_args_parser_add(sub) -> None:
""":param sub: argparser's subparser"""
parser = sub.add_parser("add", help="install packages from an MR")
parser.add_argument(
......@@ -41,12 +41,12 @@ def parse_args_parser_upgrade(sub) -> None:
parser.add_argument("mr_id", type=int, help="merge request ID")
def parse_args_parser_zap(sub):
def parse_args_parser_zap(sub) -> None:
""":param sub: argparser's subparser"""
sub.add_parser("zap", help="uninstall previously added packages")
def parse_args():
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument(
"-n", "--no-cache", action="store_true", help="do not use local cache for MR information"
......
......@@ -130,7 +130,7 @@ def toggle_packages(action, apks: list[str], ret: list[str]) -> list[str]:
return ret
def ask(zip_path) -> list[str]:
def ask(zip_path: str) -> list[str]:
"""Ask the user which packages shall be installed or upgraded.
:param zip_path: downloaded artifacts zip containing the apks
:returns: paths inside the zip file of the packages that the user wants
......
......@@ -8,7 +8,7 @@ import subprocess
import mrtest.apk_installed
def get_installed_mrtest_virtual_packages():
def get_installed_mrtest_virtual_packages() -> list[str]:
ret = []
pkgs = mrtest.apk_installed.get_installed_all()
for pkgname, version in pkgs.items():
......@@ -17,7 +17,7 @@ def get_installed_mrtest_virtual_packages():
return ret
def remove_virtual():
def remove_virtual() -> None:
virtual = get_installed_mrtest_virtual_packages()
if not virtual:
print("No virtual '.mrtest' packages found, nothing to do.")
......@@ -43,7 +43,7 @@ def remove_virtual():
print("All done!")
def zap_packages():
def zap_packages() -> None:
remove_virtual()
print()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment