From f250049cca24d7178cb52569c1da4273884e5aa8 Mon Sep 17 00:00:00 2001
From: Joel Grunbaum <joelgrun@gmail.com>
Date: Tue, 03 Mar 2026 00:47:01 +0000
Subject: [PATCH] Rebuild if in config repo
---
src/archrepobuild/builder.py | 49 ++++++++++++++++++++++++++++++++++++-------------
1 files changed, 36 insertions(+), 13 deletions(-)
diff --git a/src/archrepobuild/builder.py b/src/archrepobuild/builder.py
index 4c0a9d0..8a45ba3 100644
--- a/src/archrepobuild/builder.py
+++ b/src/archrepobuild/builder.py
@@ -10,7 +10,9 @@
from enum import Enum
from pathlib import Path
from concurrent.futures import ProcessPoolExecutor
-from typing import Any
+from typing import Any, TYPE_CHECKING
+if TYPE_CHECKING:
+ from archrepobuild.repo import RepoManager
from archrepobuild.aur import AURClient
from archrepobuild.config import Config, PackageOverride
@@ -153,15 +155,18 @@
self,
config: Config,
aur_client: AURClient,
+ repo: RepoManager | None = None,
):
"""Initialize builder.
Args:
config: Application configuration
aur_client: AUR client for package info
+ repo: Optional repository manager for incremental registration
"""
self.config = config
self.aur_client = aur_client
+ self.repo = repo
self.resolver = DependencyResolver(aur_client)
self._lock_dir = config.repository.build_dir / ".locks"
self._executor: ProcessPoolExecutor | None = None
@@ -251,11 +256,16 @@
raise ValueError(f"Package not found in AUR: {package}")
pkg_dir.parent.mkdir(parents=True, exist_ok=True)
- subprocess.run(
- ["git", "clone", pkg_info.git_url, str(pkg_dir)],
- check=True,
- capture_output=True,
- )
+ try:
+ subprocess.run(
+ ["git", "clone", pkg_info.git_url, str(pkg_dir)],
+ check=True,
+ capture_output=True,
+ text=True,
+ )
+ except subprocess.CalledProcessError as e:
+ logger.error(f"Failed to clone {package} from {pkg_info.git_url}: {e.stderr}")
+ raise ValueError(f"Failed to clone package from AUR: {e.stderr}")
return True
def _is_vcs_package(self, package_dir: Path) -> bool:
@@ -484,11 +494,12 @@
error=str(e),
)
- async def add_package(self, package: str) -> BuildResult:
+ async def add_package(self, package: str, include_repo: bool = False) -> BuildResult:
"""Add and build (or download) a new package with dependencies.
Args:
package: Package name
+ include_repo: Whether to check the managed repository for existing packages
Returns:
BuildResult for the main package
@@ -496,7 +507,8 @@
logger.info(f"Adding package: {package}")
# Resolve dependencies
- build_order = await self.resolver.resolve([package])
+ exclude_repo = None if include_repo else self.config.repository.name
+ build_order = await self.resolver.resolve([package], exclude_repo=exclude_repo)
# Filter build order: skip managed repo, download others, build AUR
final_results: list[BuildResult] = []
@@ -504,10 +516,14 @@
repo = self.resolver.is_in_repos(pkg_name)
if repo == self.config.repository.name:
- logger.info(f"Package {pkg_name} already in managed repository, skipping")
- if pkg_name == package:
- return BuildResult(package=package, status=BuildStatus.SKIPPED)
- continue
+ if include_repo:
+ logger.info(f"Package {pkg_name} already in managed repository, skipping")
+ if pkg_name == package:
+ return BuildResult(package=package, status=BuildStatus.SKIPPED)
+ continue
+ else:
+ # Treat as not in repo to force rebuild from AUR
+ repo = None
if repo:
logger.info(f"Package {pkg_name} found in {repo}, downloading...")
@@ -518,7 +534,14 @@
final_results.append(result)
- if result.status == BuildStatus.FAILED:
+ if result.status == BuildStatus.SUCCESS:
+ if self.repo:
+ added = self.repo.add_packages(result)
+ if added:
+ logger.info(f"Added to repository: {', '.join(added)}")
+ # Refresh resolver cache to recognize the newly added packages
+ self.resolver._refresh_pacman_cache(sync=True)
+ elif result.status == BuildStatus.FAILED:
logger.error(f"Failed to process {pkg_name}, aborting")
if pkg_name == package:
return result
--
Gitblit v1.10.0