commit ab5e7f4e375da363cdaf0dbc82e3cde0ac8f18ee
parent 00e573e955bda689eea20ec4d7cd58506945d0c7
Author: Florian Dold <florian@dold.me>
Date: Thu, 27 Jun 2024 22:35:58 +0200
packaging-ng: propagate outdated deps
Diffstat:
3 files changed, 87 insertions(+), 41 deletions(-)
diff --git a/packaging/ng/buildconfig/taler-harness.tag b/packaging/ng/buildconfig/taler-harness.tag
@@ -1 +1 @@
-v0.12.1
+v0.12.2
diff --git a/packaging/ng/buildconfig/taler-wallet-cli.tag b/packaging/ng/buildconfig/taler-wallet-cli.tag
@@ -1 +1 @@
-v0.12.1
+v0.12.2
diff --git a/packaging/ng/taler-pkg b/packaging/ng/taler-pkg
@@ -35,8 +35,15 @@ deps = {
"gnunet-gtk": ["gnunet"],
}
-
-def toposort(roots):
+# Compute reverse dependencies
+rdeps = {}
+for n1, d in deps.items():
+ for n2 in d:
+ rd = rdeps.setdefault(n2, [])
+ if n1 not in rd:
+ rd.append(n1)
+
+def buildsort(roots):
"""Toposort transitive closure of roots based on deps"""
out = []
stack = list(roots)
@@ -64,76 +71,114 @@ def toposort(roots):
return out
+def propagate_outdated(outdated):
+ """Propagate outdatedness to dependees"""
+ closure = set()
+ q = list(outdated)
+ while len(q):
+ n = q.pop()
+ closure.add(n)
+ for r in rdeps.get(n, []):
+ if r not in closure:
+ closure.add(r)
+ q.append(r)
+ return closure
+
+
+def find_outdated(pkgdir, roots):
+ """Find outdated components based on tag files"""
+ outdated = set()
+ for component in roots:
+ ver_requested = open(f"buildconfig/{component}.tag").read().strip()
+ built_tag_file = pkgdir / f"{component}.built.tag"
+ ver_built = None
+ if built_tag_file.exists():
+ ver_built = open(built_tag_file).read().strip()
+ if ver_built != ver_requested:
+ outdated.add(component)
+ print(component, ver_built, "->", ver_requested)
+ return outdated
+
+
def build(cfg):
distro = cfg.distro
print("building", distro)
dockerfile = f"distros/Dockerfile.{distro}"
image_tag = f"taler-packaging-{distro}:latest"
pkgdir = Path(f"packages/{distro}").absolute()
- subprocess.run(["podman", "build", "-t", image_tag, "-f", dockerfile], check=True)
-
- outdated_components = []
- # First, find out components that need to be built
- for component in components:
- ver_requested = open(f"buildconfig/{component}.tag").read().strip()
- built_tag_file = pkgdir / f"{component}.built.tag"
- ver_built = None
- if built_tag_file.exists():
- ver_built = open(built_tag_file).read().strip()
- if ver_built != ver_requested:
- outdated_components.append(component)
- print(component, ver_built, '->', ver_requested)
+ if not cfg.dry:
+ subprocess.run(
+ ["podman", "build", "-t", image_tag, "-f", dockerfile], check=True
+ )
- buildorder = toposort(outdated_components)
+ # Sort components by their dependencies
+ buildorder = buildsort(components)
print("build order:", buildorder)
+ outdated = find_outdated(pkgdir, buildorder)
+
+ # Propagate outdatedness to dependees
+ closure = propagate_outdated(outdated)
+
+ print("outdated closure", closure)
+
for component in buildorder:
+ if component not in closure:
+ continue
print("building", component)
pkgdir.mkdir(parents=True, exist_ok=True)
- subprocess.run(
- [
- "podman",
- "run",
- "-it",
- "--entrypoint=/bin/bash",
- "--security-opt",
- "label=disable",
- "--mount",
- f"type=bind,source={mydir}/buildscripts,target=/buildscripts,readonly",
- "--mount",
- f"type=bind,source={mydir}/buildconfig,target=/buildconfig,readonly",
- "--mount",
- f"type=bind,source={pkgdir},target=/pkgdir",
- image_tag,
- "/buildscripts/generic.sh",
- component,
- ],
- check=True,
- )
+ cmd = [
+ "podman",
+ "run",
+ "-it",
+ "--entrypoint=/bin/bash",
+ "--security-opt",
+ "label=disable",
+ "--mount",
+ f"type=bind,source={mydir}/buildscripts,target=/buildscripts,readonly",
+ "--mount",
+ f"type=bind,source={mydir}/buildconfig,target=/buildconfig,readonly",
+ "--mount",
+ f"type=bind,source={pkgdir},target=/pkgdir",
+ image_tag,
+ "/buildscripts/generic.sh",
+ component,
+ ]
+ if not cfg.dry:
+ subprocess.run(
+ cmd,
+ check=True,
+ )
+
def print_latest(cfg):
subprocess.run(["./helpers/print-latest-versions"], check=True)
+
def show_order(cfg):
- buildorder = toposort(list(cfg.roots))
+ buildorder = buildsort(list(cfg.roots))
print("build order:", buildorder)
+
def main():
- parser = argparse.ArgumentParser(prog="taler-pkg", description="Taler Packaging Helper")
+ parser = argparse.ArgumentParser(
+ prog="taler-pkg", description="Taler Packaging Helper"
+ )
subparsers = parser.add_subparsers(help="Run a subcommand", metavar="SUBCOMMAND")
parser_build = subparsers.add_parser("build", help="Build packages for distro.")
parser_build.set_defaults(func=build)
parser_build.add_argument("distro")
+ parser_build.add_argument("--dry", help="Dry run", action="store_true", default=False)
parser_show_latest = subparsers.add_parser(
"show-latest", help="Show latest version of packages."
)
parser_show_latest.set_defaults(func=print_latest)
- parser_show_order= subparsers.add_parser("show-order", help="Show build order.")
+ parser_show_order = subparsers.add_parser("show-order", help="Show build order.")
parser_show_order.set_defaults(func=show_order)
parser_show_order.add_argument("roots", nargs="+")
@@ -144,5 +189,6 @@ def main():
else:
args.func(args)
+
if __name__ == "__main__":
main()