From f83dec17837d101ee6f1deae0c4fa72460b69a57 Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Fri, 14 May 2021 11:44:38 +0200 Subject: [PATCH] api: mark builds as new if their result isn't in the repo yet --- app/api.py | 29 +++++++++++++++++++++++++---- app/appstate.py | 2 ++ tests/test_main.py | 2 ++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/app/api.py b/app/api.py index eb1bd56..4eae04c 100644 --- a/app/api.py +++ b/app/api.py @@ -63,15 +63,28 @@ async def index(request: Request, response: Response) -> Response: srcinfos.append(srcinfo) # packages that are new - available: Dict[str, List[SrcInfoPackage]] = {} + not_in_repo: Dict[str, List[SrcInfoPackage]] = {} + replaces_not_in_repo: Set[str] = set() + marked_new: Set[str] = set() for srcinfo in state.sourceinfos.values(): - available.setdefault(srcinfo.pkgname, []).append(srcinfo) + not_in_repo.setdefault(srcinfo.pkgname, []).append(srcinfo) + replaces_not_in_repo.update(srcinfo.replaces) for s in state.sources.values(): for p in s.packages.values(): - available.pop(p.name, None) - for sis in available.values(): + not_in_repo.pop(p.name, None) + replaces_not_in_repo.discard(p.name) + for sis in not_in_repo.values(): srcinfos.extend(sis) + # packages that are considered new, that don't exist in the repo, or + # don't replace packages already in the repo. We mark them as "new" so + # we can be more lax with them when they fail to build, since there is + # no regression. + for si in sis: + all_replaces_new = all(p in replaces_not_in_repo for p in si.replaces) + if all_replaces_new: + marked_new.add(si.pkgname) + def build_key(srcinfo: SrcInfoPackage) -> Tuple[str, str]: return (srcinfo.repo_url, srcinfo.repo_path) @@ -128,6 +141,9 @@ async def index(request: Request, response: Response) -> Response: return True return False + def srcinfo_is_new(si: SrcInfoPackage) -> bool: + return si.pkgname in marked_new + entries = [] all_provides: Dict[str, Set[str]] = {} repo_mapping = {} @@ -135,14 +151,18 @@ async def index(request: Request, response: Response) -> Response: packages = set() provides: Set[str] = set() needs_src = False + new_all: Dict[str, List[bool]] = {} for si in srcinfos: if not srcinfo_has_src(si): needs_src = True + new_all.setdefault(si.repo, []).append(srcinfo_is_new(si)) packages.add(si.pkgname) repo_mapping[si.pkgname] = si.repo for prov in si.provides: provides.add(prov) all_provides.setdefault(prov, set()).add(si.pkgname) + # if all packages to build are new, we consider the build as new + new = [k for k, v in new_all.items() if all(v)] entries.append({ "repo_url": srcinfos[0].repo_url, @@ -152,6 +172,7 @@ async def index(request: Request, response: Response) -> Response: "source": needs_src, "packages": packages, "provides": provides | packages, + "new": new, "makedepends": get_transitive_makedepends(packages), }) diff --git a/app/appstate.py b/app/appstate.py index cc325fa..5c94e5b 100644 --- a/app/appstate.py +++ b/app/appstate.py @@ -532,6 +532,7 @@ class SrcInfoPackage(object): self.makedepends: Dict[str, Set[str]] = {} self.provides: Dict[str, Set[str]] = {} self.conflicts: Dict[str, Set[str]] = {} + self.replaces: Set[str] = set() self.sources: List[str] = [] @property @@ -598,6 +599,7 @@ class SrcInfoPackage(object): package.makedepends = split_depends(pkg.get("makedepends", [])) package.conflicts = split_depends(pkg.get("conflicts", [])) package.provides = split_depends(pkg.get("provides", [])) + package.replaces = set(pkg.get("replaces", [])) package.sources = pkg.get("sources", []) packages.add(package) return packages diff --git a/tests/test_main.py b/tests/test_main.py index 3c43cb6..7b36b44 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -107,6 +107,7 @@ pkgbase = libarchive pkgname = libarchive pkgname = libarchive-devel \tdepends = libxml2-devel +\treplaces = libarchive-devel-git pkgname = something \tdepends = \n""" @@ -117,6 +118,7 @@ pkgname = something assert libarchive.pkgver == "3.5.1" devel = [p for p in packages if p.pkgname == "libarchive-devel"][0] assert list(devel.depends) == ["libxml2-devel"] + assert list(devel.replaces) == ["libarchive-devel-git"] assert devel.pkgver == "3.5.1" something = [p for p in packages if p.pkgname == "something"][0] assert list(something.depends) == []