commit 56cbbdfd7bd19ad7e4f06d60ecd43ceb3d71fb48
parent 1476cc806c3387c103f35ed94ce24dcec1553d99
Author: Jan Pobrislo <ccx@te2000.cz>
Date: Wed, 5 Nov 2025 21:34:04 +0000
Allow skipping packages
Diffstat:
| M | genpkg.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"