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))