pthbs_genpkgpy

Template engine for producing packages for pthbs written using Python and Jinja
git clone https://ccx.te2000.cz/git/pthbs_genpkgpy
Log | Files | Refs | README

commit 56cbbdfd7bd19ad7e4f06d60ecd43ceb3d71fb48
parent 1476cc806c3387c103f35ed94ce24dcec1553d99
Author: Jan Pobrislo <ccx@te2000.cz>
Date:   Wed,  5 Nov 2025 21:34:04 +0000

Allow skipping packages

Diffstat:
Mgenpkg.py | 53++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 42 insertions(+), 11 deletions(-)

diff --git a/genpkg.py b/genpkg.py @@ -106,6 +106,14 @@ def _value_error(*args, **kwargs): raise ValueError(*args, **kwargs) +class SkipPackageException(Exception): + pass + + +def _skip_package(*args, **kwargs): + raise SkipPackageException(*args, **kwargs) + + class Main: argument_parser = argparse.ArgumentParser() argument_parser.add_argument('-P', '--package-dir', default='packages') @@ -136,6 +144,7 @@ class Main: self.env.globals["downloads"] = DownloadsInfo(index_dir / 'downloadlist.sha256') self.env.globals["assertion"] = _assertion self.env.globals["value_error"] = _value_error + self.env.globals["skip"] = _skip_package self.env.globals["set"] = set self.env.globals["setitem"] = operator.setitem self.env.filters["shesc"] = lambda s: "'%s'" % s.replace("'", r"'\''") @@ -187,27 +196,36 @@ class Main: self.deps[current].add(name) return self._pkg_sha256(name) - def _pkg_sha256(self, name): + def _pkg_sha256(self, name, error_on_skip=True): if name in self.package_hashes: return self.package_hashes[name] if name in self.rendering: raise RuntimeError("circular dependency: %r", self.rendering) + out_path = self.out_dir / name + t = self.env.get_template("pkg/" + name) self.rendering.append(name) - data = bytes( - t.render( - name=name, - shortname=name.split(':')[0], - import_functions=set(), # for "generic" template - env_template={}, # for "generic" template - ).encode('utf8') - ) + try: + data = bytes( + t.render( + name=name, + shortname=name.split(':')[0], + import_functions=set(), # for "generic" template + env_template={}, # for "generic" template + ).encode('utf8') + ) + except SkipPackageException as e: + if error_on_skip: + raise RuntimeError("dependency on skipped package: %s", e) + else: + if out_path.exists(): + out_path.unlink() + raise self.package_hashes[name] = hashlib.sha256(data).hexdigest() lastname = self.rendering.pop() assert name == lastname - out_path = self.out_dir / name old_hash = None if out_path.exists(): with out_path.open('rb') as f: @@ -232,6 +250,15 @@ class Main: self.pkg_install_name(name), ) + def pkg_transitive_deps(self, name): + # raise NotImplementedError(f'{self.__class__.__name}.pkg_transitive_deps()') + self._pkg_sha256(name) + def recur(name): + for n in self.deps[name]: + yield from recur(n) + yield self.pkg_install_name(name) + return set(recur(name)) + def list_packages(self): for tplname in self.env.list_templates(): if not tplname.startswith("pkg/"): @@ -242,7 +269,11 @@ class Main: def render_all(self): for pkgname in self.list_packages(): - print("%s\t%s" % (pkgname, self._pkg_sha256(pkgname))) + try: + print("%s\t%s" % (pkgname, self._pkg_sha256(pkgname, False))) + except SkipPackageException as e: + print(" [SKIPPED] %s" % (e,)) + continue for dep in sorted(self.deps.get(pkgname, ())): print( " > %s.%s"