diff --git a/src/ahriman/application/ahriman.py b/src/ahriman/application/ahriman.py index e2de9358..5532b250 100644 --- a/src/ahriman/application/ahriman.py +++ b/src/ahriman/application/ahriman.py @@ -89,7 +89,6 @@ def _parser() -> argparse.ArgumentParser: _set_repo_rebuild_parser(subparsers) _set_repo_remove_unknown_parser(subparsers) _set_repo_report_parser(subparsers) - _set_repo_restore_parser(subparsers) _set_repo_setup_parser(subparsers) _set_repo_sign_parser(subparsers) _set_repo_status_update_parser(subparsers) @@ -375,6 +374,12 @@ def _set_repo_rebuild_parser(root: SubParserAction) -> argparse.ArgumentParser: parser.add_argument("--depends-on", help="only rebuild packages that depend on specified package", action="append") parser.add_argument("--dry-run", help="just perform check for packages without rebuild process itself", action="store_true") + parser.add_argument("--from-database", + help="read packages from database instead of filesystem. This feature in particular is " + "required in case if you would like to restore repository from another repository " + "instance. Note however that in order to restore packages you need to have original " + "ahriman instance run with web service and have run repo-update at least once.", + action="store_true") parser.add_argument("-e", "--exit-code", help="return non-zero exit status if result is empty", action="store_true") parser.set_defaults(handler=handlers.Rebuild) return parser @@ -410,21 +415,6 @@ def _set_repo_report_parser(root: SubParserAction) -> argparse.ArgumentParser: return parser -def _set_repo_restore_parser(root: SubParserAction) -> argparse.ArgumentParser: - """ - add parser for package addition subcommand - :param root: subparsers for the commands - :return: created argument parser - """ - parser = root.add_parser("repo-restore", aliases=["restore"], help="restore repository", - description="restore repository from database file", formatter_class=_formatter) - parser.add_argument("-e", "--exit-code", help="return non-zero exit status if result is empty", action="store_true") - parser.add_argument("-n", "--now", help="run update function after", action="store_true") - parser.add_argument("--without-dependencies", help="do not add dependencies", action="store_true") - parser.set_defaults(handler=handlers.Add, package=None, source=PackageSource.AUR) - return parser - - def _set_repo_setup_parser(root: SubParserAction) -> argparse.ArgumentParser: """ add parser for setup subcommand diff --git a/src/ahriman/application/handlers/add.py b/src/ahriman/application/handlers/add.py index 58311e58..48e4d0ca 100644 --- a/src/ahriman/application/handlers/add.py +++ b/src/ahriman/application/handlers/add.py @@ -19,7 +19,7 @@ # import argparse -from typing import List, Type +from typing import Type from ahriman.application.application import Application from ahriman.application.handlers.handler import Handler @@ -43,20 +43,10 @@ class Add(Handler): :param unsafe: if set no user check will be performed before path creation """ application = Application(architecture, configuration, no_report, unsafe) - packages = Add.extract_packages(application) if args.package is None else args.package - application.add(packages, args.source, args.without_dependencies) + application.add(args.package, args.source, args.without_dependencies) if not args.now: return - packages = application.updates(packages, True, True, False, True, application.logger.info) + packages = application.updates(args.package, True, True, False, True, application.logger.info) result = application.update(packages) Add.check_if_empty(args.exit_code, result.is_empty) - - @staticmethod - def extract_packages(application: Application) -> List[str]: - """ - extract packages from database file - :param application: application instance - :return: list of packages which were stored in database - """ - return [package.base for (package, _) in application.database.packages_get()] diff --git a/src/ahriman/application/handlers/rebuild.py b/src/ahriman/application/handlers/rebuild.py index be686806..b1dd87ed 100644 --- a/src/ahriman/application/handlers/rebuild.py +++ b/src/ahriman/application/handlers/rebuild.py @@ -19,12 +19,13 @@ # import argparse -from typing import Type +from typing import List, Type from ahriman.application.application import Application from ahriman.application.handlers.handler import Handler from ahriman.core.configuration import Configuration from ahriman.core.formatters.update_printer import UpdatePrinter +from ahriman.models.package import Package class Rebuild(Handler): @@ -46,7 +47,10 @@ class Rebuild(Handler): depends_on = set(args.depends_on) if args.depends_on else None application = Application(architecture, configuration, no_report, unsafe) - updates = application.repository.packages_depends_on(depends_on) + if args.from_database: + updates = Rebuild.extract_packages(application) + else: + updates = application.repository.packages_depends_on(depends_on) Rebuild.check_if_empty(args.exit_code, not updates) if args.dry_run: @@ -56,3 +60,12 @@ class Rebuild(Handler): result = application.update(updates) Rebuild.check_if_empty(args.exit_code, result.is_empty) + + @staticmethod + def extract_packages(application: Application) -> List[Package]: + """ + extract packages from database file + :param application: application instance + :return: list of packages which were stored in database + """ + return [package for (package, _) in application.database.packages_get()] diff --git a/tests/ahriman/application/handlers/test_handler_add.py b/tests/ahriman/application/handlers/test_handler_add.py index 4128dea5..108ee9fc 100644 --- a/tests/ahriman/application/handlers/test_handler_add.py +++ b/tests/ahriman/application/handlers/test_handler_add.py @@ -3,7 +3,6 @@ import pytest from pytest_mock import MockerFixture -from ahriman.application.application import Application from ahriman.application.handlers import Add from ahriman.core.configuration import Configuration from ahriman.models.package import Package @@ -37,20 +36,6 @@ def test_run(args: argparse.Namespace, configuration: Configuration, mocker: Moc application_mock.assert_called_once_with(args.package, args.source, args.without_dependencies) -def test_run_extract_packages(args: argparse.Namespace, configuration: Configuration, mocker: MockerFixture) -> None: - """ - must run command - """ - args = _default_args(args) - args.package = None - mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_create") - mocker.patch("ahriman.application.application.Application.add") - extract_mock = mocker.patch("ahriman.application.handlers.Add.extract_packages", return_value=[]) - - Add.run(args, "x86_64", configuration, True, False) - extract_mock.assert_called_once_with(pytest.helpers.anyvar(int)) - - def test_run_with_updates(args: argparse.Namespace, configuration: Configuration, package_ahriman: Package, mocker: MockerFixture) -> None: """ @@ -87,12 +72,3 @@ def test_run_empty_exception(args: argparse.Namespace, configuration: Configurat Add.run(args, "x86_64", configuration, True, False) check_mock.assert_called_once_with(True, True) - - -def test_extract_packages(application: Application, mocker: MockerFixture) -> None: - """ - must extract packages from database - """ - packages_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.packages_get") - Add.extract_packages(application) - packages_mock.assert_called_once_with() diff --git a/tests/ahriman/application/handlers/test_handler_rebuild.py b/tests/ahriman/application/handlers/test_handler_rebuild.py index ffeec4a2..99abe028 100644 --- a/tests/ahriman/application/handlers/test_handler_rebuild.py +++ b/tests/ahriman/application/handlers/test_handler_rebuild.py @@ -4,6 +4,7 @@ import pytest from pytest_mock import MockerFixture from unittest import mock +from ahriman.application.application import Application from ahriman.application.handlers import Rebuild from ahriman.core.configuration import Configuration from ahriman.models.package import Package @@ -18,6 +19,7 @@ def _default_args(args: argparse.Namespace) -> argparse.Namespace: """ args.depends_on = [] args.dry_run = False + args.from_database = False args.exit_code = False return args @@ -42,6 +44,20 @@ def test_run(args: argparse.Namespace, package_ahriman: Package, check_mock.assert_has_calls([mock.call(False, False), mock.call(False, False)]) +def test_run_extract_packages(args: argparse.Namespace, configuration: Configuration, mocker: MockerFixture) -> None: + """ + must run command + """ + args = _default_args(args) + args.from_database = True + mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_create") + mocker.patch("ahriman.application.application.Application.add") + extract_mock = mocker.patch("ahriman.application.handlers.Rebuild.extract_packages", return_value=[]) + + Rebuild.run(args, "x86_64", configuration, True, False) + extract_mock.assert_called_once_with(pytest.helpers.anyvar(int)) + + def test_run_dry_run(args: argparse.Namespace, configuration: Configuration, package_ahriman: Package, mocker: MockerFixture) -> None: """ @@ -116,3 +132,12 @@ def test_run_build_empty_exception(args: argparse.Namespace, configuration: Conf Rebuild.run(args, "x86_64", configuration, True, False) check_mock.assert_has_calls([mock.call(True, False), mock.call(True, True)]) + + +def test_extract_packages(application: Application, mocker: MockerFixture) -> None: + """ + must extract packages from database + """ + packages_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.packages_get") + Rebuild.extract_packages(application) + packages_mock.assert_called_once_with() diff --git a/tests/ahriman/application/test_ahriman.py b/tests/ahriman/application/test_ahriman.py index f347813c..7708950f 100644 --- a/tests/ahriman/application/test_ahriman.py +++ b/tests/ahriman/application/test_ahriman.py @@ -6,7 +6,6 @@ from pytest_mock import MockerFixture from ahriman.application.handlers import Handler from ahriman.models.action import Action from ahriman.models.build_status import BuildStatusEnum -from ahriman.models.package_source import PackageSource from ahriman.models.sign_settings import SignSettings from ahriman.models.user_access import UserAccess @@ -340,25 +339,6 @@ def test_subparsers_repo_report_architecture(parser: argparse.ArgumentParser) -> assert args.architecture == ["x86_64"] -def test_subparsers_repo_restore(parser: argparse.ArgumentParser) -> None: - """ - repo-restore command must imply package and source - """ - args = parser.parse_args(["repo-restore"]) - assert args.package is None - assert args.source == PackageSource.AUR - - -def test_subparsers_repo_restore_architecture(parser: argparse.ArgumentParser) -> None: - """ - repo-restore command must correctly parse architecture list - """ - args = parser.parse_args(["repo-restore"]) - assert args.architecture is None - args = parser.parse_args(["-a", "x86_64", "repo-restore"]) - assert args.architecture == ["x86_64"] - - def test_subparsers_repo_setup(parser: argparse.ArgumentParser) -> None: """ repo-setup command must imply lock, no-report, quiet and unsafe