diff --git a/src/ahriman/application/application/application.py b/src/ahriman/application/application/application.py index e88d2629..a17bc3a6 100644 --- a/src/ahriman/application/application/application.py +++ b/src/ahriman/application/application/application.py @@ -142,8 +142,13 @@ class Application(ApplicationPackages, ApplicationRepository): while missing := missing_dependencies(with_dependencies.values()): for package_name, username in missing.items(): - package = Package.from_aur(package_name, self.repository.pacman, username) + if (source_dir := self.repository.paths.cache_for(package_name)).is_dir(): + # there is local cache, load package from it + package = Package.from_build(source_dir, self.repository.architecture, username) + else: + package = Package.from_aur(package_name, self.repository.pacman, username) with_dependencies[package.base] = package + # register package in local database self.database.remote_update(package) self.repository.reporter.set_unknown(package) diff --git a/tests/ahriman/application/application/test_application.py b/tests/ahriman/application/application/test_application.py index c6275df9..981f1065 100644 --- a/tests/ahriman/application/application/test_application.py +++ b/tests/ahriman/application/application/test_application.py @@ -86,7 +86,11 @@ def test_with_dependencies(application: Application, package_ahriman: Package, p "python-installer": create_package_mock("python-installer"), } - package_mock = mocker.patch("ahriman.models.package.Package.from_aur", side_effect=lambda *args: packages[args[0]]) + mocker.patch("pathlib.Path.is_dir", autospec=True, side_effect=lambda p: p.name == "python") + package_aur_mock = mocker.patch("ahriman.models.package.Package.from_aur", + side_effect=lambda *args: packages[args[0]]) + package_local_mock = mocker.patch("ahriman.models.package.Package.from_build", + side_effect=lambda *args: packages[args[0].name]) packages_mock = mocker.patch("ahriman.application.application.Application._known_packages", return_value={"devtools", "python-build", "python-pytest"}) update_remote_mock = mocker.patch("ahriman.core.database.SQLite.remote_update") @@ -94,11 +98,13 @@ def test_with_dependencies(application: Application, package_ahriman: Package, p result = application.with_dependencies([package_ahriman], process_dependencies=True) assert {package.base: package for package in result} == packages - package_mock.assert_has_calls([ + package_aur_mock.assert_has_calls([ MockCall(package_python_schedule.base, application.repository.pacman, package_ahriman.packager), - MockCall("python", application.repository.pacman, package_ahriman.packager), MockCall("python-installer", application.repository.pacman, package_ahriman.packager), ], any_order=True) + package_local_mock.assert_has_calls([ + MockCall(application.repository.paths.cache_for("python"), "x86_64", package_ahriman.packager), + ], any_order=True) packages_mock.assert_called_once_with() update_remote_mock.assert_has_calls([