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 ff2f68d689487276ee746194af022a6b90942068
parent e6c83d459647aa5547a961aec83f332fe1966bdc
Author: Jan Pobrislo <ccx@te2000.cz>
Date:   Sat,  6 Dec 2025 14:02:10 +0000

Change the dependency graph shown on stdout to graphviz format.

Diffstat:
Mgenpkg.py | 46++++++++++++++++++++++++++++++++--------------
Mgenpkgpy.mk | 9+++++----
2 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/genpkg.py b/genpkg.py @@ -114,6 +114,14 @@ def _skip_package(*args, **kwargs): raise SkipPackageException(*args, **kwargs) +def to_install_name(name, hash): + rootname = name.split(":")[0] + if rootname.endswith('.environment'): + return "env.%s" % (hash,) + else: + return "%s.%s" % (rootname, hash) + + class Main: argument_parser = argparse.ArgumentParser() argument_parser.add_argument('-P', '--package-dir', default='packages') @@ -238,11 +246,7 @@ class Main: return self.package_hashes[name] def pkg_install_name(self, name): - rootname = name.split(":")[0] - if rootname.endswith('.environment'): - return "env.%s" % (self.pkg_env_sha256(name),) - else: - return "%s.%s" % (name.split(":")[0], self.pkg_sha256(name)) + return to_install_name(name, self.pkg_sha256(name)) def pkg_install_dir(self, name): return os.path.join( @@ -253,10 +257,12 @@ class Main: 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): @@ -268,20 +274,32 @@ class Main: yield tplname[4:] def render_all(self): + print("digraph G {") for pkgname in self.list_packages(): try: - print("%s\t%s" % (pkgname, self._pkg_sha256(pkgname, False))) + pkghash = self._pkg_sha256(pkgname, False) except SkipPackageException as e: - print(" [SKIPPED] %s" % (e,)) + print("// [SKIPPED: %s] %s" % (pkgname, e)) continue - for dep in sorted(self.deps.get(pkgname, ())): - print( - " > %s.%s" - % ( - dep, - self.package_hashes[dep], - ) + # print("%s\t%s" % (pkgname, pkghash)) + print( + '"%s" [shape=%s]; // %s' + % ( + pkgname, + "note" if pkgname.endswith('.environment') else "box", + to_install_name(pkgname, pkghash), ) + ) + for dep in sorted(self.deps.get(pkgname, ())): + print('"%s" -> "%s";' % (pkgname, dep)) + # print( + # " > %s.%s" + # % ( + # dep, + # self.package_hashes[dep], + # ) + # ) + print("}") if __name__ == '__main__': diff --git a/genpkgpy.mk b/genpkgpy.mk @@ -17,16 +17,17 @@ PYTHON_VENV_INSTALL:=pip-tools wheel # https://github.com/jazzband/pip-tools/issues/2252 #PYTHON_VENV_INSTALL:=pip-tools wheel 'pip<25' -pycodestyle: $(patsubst $(pthbs_genpkgpy)/%.py,$(pthbs_genpkgpy)/.%.pyfmt,$(PY_SRC)) $(VENV)/.done +pycodestyle: $(patsubst $(pthbs_genpkgpy)/%.py,$(pthbs_genpkgpy)/.%-orig.pyfmt,$(PY_SRC)) $(VENV)/.done '$(VENV)/bin/pylama' -l 88 $(PY_SRC) || true -$(pthbs_genpkgpy)/.%.pyfmt: $(pthbs_genpkgpy)/%.py $(VENV)/.done +$(pthbs_genpkgpy)/.%-orig.pyfmt: $(pthbs_genpkgpy)/%.py $(VENV)/.done '$(VENV)/bin/isort' - <'$<' >'$<.tmp1' cp -a '$<' '$<.tmp2' '$(VENV)/bin/black' -S - <'$<.tmp1' >'$<.tmp2' rm '$<.tmp1' - if cmp -s '$<.tmp2' '$<'; then rm -v '$<.tmp2'; else mv -v '$<.tmp2' '$<'; fi - touch $@ + if diff -u '$<.tmp2' '$<'; then rm -v '$<.tmp2'; else mv -v '$<' '$@' && mv -v '$<.tmp2' '$<'; fi + touch '$@' + .PHONY: py-requirements py-wheels py-venv py-virtualenv py-genpkg py-requirements: $(PY_REQ)