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:
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)