From 616a1950aef1bdda69c7e3837a0079f770cfdfb5 Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Fri, 13 Jan 2023 18:46:15 +0200 Subject: [PATCH] add ability to override pacman mirror in devtools configuration This commit also extends configuration of the multilib option, adding the ability to exlcude multilib repository from repositories list Note, that in order to support repository list and mirror correctly, alpm configuration section is now architectture specific --- Dockerfile | 2 + docker/entrypoint.sh | 6 ++ docs/ahriman.1 | 8 ++- docs/completions/bash/_ahriman | 10 ++-- docs/completions/zsh/_ahriman | 5 ++ docs/configuration.rst | 2 +- docs/faq.rst | 1 + src/ahriman/application/ahriman.py | 1 + src/ahriman/application/handlers/setup.py | 40 ++++++++----- src/ahriman/core/alpm/pacman.py | 12 ++-- .../core/configuration/configuration.py | 2 +- .../handlers/test_handler_setup.py | 58 +++++++++++++++++-- 12 files changed, 112 insertions(+), 35 deletions(-) diff --git a/Dockerfile b/Dockerfile index 34102272..2c3833ac 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,8 +5,10 @@ ENV AHRIMAN_ARCHITECTURE="x86_64" ENV AHRIMAN_DEBUG="" ENV AHRIMAN_FORCE_ROOT="" ENV AHRIMAN_HOST="0.0.0.0" +ENV AHRIMAN_MULTILIB="yes" ENV AHRIMAN_OUTPUT="syslog" ENV AHRIMAN_PACKAGER="ahriman bot " +ENV AHRIMAN_PACMAN_MIRROR="" ENV AHRIMAN_PORT="" ENV AHRIMAN_REPOSITORY="aur-clone" ENV AHRIMAN_REPOSITORY_ROOT="/var/lib/ahriman/ahriman" diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 9d297a09..69bc91cf 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -39,6 +39,12 @@ chown "$AHRIMAN_USER":"$AHRIMAN_USER" "$AHRIMAN_GNUPG_HOME" AHRIMAN_SETUP_ARGS=("--build-as-user" "$AHRIMAN_USER") AHRIMAN_SETUP_ARGS+=("--packager" "$AHRIMAN_PACKAGER") AHRIMAN_SETUP_ARGS+=("--repository" "$AHRIMAN_REPOSITORY") +if [ -z "$AHRIMAN_MULTILIB" ]; then + AHRIMAN_SETUP_ARGS+=("--no-multilib") +fi +if [ -n "$AHRIMAN_PACMAN_MIRROR" ]; then + AHRIMAN_SETUP_ARGS+=("--mirror" "$AHRIMAN_PACMAN_MIRROR") +fi if [ -n "$AHRIMAN_PORT" ]; then AHRIMAN_SETUP_ARGS+=("--web-port" "$AHRIMAN_PORT") fi diff --git a/docs/ahriman.1 b/docs/ahriman.1 index 2f51f7b6..212ee356 100644 --- a/docs/ahriman.1 +++ b/docs/ahriman.1 @@ -1,4 +1,4 @@ -.TH AHRIMAN "1" "2023\-01\-11" "ahriman" "Generated Python Manual" +.TH AHRIMAN "1" "2023\-01\-13" "ahriman" "Generated Python Manual" .SH NAME ahriman .SH SYNOPSIS @@ -621,7 +621,7 @@ key server for key import .SH COMMAND \fI\,'ahriman service\-setup'\/\fR usage: ahriman service\-setup [\-h] [\-\-build\-as\-user BUILD_AS_USER] [\-\-build\-command BUILD_COMMAND] [\-\-from\-configuration FROM_CONFIGURATION] [\-\-makeflags\-jobs | \-\-no\-makeflags\-jobs] - [\-\-multilib | \-\-no\-multilib] \-\-packager PACKAGER \-\-repository REPOSITORY + [\-\-mirror MIRROR] [\-\-multilib | \-\-no\-multilib] \-\-packager PACKAGER \-\-repository REPOSITORY [\-\-sign\-key SIGN_KEY] [\-\-sign\-target {disabled,packages,repository}] [\-\-web\-port WEB_PORT] [\-\-web\-unix\-socket WEB_UNIX_SOCKET] @@ -644,6 +644,10 @@ path to default devtools pacman configuration \fB\-\-makeflags\-jobs\fR, \fB\-\-no\-makeflags\-jobs\fR append MAKEFLAGS variable with parallelism set to number of cores (default: True) +.TP +\fB\-\-mirror\fR \fI\,MIRROR\/\fR +use the specified explicitly mirror instead of including mirrorlist + .TP \fB\-\-multilib\fR, \fB\-\-no\-multilib\fR add or do not multilib repository (default: True) diff --git a/docs/completions/bash/_ahriman b/docs/completions/bash/_ahriman index 25d2f6df..66ee0644 100644 --- a/docs/completions/bash/_ahriman +++ b/docs/completions/bash/_ahriman @@ -56,11 +56,11 @@ _shtab_ahriman_config_validate_option_strings=('-h' '--help' '-e' '--exit-code') _shtab_ahriman_repo_config_validate_option_strings=('-h' '--help' '-e' '--exit-code') _shtab_ahriman_service_key_import_option_strings=('-h' '--help' '--key-server') _shtab_ahriman_key_import_option_strings=('-h' '--help' '--key-server') -_shtab_ahriman_service_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') -_shtab_ahriman_init_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') -_shtab_ahriman_repo_init_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') -_shtab_ahriman_repo_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') -_shtab_ahriman_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_service_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_init_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_repo_init_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_repo_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') +_shtab_ahriman_setup_option_strings=('-h' '--help' '--build-as-user' '--build-command' '--from-configuration' '--makeflags-jobs' '--no-makeflags-jobs' '--mirror' '--multilib' '--no-multilib' '--packager' '--repository' '--sign-key' '--sign-target' '--web-port' '--web-unix-socket') _shtab_ahriman_service_shell_option_strings=('-h' '--help') _shtab_ahriman_shell_option_strings=('-h' '--help') _shtab_ahriman_user_add_option_strings=('-h' '--help' '-p' '--password' '-r' '--role' '-s' '--secure') diff --git a/docs/completions/zsh/_ahriman b/docs/completions/zsh/_ahriman index 54afb698..37a1f979 100644 --- a/docs/completions/zsh/_ahriman +++ b/docs/completions/zsh/_ahriman @@ -164,6 +164,7 @@ _shtab_ahriman_init_options=( "--build-command[build command prefix]:build_command:" "--from-configuration[path to default devtools pacman configuration]:from_configuration:" {--makeflags-jobs,--no-makeflags-jobs}"[append MAKEFLAGS variable with parallelism set to number of cores (default\: \%(default)s)]:makeflags_jobs:" + "--mirror[use the specified explicitly mirror instead of including mirrorlist]:mirror:" {--multilib,--no-multilib}"[add or do not multilib repository (default\: \%(default)s)]:multilib:" "--packager[packager name and email]:packager:" "--repository[repository name]:repository:" @@ -315,6 +316,7 @@ _shtab_ahriman_repo_init_options=( "--build-command[build command prefix]:build_command:" "--from-configuration[path to default devtools pacman configuration]:from_configuration:" {--makeflags-jobs,--no-makeflags-jobs}"[append MAKEFLAGS variable with parallelism set to number of cores (default\: \%(default)s)]:makeflags_jobs:" + "--mirror[use the specified explicitly mirror instead of including mirrorlist]:mirror:" {--multilib,--no-multilib}"[add or do not multilib repository (default\: \%(default)s)]:multilib:" "--packager[packager name and email]:packager:" "--repository[repository name]:repository:" @@ -353,6 +355,7 @@ _shtab_ahriman_repo_setup_options=( "--build-command[build command prefix]:build_command:" "--from-configuration[path to default devtools pacman configuration]:from_configuration:" {--makeflags-jobs,--no-makeflags-jobs}"[append MAKEFLAGS variable with parallelism set to number of cores (default\: \%(default)s)]:makeflags_jobs:" + "--mirror[use the specified explicitly mirror instead of including mirrorlist]:mirror:" {--multilib,--no-multilib}"[add or do not multilib repository (default\: \%(default)s)]:multilib:" "--packager[packager name and email]:packager:" "--repository[repository name]:repository:" @@ -439,6 +442,7 @@ _shtab_ahriman_service_setup_options=( "--build-command[build command prefix]:build_command:" "--from-configuration[path to default devtools pacman configuration]:from_configuration:" {--makeflags-jobs,--no-makeflags-jobs}"[append MAKEFLAGS variable with parallelism set to number of cores (default\: \%(default)s)]:makeflags_jobs:" + "--mirror[use the specified explicitly mirror instead of including mirrorlist]:mirror:" {--multilib,--no-multilib}"[add or do not multilib repository (default\: \%(default)s)]:multilib:" "--packager[packager name and email]:packager:" "--repository[repository name]:repository:" @@ -459,6 +463,7 @@ _shtab_ahriman_setup_options=( "--build-command[build command prefix]:build_command:" "--from-configuration[path to default devtools pacman configuration]:from_configuration:" {--makeflags-jobs,--no-makeflags-jobs}"[append MAKEFLAGS variable with parallelism set to number of cores (default\: \%(default)s)]:makeflags_jobs:" + "--mirror[use the specified explicitly mirror instead of including mirrorlist]:mirror:" {--multilib,--no-multilib}"[add or do not multilib repository (default\: \%(default)s)]:multilib:" "--packager[packager name and email]:packager:" "--repository[repository name]:repository:" diff --git a/docs/configuration.rst b/docs/configuration.rst index 15ec7dfd..1fa7b47a 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -32,7 +32,7 @@ Base configuration settings. ``alpm`` group -------------- -libalpm and AUR related configuration. +libalpm and AUR related configuration. Group name can refer to architecture, e.g. ``alpm:x86_64`` can be used for x86_64 architecture specific settings. * ``database`` - path to pacman system database cache, string, required. * ``mirror`` - package database mirror used by pacman for syncronization, string, required. This option supports standard pacman substitutions with ``$arch`` and ``$repo``. Note that the mentioned mirror should contain all repositories which are set by ``alpm.repositories`` option. diff --git a/docs/faq.rst b/docs/faq.rst index c87ed85e..41100c84 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -393,6 +393,7 @@ The following environment variables are supported: * ``AHRIMAN_HOST`` - host for the web interface, default is ``0.0.0.0``. * ``AHRIMAN_OUTPUT`` - controls logging handler, e.g. ``syslog``, ``console``. The name must be found in logging configuration. Note that if ``syslog`` (the default) handler is used you will need to mount ``/dev/log`` inside container because it is not available there. * ``AHRIMAN_PACKAGER`` - packager name from which packages will be built, default is ``ahriman bot ``. +* ``AHRIMAN_PACMAN_MIRROR`` - override pacman mirror server if set. * ``AHRIMAN_PORT`` - HTTP server port if any, default is empty. * ``AHRIMAN_REPOSITORY`` - repository name, default is ``aur-clone``. * ``AHRIMAN_REPOSITORY_ROOT`` - repository root. Because of filesystem rights it is required to override default repository root. By default, it uses ``ahriman`` directory inside ahriman's home, which can be passed as mount volume. diff --git a/src/ahriman/application/ahriman.py b/src/ahriman/application/ahriman.py index 4eb6fa32..59126e83 100644 --- a/src/ahriman/application/ahriman.py +++ b/src/ahriman/application/ahriman.py @@ -818,6 +818,7 @@ def _set_service_setup_parser(root: SubParserAction) -> argparse.ArgumentParser: type=Path, default=Path("/usr/share/devtools/pacman-extra.conf")) parser.add_argument("--makeflags-jobs", help="append MAKEFLAGS variable with parallelism set to number of cores", action=argparse.BooleanOptionalAction, default=True) + parser.add_argument("--mirror", help="use the specified explicitly mirror instead of including mirrorlist") parser.add_argument("--multilib", help="add or do not multilib repository", action=argparse.BooleanOptionalAction, default=True) parser.add_argument("--packager", help="packager name and email", required=True) diff --git a/src/ahriman/application/handlers/setup.py b/src/ahriman/application/handlers/setup.py index 494cdcc2..bc419a91 100644 --- a/src/ahriman/application/handlers/setup.py +++ b/src/ahriman/application/handlers/setup.py @@ -21,7 +21,7 @@ import argparse from pathlib import Path from pwd import getpwuid -from typing import Type +from typing import Optional, Type from ahriman.application.application import Application from ahriman.application.handlers import Handler @@ -58,15 +58,14 @@ class Setup(Handler): report(bool): force enable or disable reporting unsafe(bool): if set no user check will be performed before path creation """ - Setup.configuration_create_ahriman(args, architecture, args.repository, configuration.include, - configuration.repository_paths) + Setup.configuration_create_ahriman(args, architecture, args.repository, configuration) configuration.reload() application = Application(architecture, configuration, report=report, unsafe=unsafe) Setup.configuration_create_makepkg(args.packager, args.makeflags_jobs, application.repository.paths) Setup.executable_create(application.repository.paths, args.build_command, architecture) - Setup.configuration_create_devtools(args.build_command, architecture, args.from_configuration, + Setup.configuration_create_devtools(args.build_command, architecture, args.from_configuration, args.mirror, args.multilib, args.repository, application.repository.paths) Setup.configuration_create_sudo(application.repository.paths, args.build_command, architecture) @@ -91,7 +90,7 @@ class Setup(Handler): @staticmethod def configuration_create_ahriman(args: argparse.Namespace, architecture: str, repository: str, - include_path: Path, paths: RepositoryPaths) -> None: + root: Configuration) -> None: """ create service specific configuration @@ -99,37 +98,41 @@ class Setup(Handler): args(argparse.Namespace): command line args architecture(str): repository architecture repository(str): repository name - include_path(Path): path to directory with configuration includes - paths(RepositoryPaths): repository paths instance + root(Configuration): root configuration instance """ configuration = Configuration() section = Configuration.section_name("build", architecture) - build_command = Setup.build_command(paths.root, args.build_command, architecture) + build_command = Setup.build_command(root.repository_paths.root, args.build_command, architecture) configuration.set_option(section, "build_command", str(build_command)) configuration.set_option("repository", "name", repository) if args.build_as_user is not None: configuration.set_option(section, "makechrootpkg_flags", f"-U {args.build_as_user}") + section = Configuration.section_name("alpm", architecture) + if args.mirror is not None: + configuration.set_option(section, "mirror", args.mirror) + if not args.multilib: + repositories = filter(lambda r: r != "multilib", root.getlist("alpm", "repositories")) + configuration.set_option(section, "repositories", " ".join(repositories)) + + section = Configuration.section_name("sign", architecture) if args.sign_key is not None: - section = Configuration.section_name("sign", architecture) configuration.set_option(section, "target", " ".join([target.name.lower() for target in args.sign_target])) configuration.set_option(section, "key", args.sign_key) + section = Configuration.section_name("web", architecture) if args.web_port is not None: - section = Configuration.section_name("web", architecture) configuration.set_option(section, "port", str(args.web_port)) - if args.web_unix_socket is not None: - section = Configuration.section_name("web", architecture) configuration.set_option(section, "unix_socket", str(args.web_unix_socket)) - target = include_path / "00-setup-overrides.ini" + target = root.include / "00-setup-overrides.ini" with target.open("w") as ahriman_configuration: configuration.write(ahriman_configuration) @staticmethod - def configuration_create_devtools(prefix: str, architecture: str, source: Path, + def configuration_create_devtools(prefix: str, architecture: str, source: Path, mirror: Optional[str], multilib: bool, repository: str, paths: RepositoryPaths) -> None: """ create configuration for devtools based on ``source`` configuration @@ -141,6 +144,7 @@ class Setup(Handler): prefix(str): command prefix in {prefix}-{architecture}-build architecture(str): repository architecture source(Path): path to source configuration file + mirror(Optional[str]): link to package server mirror multilib(bool): add or do not multilib repository to the configuration repository(str): repository name paths(RepositoryPaths): repository paths instance @@ -163,6 +167,14 @@ class Setup(Handler): if multilib: configuration.set_option("multilib", "Include", str(Setup.MIRRORLIST_PATH)) + # override Include option to Server in case if mirror option set + if mirror is not None: + for section in filter(lambda s: s != "options", configuration.sections()): + if configuration.get(section, "Include", fallback=None) != str(Setup.MIRRORLIST_PATH): + continue + configuration.remove_option(section, "Include") + configuration.set_option(section, "Server", mirror) + # add repository itself configuration.set_option(repository, "SigLevel", "Optional TrustAll") # we don't care configuration.set_option(repository, "Server", f"file://{paths.repository}") diff --git a/src/ahriman/core/alpm/pacman.py b/src/ahriman/core/alpm/pacman.py index 130d53ab..4bd5301a 100644 --- a/src/ahriman/core/alpm/pacman.py +++ b/src/ahriman/core/alpm/pacman.py @@ -45,8 +45,8 @@ class Pacman(LazyLogging): Args: architecture(str): repository architecture configuration(Configuration): configuration instance - refresh_database(int): synchronize local cache to remote. If set to ``0``, no syncronization will be - enabled, if set to ``1`` - normal syncronization, if set to ``2`` - force syncronization + refresh_database(int): synchronize local cache to remote. If set to ``0``, no synchronization will be + enabled, if set to ``1`` - normal synchronization, if set to ``2`` - force synchronization """ self.__create_handle_fn: Callable[[], Handle] = lambda: self.__create_handle( architecture, configuration, refresh_database=refresh_database) @@ -58,8 +58,8 @@ class Pacman(LazyLogging): Args: architecture(str): repository architecture configuration(Configuration): configuration instance - refresh_database(int): synchronize local cache to remote. If set to ``0``, no syncronization will be - enabled, if set to ``1`` - normal syncronization, if set to ``2`` - force syncronization + refresh_database(int): synchronize local cache to remote. If set to ``0``, no synchronization will be + enabled, if set to ``1`` - normal synchronization, if set to ``2`` - force synchronization Returns: Handle: fully initialized pacman handle @@ -126,7 +126,7 @@ class Pacman(LazyLogging): Returns: DB: loaded pacman database instance """ - self.logger.info("loading pacman databases") + self.logger.info("loading pacman database %s", repository) database: DB = handle.register_syncdb(repository, SIG_PACKAGE) # replace variables in mirror address database.servers = [mirror.replace("$repo", repository).replace("$arch", architecture)] @@ -138,7 +138,7 @@ class Pacman(LazyLogging): Args: handle(Handle): pacman handle which will be used for database sync - force(bool): force database syncronization (same as ``pacman -Syy``) + force(bool): force database synchronization (same as ``pacman -Syy``) """ self.logger.info("refresh ahriman's home pacman database (force refresh %s)", force) transaction = handle.init_transaction() diff --git a/src/ahriman/core/configuration/configuration.py b/src/ahriman/core/configuration/configuration.py index 2d934845..7d350030 100644 --- a/src/ahriman/core/configuration/configuration.py +++ b/src/ahriman/core/configuration/configuration.py @@ -61,7 +61,7 @@ class Configuration(configparser.RawConfigParser): >>> path, architecture = configuration.check_loaded() """ - ARCHITECTURE_SPECIFIC_SECTIONS = ["build", "sign", "web"] + ARCHITECTURE_SPECIFIC_SECTIONS = ["alpm", "build", "sign", "web"] SYSTEM_CONFIGURATION_PATH = Path(sys.prefix) / "share" / "ahriman" / "settings" / "ahriman.ini" converters: Dict[str, Callable[[str], Any]] # typing guard diff --git a/tests/ahriman/application/handlers/test_handler_setup.py b/tests/ahriman/application/handlers/test_handler_setup.py index f65f72ed..60bccf5e 100644 --- a/tests/ahriman/application/handlers/test_handler_setup.py +++ b/tests/ahriman/application/handlers/test_handler_setup.py @@ -27,6 +27,7 @@ def _default_args(args: argparse.Namespace) -> argparse.Namespace: args.build_command = "ahriman" args.from_configuration = Path("/usr/share/devtools/pacman-extra.conf") args.makeflags_jobs = True + args.mirror = "mirror" args.multilib = True args.packager = "John Doe " args.repository = "aur-clone" @@ -52,10 +53,10 @@ def test_run(args: argparse.Namespace, configuration: Configuration, repository: init_mock = mocker.patch("ahriman.core.alpm.repo.Repo.init") Setup.run(args, "x86_64", configuration, report=False, unsafe=False) - ahriman_configuration_mock.assert_called_once_with( - args, "x86_64", args.repository, configuration.include, repository_paths) + ahriman_configuration_mock.assert_called_once_with(args, "x86_64", args.repository, configuration) devtools_configuration_mock.assert_called_once_with( - args.build_command, "x86_64", args.from_configuration, args.multilib, args.repository, repository_paths) + args.build_command, "x86_64", args.from_configuration, args.mirror, args.multilib, args.repository, + repository_paths) makepkg_configuration_mock.assert_called_once_with(args.packager, args.makeflags_jobs, repository_paths) sudo_configuration_mock.assert_called_once_with(repository_paths, args.build_command, "x86_64") executable_mock.assert_called_once_with(repository_paths, args.build_command, "x86_64") @@ -85,11 +86,12 @@ def test_configuration_create_ahriman(args: argparse.Namespace, configuration: C write_mock = mocker.patch("ahriman.core.configuration.Configuration.write") command = Setup.build_command(repository_paths.root, args.build_command, "x86_64") - Setup.configuration_create_ahriman(args, "x86_64", args.repository, configuration.include, repository_paths) + Setup.configuration_create_ahriman(args, "x86_64", args.repository, configuration) set_option_mock.assert_has_calls([ MockCall(Configuration.section_name("build", "x86_64"), "build_command", str(command)), MockCall("repository", "name", args.repository), MockCall(Configuration.section_name("build", "x86_64"), "makechrootpkg_flags", f"-U {args.build_as_user}"), + MockCall(Configuration.section_name("alpm", "x86_64"), "mirror", args.mirror), MockCall(Configuration.section_name("sign", "x86_64"), "target", " ".join([target.name.lower() for target in args.sign_target])), MockCall(Configuration.section_name("sign", "x86_64"), "key", args.sign_key), @@ -99,6 +101,23 @@ def test_configuration_create_ahriman(args: argparse.Namespace, configuration: C write_mock.assert_called_once_with(pytest.helpers.anyvar(int)) +def test_configuration_create_ahriman_no_multilib(args: argparse.Namespace, configuration: Configuration, + repository_paths: RepositoryPaths, mocker: MockerFixture) -> None: + """ + must create configuration for the service without multilib repository + """ + args = _default_args(args) + args.multilib = False + mocker.patch("pathlib.Path.open") + mocker.patch("ahriman.core.configuration.Configuration.write") + set_option_mock = mocker.patch("ahriman.core.configuration.Configuration.set_option") + + Setup.configuration_create_ahriman(args, "x86_64", args.repository, configuration) + set_option_mock.assert_has_calls([ + MockCall(Configuration.section_name("alpm", "x86_64"), "mirror", args.mirror), + ]) # non-strict check called intentionally + + def test_configuration_create_devtools(args: argparse.Namespace, repository_paths: RepositoryPaths, mocker: MockerFixture) -> None: """ @@ -111,11 +130,38 @@ def test_configuration_create_devtools(args: argparse.Namespace, repository_path write_mock = mocker.patch("ahriman.core.configuration.Configuration.write") Setup.configuration_create_devtools(args.build_command, "x86_64", args.from_configuration, - args.multilib, args.repository, repository_paths) + None, args.multilib, args.repository, repository_paths) add_section_mock.assert_has_calls([MockCall("multilib"), MockCall(args.repository)]) write_mock.assert_called_once_with(pytest.helpers.anyvar(int)) +def test_configuration_create_devtools_mirror(args: argparse.Namespace, repository_paths: RepositoryPaths, + mocker: MockerFixture) -> None: + """ + must create configuration for the devtools with mirror set explicitly + """ + def get(section: str, key: str, *args: Any, **kwargs: Any) -> Any: + del args + if section == "core" and key == "Include": + return str(Setup.MIRRORLIST_PATH) + return kwargs["fallback"] + + args = _default_args(args) + mocker.patch("pathlib.Path.open") + mocker.patch("ahriman.core.configuration.Configuration.set") + mocker.patch("ahriman.core.configuration.Configuration.write") + mocker.patch("ahriman.core.configuration.Configuration.sections", return_value=["core", "extra"]) + get_mock = mocker.patch("ahriman.core.configuration.Configuration.get", side_effect=get) + remove_option_mock = mocker.patch("ahriman.core.configuration.Configuration.remove_option") + set_option_mock = mocker.patch("ahriman.core.configuration.Configuration.set_option") + + Setup.configuration_create_devtools(args.build_command, "x86_64", args.from_configuration, + args.mirror, False, args.repository, repository_paths) + get_mock.assert_has_calls([MockCall("core", "Include", fallback=None), MockCall("extra", "Include", fallback=None)]) + remove_option_mock.assert_called_once_with("core", "Include") + set_option_mock.assert_has_calls([MockCall("core", "Server", args.mirror)]) # non-strict check called intentionally + + def test_configuration_create_devtools_no_multilib(args: argparse.Namespace, repository_paths: RepositoryPaths, mocker: MockerFixture) -> None: """ @@ -127,7 +173,7 @@ def test_configuration_create_devtools_no_multilib(args: argparse.Namespace, rep write_mock = mocker.patch("ahriman.core.configuration.Configuration.write") Setup.configuration_create_devtools(args.build_command, "x86_64", args.from_configuration, - False, args.repository, repository_paths) + None, False, args.repository, repository_paths) write_mock.assert_called_once_with(pytest.helpers.anyvar(int))