api: mark builds as new if their result isn't in the repo yet

This commit is contained in:
Christoph Reiter
2021-05-14 11:44:38 +02:00
parent b0c4e5d831
commit f83dec1783
3 changed files with 29 additions and 4 deletions

View File

@@ -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),
})

View File

@@ -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

View File

@@ -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) == []