diff --git a/src/ahriman/core/alpm/remote/remote.py b/src/ahriman/core/alpm/remote/remote.py index 370e0b29..52e8f88a 100644 --- a/src/ahriman/core/alpm/remote/remote.py +++ b/src/ahriman/core/alpm/remote/remote.py @@ -94,6 +94,15 @@ class Remote(SyncHttpClient): for package in portion if package.name in packages or not packages } + + # simple check for duplicates. This method will remove all packages under base if there is + # a package named exactly as its base + packages = { + package.name: package + for package in packages.values() + if package.package_base not in packages or package.package_base == package.name + } + return list(packages.values()) @classmethod diff --git a/src/ahriman/web/views/v1/service/search.py b/src/ahriman/web/views/v1/service/search.py index 6d1911cf..3ca204c3 100644 --- a/src/ahriman/web/views/v1/service/search.py +++ b/src/ahriman/web/views/v1/service/search.py @@ -70,7 +70,7 @@ class SearchView(BaseView): if not packages: raise HTTPNotFound(reason=f"No packages found for terms: {search}") - comparator: Callable[[AURPackage], str] = lambda item: str(item.package_base) + comparator: Callable[[AURPackage], str] = lambda item: item.package_base response = [ { "package": package.package_base, diff --git a/tests/ahriman/core/alpm/remote/test_remote.py b/tests/ahriman/core/alpm/remote/test_remote.py index 7654c8ed..2674a854 100644 --- a/tests/ahriman/core/alpm/remote/test_remote.py +++ b/tests/ahriman/core/alpm/remote/test_remote.py @@ -1,5 +1,6 @@ import pytest +from dataclasses import replace from pytest_mock import MockerFixture from unittest.mock import call as MockCall @@ -88,6 +89,17 @@ def test_multisearch_single(aur_package_ahriman: AURPackage, pacman: Pacman, moc search_mock.assert_called_once_with("ahriman", pacman=pacman, search_by=None) +def test_multisearch_remove_duplicates(aur_package_ahriman: AURPackage, pacman: Pacman, mocker: MockerFixture) -> None: + """ + must remove duplicates from search result + """ + package1 = replace(aur_package_ahriman) + package2 = replace(aur_package_ahriman, name="ahriman-triggers") + mocker.patch("ahriman.core.alpm.remote.Remote.package_search", return_value=[package1, package2]) + + assert Remote.multisearch("ahriman", pacman=pacman) == [package1] + + def test_remote_git_url(remote: Remote) -> None: """ must raise NotImplemented for missing remote git url