Merge pull request #24 from kiviktnm/cache-aur-providers

Cache AUR package providers #23
This commit is contained in:
Kivi Kaitaniemi
2025-03-08 17:20:14 +02:00
committed by GitHub
+25 -12
View File
@@ -265,6 +265,7 @@ class ExtendedPackageSearch:
self._pacman = pacman self._pacman = pacman
self._package_info_cache: dict[str, PackageInfo] = {} self._package_info_cache: dict[str, PackageInfo] = {}
self._dep_provider_cache: dict[str, PackageInfo] = {} self._dep_provider_cache: dict[str, PackageInfo] = {}
self._known_providers_cache: dict[str, list[str]] = {}
self._user_packages: list[PackageInfo] = [] self._user_packages: list[PackageInfo] = []
def add_user_pkg(self, user_pkg: PackageInfo): def add_user_pkg(self, user_pkg: PackageInfo):
@@ -272,6 +273,15 @@ class ExtendedPackageSearch:
Adds the given package to user packages. Adds the given package to user packages.
""" """
self._user_packages.append(user_pkg) self._user_packages.append(user_pkg)
self._cache_pkg(user_pkg)
def _cache_pkg(self, pkg: PackageInfo):
for provided_pkg in pkg.provides:
self._known_providers_cache[provided_pkg] = self._known_providers_cache.get(
provided_pkg, []
)
self._known_providers_cache[provided_pkg].append(pkg.pkgname)
self._package_info_cache[pkg.pkgname] = pkg
def try_caching_packages(self, packages: list[str]): def try_caching_packages(self, packages: list[str]):
""" """
@@ -313,7 +323,7 @@ class ExtendedPackageSearch:
for user_package in self._user_packages: for user_package in self._user_packages:
if user_package.pkgname == pkgname: if user_package.pkgname == pkgname:
l.print_debug(f"'{pkgname}' found in user packages.") l.print_debug(f"'{pkgname}' found in user packages.")
self._package_info_cache[pkgname] = user_package self._cache_pkg(user_package)
break break
else: # if not in user_packages then: else: # if not in user_packages then:
info = PackageInfo( info = PackageInfo(
@@ -327,7 +337,7 @@ class ExtendedPackageSearch:
git_url=f"https://aur.archlinux.org/{result['PackageBase']}.git", git_url=f"https://aur.archlinux.org/{result['PackageBase']}.git",
pacman=self._pacman, pacman=self._pacman,
) )
self._package_info_cache[pkgname] = info self._cache_pkg(info)
l.print_debug("Request completed.") l.print_debug("Request completed.")
except (requests.RequestException, KeyError) as e: except (requests.RequestException, KeyError) as e:
@@ -352,7 +362,7 @@ class ExtendedPackageSearch:
for user_package in self._user_packages: for user_package in self._user_packages:
if user_package.pkgname == package: if user_package.pkgname == package:
l.print_debug(f"'{package}' found in user packages.") l.print_debug(f"'{package}' found in user packages.")
self._package_info_cache[package] = user_package self._cache_pkg(user_package)
return user_package return user_package
url = f"https://aur.archlinux.org/rpc/v5/info/{package}" url = f"https://aur.archlinux.org/rpc/v5/info/{package}"
@@ -383,7 +393,7 @@ class ExtendedPackageSearch:
pacman=self._pacman, pacman=self._pacman,
) )
self._package_info_cache[package] = info self._cache_pkg(info)
return info return info
except (requests.RequestException, KeyError) as e: except (requests.RequestException, KeyError) as e:
@@ -415,23 +425,26 @@ class ExtendedPackageSearch:
l.print_debug("No exact name matches found. Finding providers.") l.print_debug("No exact name matches found. Finding providers.")
user_pkg_results = [] known_pkg_results = self._known_providers_cache.get(stripped_dependency, [])
for user_package in self._user_packages: for user_package in self._user_packages:
if stripped_dependency in user_package.provides: if (
user_pkg_results.append(user_package.pkgname) stripped_dependency in user_package.provides
and stripped_dependency not in known_pkg_results
):
known_pkg_results.append(user_package.pkgname)
if len(user_pkg_results) == 1: if len(known_pkg_results) == 1:
pkg = self.get_package_info(user_pkg_results[0]) pkg = self.get_package_info(known_pkg_results[0])
assert pkg is not None assert pkg is not None
l.print_debug( l.print_debug(
f"Single provider for '{stripped_dependency}' found in user packages: '{pkg}'." f"Single provider for '{stripped_dependency}' found in known packages: '{pkg}'."
) )
self._dep_provider_cache[stripped_dependency] = pkg self._dep_provider_cache[stripped_dependency] = pkg
return pkg return pkg
if len(user_pkg_results) > 1: if len(known_pkg_results) > 1:
return self._choose_provider( return self._choose_provider(
stripped_dependency, user_pkg_results, "user packages" stripped_dependency, known_pkg_results, "user packages"
) )
url = ( url = (