From 433fe695dbbaafa48cbd34ce943ed0029b5baf28 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Wed, 9 Sep 2026 21:14:25 +0200 Subject: [PATCH] App.is_installed(): Add method The installed state of a project is judged by the proofs of installation, which differ per subpackage: make/project.conf in the dev tree or /opt proves the -devel package or a buildable checkout, a VERSION file in the project directory or /usr/share/doc/packages the -run package. Add is_installed(), which answers the proof question for a given subpackage by searching the per-subpackage locations. Signed-off-by: Jan Lindemann Assisted-by: unsloth/Qwen3.8-27B-GGUF:Q4_K_M with pi.dev v0.84.2 --- src/python/jw/pkg/App.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/python/jw/pkg/App.py b/src/python/jw/pkg/App.py index a9ab6eb6..d5480a7a 100644 --- a/src/python/jw/pkg/App.py +++ b/src/python/jw/pkg/App.py @@ -98,6 +98,29 @@ class App(Base): return None raise Exception('No project path found for module "{}"'.format(name)) + @cache + def __is_installed(self, name: str, devel: bool) -> bool: + # devel: the project is in the dev tree or the -devel + # package is installed: make/project.conf is present. + # run: the -run package is installed: a VERSION file is + # present in the project directory or + # /usr/share/doc/packages. + if devel and name == self.__top_name: + # the topdir is the project's own buildable checkout + if os.path.exists(f'{self.__topdir}/make/project.conf'): + return True + search, file = ( + (self.__projs_root, self.___opt_root), + '/make/project.conf' + ) if devel else ( + (self.__projs_root, '/usr/share/doc/packages'), + '/VERSION' + ) + for root in search: + if root is not None and os.path.exists(f'{root}/{name}{file}'): + return True + return False + def __find_dir( self, name: str, @@ -404,6 +427,18 @@ class App(Base): raise Exception('No distro object') return self.__distro + def is_installed( + self, + name: str, + devel: bool = False, + ) -> bool: + """True if the project is installed: for devel, + make/project.conf is present in the dev tree or /opt; for + run, a VERSION file is present in the project directory + or /usr/share/doc/packages. + """ + return self.__is_installed(name, devel) + def find_dir( self, name: str,