build status: inherit blocking info instead of replacing it
a bit hacky.. but works Fixes #42
This commit is contained in:
parent
c23ca57bed
commit
d74753f0e5
74
autobuild.py
74
autobuild.py
@ -124,7 +124,7 @@ class Package(dict):
|
|||||||
|
|
||||||
def get_status_details(self, build_type: BuildType) -> Dict[str, Any]:
|
def get_status_details(self, build_type: BuildType) -> Dict[str, Any]:
|
||||||
build = self._get_build(build_type)
|
build = self._get_build(build_type)
|
||||||
return build.get("status_details", {})
|
return dict(build.get("status_details", {}))
|
||||||
|
|
||||||
def set_status(self, build_type: BuildType, status: PackageStatus,
|
def set_status(self, build_type: BuildType, status: PackageStatus,
|
||||||
description: Optional[str] = None,
|
description: Optional[str] = None,
|
||||||
@ -138,6 +138,24 @@ class Package(dict):
|
|||||||
meta["urls"] = urls
|
meta["urls"] = urls
|
||||||
build["status_details"] = meta
|
build["status_details"] = meta
|
||||||
|
|
||||||
|
def set_blocked(
|
||||||
|
self, build_type: BuildType, status: PackageStatus,
|
||||||
|
dep: "Package", dep_type: BuildType):
|
||||||
|
dep_details = dep.get_status_details(dep_type)
|
||||||
|
dep_blocked = dep_details.get("blocked", {})
|
||||||
|
details = self.get_status_details(build_type)
|
||||||
|
blocked = details.get("blocked", {})
|
||||||
|
if dep_blocked:
|
||||||
|
blocked = dict(dep_blocked)
|
||||||
|
else:
|
||||||
|
blocked.setdefault(dep, set()).add(dep_type)
|
||||||
|
descs = []
|
||||||
|
for pkg, types in blocked.items():
|
||||||
|
descs.append("%s (%s)" % (pkg["name"], "/".join(types)))
|
||||||
|
self.set_status(build_type, status, "Blocked by: " + ", ".join(descs))
|
||||||
|
build = self._get_build(build_type)
|
||||||
|
build.setdefault("status_details", {})["blocked"] = blocked
|
||||||
|
|
||||||
def is_new(self, build_type: BuildType) -> bool:
|
def is_new(self, build_type: BuildType) -> bool:
|
||||||
build = self._get_build(build_type)
|
build = self._get_build(build_type)
|
||||||
return build.get("new", False)
|
return build.get("new", False)
|
||||||
@ -743,15 +761,13 @@ def get_buildqueue_with_status(full_details: bool = False) -> List[Package]:
|
|||||||
for build_type in pkg.get_build_types():
|
for build_type in pkg.get_build_types():
|
||||||
status = pkg.get_status(build_type)
|
status = pkg.get_status(build_type)
|
||||||
if status == PackageStatus.WAITING_FOR_BUILD:
|
if status == PackageStatus.WAITING_FOR_BUILD:
|
||||||
missing_deps = set()
|
|
||||||
for dep_type, deps in pkg.get_depends(build_type).items():
|
for dep_type, deps in pkg.get_depends(build_type).items():
|
||||||
for dep in deps:
|
for dep in deps:
|
||||||
dep_status = dep.get_status(dep_type)
|
dep_status = dep.get_status(dep_type)
|
||||||
if dep_status != PackageStatus.FINISHED:
|
if dep_status != PackageStatus.FINISHED:
|
||||||
missing_deps.add(dep)
|
pkg.set_blocked(
|
||||||
if missing_deps:
|
build_type, PackageStatus.WAITING_FOR_DEPENDENCIES, dep, dep_type)
|
||||||
desc = f"Waiting for: {', '.join(sorted(d['name'] for d in missing_deps))}"
|
|
||||||
pkg.set_status(build_type, PackageStatus.WAITING_FOR_DEPENDENCIES, desc)
|
|
||||||
|
|
||||||
# Block packages where not all deps/rdeps/related are finished
|
# Block packages where not all deps/rdeps/related are finished
|
||||||
changed = True
|
changed = True
|
||||||
@ -765,14 +781,14 @@ def get_buildqueue_with_status(full_details: bool = False) -> List[Package]:
|
|||||||
if build_type_is_src(build_type):
|
if build_type_is_src(build_type):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
missing_deps = set()
|
|
||||||
for dep_type, deps in pkg.get_depends(build_type).items():
|
for dep_type, deps in pkg.get_depends(build_type).items():
|
||||||
for dep in deps:
|
for dep in deps:
|
||||||
dep_status = dep.get_status(dep_type)
|
dep_status = dep.get_status(dep_type)
|
||||||
if dep_status != PackageStatus.FINISHED:
|
if dep_status != PackageStatus.FINISHED:
|
||||||
missing_deps.add(dep)
|
pkg.set_blocked(
|
||||||
|
build_type, PackageStatus.FINISHED_BUT_BLOCKED, dep, dep_type)
|
||||||
|
changed = True
|
||||||
|
|
||||||
missing_rdeps = set()
|
|
||||||
for dep_type, deps in pkg.get_rdepends(build_type).items():
|
for dep_type, deps in pkg.get_rdepends(build_type).items():
|
||||||
for dep in deps:
|
for dep in deps:
|
||||||
if dep["name"] in Config.IGNORE_RDEP_PACKAGES or \
|
if dep["name"] in Config.IGNORE_RDEP_PACKAGES or \
|
||||||
@ -782,26 +798,13 @@ def get_buildqueue_with_status(full_details: bool = False) -> List[Package]:
|
|||||||
dep_new = dep.is_new(dep_type)
|
dep_new = dep.is_new(dep_type)
|
||||||
# if the rdep isn't in the repo we can't break it by uploading
|
# if the rdep isn't in the repo we can't break it by uploading
|
||||||
if dep_status != PackageStatus.FINISHED and not dep_new:
|
if dep_status != PackageStatus.FINISHED and not dep_new:
|
||||||
missing_rdeps.add(dep)
|
pkg.set_blocked(
|
||||||
|
build_type, PackageStatus.FINISHED_BUT_BLOCKED, dep, dep_type)
|
||||||
descs = []
|
changed = True
|
||||||
if missing_deps:
|
|
||||||
desc = (f"Waiting on dependencies: "
|
|
||||||
f"{ ', '.join(sorted(p['name'] for p in missing_deps)) }")
|
|
||||||
descs.append(desc)
|
|
||||||
if missing_rdeps:
|
|
||||||
desc = (f"Waiting on reverse dependencies: "
|
|
||||||
f"{ ', '.join(sorted(p['name'] for p in missing_rdeps)) }")
|
|
||||||
descs.append(desc)
|
|
||||||
|
|
||||||
if descs:
|
|
||||||
changed = True
|
|
||||||
pkg.set_status(
|
|
||||||
build_type, PackageStatus.FINISHED_BUT_BLOCKED, ". ".join(descs))
|
|
||||||
|
|
||||||
# Block packages where not every build type is finished
|
# Block packages where not every build type is finished
|
||||||
for pkg in pkgs:
|
for pkg in pkgs:
|
||||||
unfinished: List[str] = []
|
unfinished = []
|
||||||
blocked = []
|
blocked = []
|
||||||
finished = []
|
finished = []
|
||||||
for build_type in pkg.get_build_types():
|
for build_type in pkg.get_build_types():
|
||||||
@ -821,22 +824,25 @@ def get_buildqueue_with_status(full_details: bool = False) -> List[Package]:
|
|||||||
# packages will not change anything, so block them.
|
# packages will not change anything, so block them.
|
||||||
if not blocked and not unfinished and finished and \
|
if not blocked and not unfinished and finished and \
|
||||||
all(build_type_is_src(bt) for bt in finished):
|
all(build_type_is_src(bt) for bt in finished):
|
||||||
unfinished.append("any")
|
|
||||||
|
|
||||||
if unfinished:
|
|
||||||
for build_type in pkg.get_build_types():
|
for build_type in pkg.get_build_types():
|
||||||
status = pkg.get_status(build_type)
|
status = pkg.get_status(build_type)
|
||||||
if status in (PackageStatus.FINISHED, PackageStatus.FINISHED_BUT_BLOCKED):
|
if status in (PackageStatus.FINISHED, PackageStatus.FINISHED_BUT_BLOCKED):
|
||||||
desc = f"Missing related builds: {', '.join(sorted(unfinished))}"
|
|
||||||
changed = True
|
changed = True
|
||||||
pkg.set_status(build_type, PackageStatus.FINISHED_BUT_INCOMPLETE, desc)
|
pkg.set_status(build_type, PackageStatus.FINISHED_BUT_INCOMPLETE)
|
||||||
|
elif unfinished:
|
||||||
|
for build_type in pkg.get_build_types():
|
||||||
|
status = pkg.get_status(build_type)
|
||||||
|
if status in (PackageStatus.FINISHED, PackageStatus.FINISHED_BUT_BLOCKED):
|
||||||
|
changed = True
|
||||||
|
for bt in unfinished:
|
||||||
|
pkg.set_blocked(build_type, PackageStatus.FINISHED_BUT_INCOMPLETE, pkg, bt)
|
||||||
elif blocked:
|
elif blocked:
|
||||||
for build_type in pkg.get_build_types():
|
for build_type in pkg.get_build_types():
|
||||||
status = pkg.get_status(build_type)
|
status = pkg.get_status(build_type)
|
||||||
if status == PackageStatus.FINISHED:
|
if status == PackageStatus.FINISHED:
|
||||||
desc = f"Related build blocked: {', '.join(sorted(blocked))}"
|
|
||||||
changed = True
|
changed = True
|
||||||
pkg.set_status(build_type, PackageStatus.FINISHED_BUT_BLOCKED, desc)
|
for bt in blocked:
|
||||||
|
pkg.set_blocked(build_type, PackageStatus.FINISHED_BUT_BLOCKED, pkg, bt)
|
||||||
|
|
||||||
return pkgs
|
return pkgs
|
||||||
|
|
||||||
@ -1028,6 +1034,7 @@ def update_status(pkgs: List[Package]) -> None:
|
|||||||
pkg_result = {}
|
pkg_result = {}
|
||||||
for build_type in pkg.get_build_types():
|
for build_type in pkg.get_build_types():
|
||||||
details = pkg.get_status_details(build_type)
|
details = pkg.get_status_details(build_type)
|
||||||
|
details.pop("blocked", None)
|
||||||
details["status"] = pkg.get_status(build_type).value
|
details["status"] = pkg.get_status(build_type).value
|
||||||
details["version"] = pkg["version"]
|
details["version"] = pkg["version"]
|
||||||
pkg_result[build_type] = details
|
pkg_result[build_type] = details
|
||||||
@ -1070,6 +1077,7 @@ def show_build(args: Any) -> None:
|
|||||||
for build_type in pkg.get_build_types():
|
for build_type in pkg.get_build_types():
|
||||||
status = pkg.get_status(build_type)
|
status = pkg.get_status(build_type)
|
||||||
details = pkg.get_status_details(build_type)
|
details = pkg.get_status_details(build_type)
|
||||||
|
details.pop("blocked", None)
|
||||||
if status == PackageStatus.WAITING_FOR_BUILD:
|
if status == PackageStatus.WAITING_FOR_BUILD:
|
||||||
todo.append((pkg, build_type, status, details))
|
todo.append((pkg, build_type, status, details))
|
||||||
elif status in (PackageStatus.FINISHED, PackageStatus.FINISHED_BUT_BLOCKED,
|
elif status in (PackageStatus.FINISHED, PackageStatus.FINISHED_BUT_BLOCKED,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user