From 123118d3c95a1405d1fc61b33d9375a6a2d29469 Mon Sep 17 00:00:00 2001 From: Evgenii Alekseev Date: Fri, 13 Feb 2026 23:16:53 +0200 Subject: [PATCH] speedup archive_lookup processing by iterrupting cycle --- src/ahriman/core/repository/executor.py | 39 ++++++++++++------------- src/ahriman/core/utils.py | 2 +- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/ahriman/core/repository/executor.py b/src/ahriman/core/repository/executor.py index ddd45893..5265b354 100644 --- a/src/ahriman/core/repository/executor.py +++ b/src/ahriman/core/repository/executor.py @@ -19,7 +19,7 @@ # import shutil -from collections.abc import Iterable, Iterator +from collections.abc import Iterable from pathlib import Path from tempfile import TemporaryDirectory @@ -27,7 +27,7 @@ from ahriman.core.build_tools.package_archive import PackageArchive from ahriman.core.build_tools.task import Task from ahriman.core.repository.cleaner import Cleaner from ahriman.core.repository.package_info import PackageInfo -from ahriman.core.utils import atomic_move, filelock, package_like, safe_filename, symlink_relative +from ahriman.core.utils import atomic_move, filelock, list_flatmap, package_like, safe_filename, symlink_relative from ahriman.models.changes import Changes from ahriman.models.event import EventType from ahriman.models.package import Package @@ -41,37 +41,34 @@ class Executor(PackageInfo, Cleaner): trait for common repository update processes """ - def _archive_lookup(self, package: Package) -> Iterator[Path]: + def _archive_lookup(self, package: Package) -> list[Path]: """ check if there is a rebuilt package already Args: package(Package): package to check - Yields: - Path: list of built packages and signatures if available, empty list otherwise + Returns: + list[Path]: list of built packages and signatures if available, empty list otherwise """ archive = self.paths.archive_for(package.base) if not archive.is_dir(): - return + return [] - # find all packages which have same version - same_version = [ - built - for path in filter(package_like, archive.iterdir()) - if (built := Package.from_archive(path, self.pacman)).version == package.version - ] - # no packages of the same version found - if not same_version: - return + for path in filter(package_like, archive.iterdir()): + # check if package version is the same + built = Package.from_archive(path, self.pacman) + if built.version != package.version: + continue - packages = [single for built in same_version for single in built.packages.values()] - # all packages must be either any or same architecture - if not all(single.architecture in ("any", self.architecture) for single in packages): - return + packages = built.packages.values() + # all packages must be either any or same architecture + if not all(single.architecture in ("any", self.architecture) for single in packages): + continue - for single in packages: - yield from archive.glob(f"{single.filename}*") + return list_flatmap(packages, lambda single: archive.glob(f"{single.filename}*")) + + return [] def _archive_rename(self, description: PackageDescription, package_base: str) -> None: """ diff --git a/src/ahriman/core/utils.py b/src/ahriman/core/utils.py index 4efc65e8..6eb5d150 100644 --- a/src/ahriman/core/utils.py +++ b/src/ahriman/core/utils.py @@ -327,7 +327,7 @@ def full_version(epoch: str | int | None, pkgver: str, pkgrel: str) -> str: return f"{prefix}{pkgver}-{pkgrel}" -def list_flatmap(source: Iterable[T], extractor: Callable[[T], list[R]]) -> list[R]: +def list_flatmap(source: Iterable[T], extractor: Callable[[T], Iterable[R]]) -> list[R]: """ extract elements from list of lists, flatten them and apply ``extractor``