From f70b14e92b06466bb103764e1f1399bb7dc55a26 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Tue, 11 Aug 2026 08:07:30 +0200 Subject: [PATCH 1/4] defs.mk: Disable BUILD_PKG_CONFIG BUILD_PKG_CONFIG installs files across project directories into $(JWBDIR) because of this: BUILD_PKG_CONFIGDIR = $(JWBDIR)/pkgconfig The concept is currently not used by any downstream project anymore, hence it lacks sufficient testing at this point. Moreover, it breaks building repos which are sandboxed to their own root directory, because it tries to install the generated .pc file back into $(JWBDIR). The concept itself isn't entirely off, so leave the code in, disabled, with a comment. Signed-off-by: Jan Lindemann --- make/defs.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/make/defs.mk b/make/defs.mk index 2d135613..88f7cdb9 100644 --- a/make/defs.mk +++ b/make/defs.mk @@ -505,7 +505,8 @@ ifeq ($(CREATE_PKG_CONFIG),true) BUILD_PKG_CONFIGDIR = $(TOPDIR)/make endif LOCAL_PKG_CONFIG = $(PROJECT).pc - BUILD_PKG_CONFIG = $(BUILD_PKG_CONFIGDIR)/$(LOCAL_PKG_CONFIG) + # As of now, this is not used by any downstream project, so disable it to reduce complexity. + #BUILD_PKG_CONFIG = $(BUILD_PKG_CONFIGDIR)/$(LOCAL_PKG_CONFIG) INSTALLED_PKG_CONFIG = $(addprefix $(INSTALL_PKG_CONFIGDIR)/,$(PKG_CONFIG)) endif -- 2.55.0 From a7dd6076675d246ab45b9057993bf8c1496d7f13 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Tue, 11 Aug 2026 07:55:42 +0200 Subject: [PATCH 2/4] platform.mk: Remove --topdir-format from JW_PKG_PY Some uses of $(JW_PKG_PY) need to ensure their own topdir format, which results in two options on jw-pkg.py's command line, with the second overwriting the first. This works but is a minor uglyness. Since the default built into jw-pkg works for all other cases, remove --topdir-format from the JW_PKG_PY variable. Signed-off-by: Jan Lindemann --- make/platform.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make/platform.mk b/make/platform.mk index 22d6846e..7b00642d 100644 --- a/make/platform.mk +++ b/make/platform.mk @@ -67,7 +67,7 @@ JWB_SCRIPT_DIR := $(firstword $(wildcard $(JWBDIR)/scripts $(JWBDIR include $(JWBDIR)/make/py-version.mk -JW_PKG_PY = $(PYTHON) $(JWB_SCRIPT_DIR)/jw-pkg.py -p $(PROJECTS_DIR) -t $(TOPDIR) --topdir-format absolute $(JW_PKG_PY_EXTRA_OPTS) +JW_PKG_PY = $(PYTHON) $(JWB_SCRIPT_DIR)/jw-pkg.py -p $(PROJECTS_DIR) -t $(TOPDIR) $(JW_PKG_PY_EXTRA_OPTS) # -- product -- 2.55.0 From 5d77955ed942c7a00417b49362d22378b57b5290 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Sun, 9 Aug 2026 15:40:50 +0200 Subject: [PATCH 3/4] py-check.mk: Run isort with "make format" If /usr/bin/isort is found, run it during "make format" to get a defined way the imports are sorted. tool.isort in pyproject.toml is updated to match the other fixers. Commit the fallout of this change. Running the other fixers alone doesn't change the formatting, so this should be safe. Signed-off-by: Jan Lindemann --- conf/templates/pyproject.toml | 3 ++ make/py-check.mk | 7 +++++ src/python/jw/pkg/App.py | 4 +-- src/python/jw/pkg/CmdBase.py | 1 + src/python/jw/pkg/cmds/Cmd.py | 3 +- src/python/jw/pkg/cmds/pkg/CmdInstall.py | 2 +- src/python/jw/pkg/cmds/posix/Cmd.py | 2 +- src/python/jw/pkg/cmds/posix/tar/Cmd.py | 2 +- .../jw/pkg/cmds/posix/tar/CmdExtract.py | 3 +- src/python/jw/pkg/cmds/projects/Cmd.py | 2 +- .../cmds/projects/CmdCanonicalizeRemotes.py | 3 +- src/python/jw/pkg/cmds/projects/CmdCflags.py | 3 +- src/python/jw/pkg/cmds/projects/CmdCheck.py | 3 +- .../jw/pkg/cmds/projects/CmdCommands.py | 3 +- src/python/jw/pkg/cmds/projects/CmdExepath.py | 3 +- .../jw/pkg/cmds/projects/CmdGetAuthInfo.py | 4 ++- src/python/jw/pkg/cmds/projects/CmdGetval.py | 3 +- .../jw/pkg/cmds/projects/CmdHtdocsDir.py | 3 +- src/python/jw/pkg/cmds/projects/CmdLdflags.py | 3 +- .../jw/pkg/cmds/projects/CmdLdlibpath.py | 3 +- src/python/jw/pkg/cmds/projects/CmdLibname.py | 3 +- .../jw/pkg/cmds/projects/CmdListRepos.py | 4 ++- src/python/jw/pkg/cmds/projects/CmdModules.py | 4 ++- src/python/jw/pkg/cmds/projects/CmdPath.py | 3 +- .../jw/pkg/cmds/projects/CmdPkgConflicts.py | 3 +- .../jw/pkg/cmds/projects/CmdPkgProvides.py | 3 +- .../jw/pkg/cmds/projects/CmdPkgRequires.py | 3 +- src/python/jw/pkg/cmds/projects/CmdProjDir.py | 3 +- .../jw/pkg/cmds/projects/CmdRequiredOsPkg.py | 3 +- src/python/jw/pkg/cmds/projects/CmdSummary.py | 3 +- src/python/jw/pkg/cmds/projects/CmdTest.py | 3 +- src/python/jw/pkg/cmds/projects/CmdTmplDir.py | 3 +- src/python/jw/pkg/cmds/projects/check/Cmd.py | 2 +- .../jw/pkg/cmds/projects/lib/templates.py | 1 + src/python/jw/pkg/cmds/secrets/Cmd.py | 4 +-- .../jw/pkg/cmds/secrets/lib/DistroContext.py | 2 +- src/python/jw/pkg/cmds/secrets/lib/tar.py | 2 +- src/python/jw/pkg/lib/App.py | 31 ++++++++++--------- src/python/jw/pkg/lib/AsyncRunner.py | 2 +- src/python/jw/pkg/lib/Distro.py | 2 +- src/python/jw/pkg/lib/ExecContext.py | 2 +- src/python/jw/pkg/lib/FileContext.py | 4 +-- src/python/jw/pkg/lib/Package.py | 2 +- src/python/jw/pkg/lib/PackageFilter.py | 1 + src/python/jw/pkg/lib/TarIo.py | 2 +- src/python/jw/pkg/lib/Types.py | 2 +- src/python/jw/pkg/lib/Uri.py | 2 +- src/python/jw/pkg/lib/distros/arch/Distro.py | 2 +- .../jw/pkg/lib/distros/debian/Distro.py | 2 +- src/python/jw/pkg/lib/ec/Curl.py | 2 +- src/python/jw/pkg/lib/ec/ssh/Exec.py | 2 +- src/python/jw/pkg/lib/ec/ssh/Paramiko.py | 2 +- src/python/jw/pkg/lib/init.py | 1 + src/python/jw/pkg/lib/log.py | 3 +- src/python/jw/pkg/lib/pm/rpm.py | 2 +- src/python/jw/pkg/lib/util.py | 1 + 56 files changed, 109 insertions(+), 67 deletions(-) diff --git a/conf/templates/pyproject.toml b/conf/templates/pyproject.toml index 600f0c75..6b6a5d57 100644 --- a/conf/templates/pyproject.toml +++ b/conf/templates/pyproject.toml @@ -17,6 +17,9 @@ [tool.isort] + multi_line_output = 3 + line_length = 88 + lines_after_imports = 1 lines_between_sections = 1 lines_between_types = 1 diff --git a/make/py-check.mk b/make/py-check.mk index 1c4b4faf..35e5fc30 100644 --- a/make/py-check.mk +++ b/make/py-check.mk @@ -29,6 +29,10 @@ ifndef PY_CHECK_RUFF endif endif +ifndef PY_CHECK_ISORT + PY_CHECK_ISORT := $(firstword $(wildcard /usr/bin/isort)) +endif + ifndef PY_CHECK_YAPF PY_CHECK_YAPF := $(firstword $(wildcard /usr/bin/yapf /usr/bin/yapf3)) endif @@ -67,6 +71,9 @@ endif py-format: find . -type f -name '*.py' -print0 | \ xargs -0 sed -i -E '1{/^# -\*- coding: utf-8 -\*-$$/{:a;N;/\n[[:space:]]*$$/ba;s/^# -\*- coding: utf-8 -\*-\n([[:space:]]*\n)*/ /;s/^ //}}' +ifneq ($(PY_CHECK_ISORT),) + $(PY_CHECK_ISORT) $(PY_CHECK_ROOTS) +endif ifneq ($(PY_CHECK_YAPF),) $(PY_CHECK_YAPF) --in-place --recursive $(PY_CHECK_ROOTS) endif diff --git a/src/python/jw/pkg/App.py b/src/python/jw/pkg/App.py index cdc82c4d..2b9a2f48 100644 --- a/src/python/jw/pkg/App.py +++ b/src/python/jw/pkg/App.py @@ -10,7 +10,7 @@ import sys from enum import Enum, auto from functools import cache -from typing import Any, cast, override, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, cast, override from .lib.App import App as Base from .lib.Distro import Distro @@ -19,8 +19,8 @@ from .lib.ProjectConf import ProjectConf if TYPE_CHECKING: import argparse - from argparse import ArgumentParser + from argparse import ArgumentParser from typing import TypeAlias from .lib.ExecContext import ExecContext diff --git a/src/python/jw/pkg/CmdBase.py b/src/python/jw/pkg/CmdBase.py index 17f16759..db898e6c 100644 --- a/src/python/jw/pkg/CmdBase.py +++ b/src/python/jw/pkg/CmdBase.py @@ -1,4 +1,5 @@ from typing import override + from .App import App from .lib.Cmd import Cmd as Base diff --git a/src/python/jw/pkg/cmds/Cmd.py b/src/python/jw/pkg/cmds/Cmd.py index d9240e08..ece74670 100644 --- a/src/python/jw/pkg/cmds/Cmd.py +++ b/src/python/jw/pkg/cmds/Cmd.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import override, TYPE_CHECKING +from typing import TYPE_CHECKING, override from ..App import App as Parent from ..CmdBase import CmdBase as Base @@ -8,6 +8,7 @@ from ..CmdBase import CmdBase as Base if TYPE_CHECKING: from argparse import Namespace from typing import Iterable + from ..lib.Distro import Distro class Cmd(Base): # export diff --git a/src/python/jw/pkg/cmds/pkg/CmdInstall.py b/src/python/jw/pkg/cmds/pkg/CmdInstall.py index 22e75800..066b8b8e 100644 --- a/src/python/jw/pkg/cmds/pkg/CmdInstall.py +++ b/src/python/jw/pkg/cmds/pkg/CmdInstall.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import override, TYPE_CHECKING +from typing import TYPE_CHECKING, override from .Cmd import Cmd, Parent diff --git a/src/python/jw/pkg/cmds/posix/Cmd.py b/src/python/jw/pkg/cmds/posix/Cmd.py index 3093618b..9ae1b2c1 100644 --- a/src/python/jw/pkg/cmds/posix/Cmd.py +++ b/src/python/jw/pkg/cmds/posix/Cmd.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import override, TYPE_CHECKING +from typing import TYPE_CHECKING, override from ...CmdBase import CmdBase as Base from ..CmdPosix import CmdPosix as Parent diff --git a/src/python/jw/pkg/cmds/posix/tar/Cmd.py b/src/python/jw/pkg/cmds/posix/tar/Cmd.py index cc6e1aed..63165ed5 100644 --- a/src/python/jw/pkg/cmds/posix/tar/Cmd.py +++ b/src/python/jw/pkg/cmds/posix/tar/Cmd.py @@ -1,7 +1,7 @@ from __future__ import annotations from contextlib import asynccontextmanager -from typing import Any, override, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, override from ....CmdBase import CmdBase as Base from ....lib.FileContext import FileContext diff --git a/src/python/jw/pkg/cmds/posix/tar/CmdExtract.py b/src/python/jw/pkg/cmds/posix/tar/CmdExtract.py index ace743f9..b901a72e 100644 --- a/src/python/jw/pkg/cmds/posix/tar/CmdExtract.py +++ b/src/python/jw/pkg/cmds/posix/tar/CmdExtract.py @@ -1,8 +1,9 @@ from __future__ import annotations +from typing import TYPE_CHECKING, override + from ....lib.log import DEBUG, log from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING, override if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/Cmd.py b/src/python/jw/pkg/cmds/projects/Cmd.py index 97533bca..4a3a1059 100644 --- a/src/python/jw/pkg/cmds/projects/Cmd.py +++ b/src/python/jw/pkg/cmds/projects/Cmd.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import override, TYPE_CHECKING +from typing import TYPE_CHECKING, override from ...CmdBase import CmdBase as Base from ..CmdProjects import CmdProjects as Parent diff --git a/src/python/jw/pkg/cmds/projects/CmdCanonicalizeRemotes.py b/src/python/jw/pkg/cmds/projects/CmdCanonicalizeRemotes.py index 7dbe24ba..b0fe24b3 100644 --- a/src/python/jw/pkg/cmds/projects/CmdCanonicalizeRemotes.py +++ b/src/python/jw/pkg/cmds/projects/CmdCanonicalizeRemotes.py @@ -2,10 +2,9 @@ from __future__ import annotations from typing import TYPE_CHECKING, override -from ...lib.base import InputMode +from ...lib.base import InputMode, Result from ...lib.log import NOTICE, log from .Cmd import Cmd, Parent -from ...lib.base import Result if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdCflags.py b/src/python/jw/pkg/cmds/projects/CmdCflags.py index 15c39a04..c0ec3fc2 100644 --- a/src/python/jw/pkg/cmds/projects/CmdCflags.py +++ b/src/python/jw/pkg/cmds/projects/CmdCflags.py @@ -1,8 +1,9 @@ from __future__ import annotations +from typing import TYPE_CHECKING, override + from ...App import Scope from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING, override if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdCheck.py b/src/python/jw/pkg/cmds/projects/CmdCheck.py index e53bbcba..47ce2c25 100644 --- a/src/python/jw/pkg/cmds/projects/CmdCheck.py +++ b/src/python/jw/pkg/cmds/projects/CmdCheck.py @@ -1,8 +1,9 @@ from __future__ import annotations -from .Cmd import Cmd, Parent from typing import TYPE_CHECKING, override +from .Cmd import Cmd, Parent + if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdCommands.py b/src/python/jw/pkg/cmds/projects/CmdCommands.py index c22101ef..e6ff980d 100644 --- a/src/python/jw/pkg/cmds/projects/CmdCommands.py +++ b/src/python/jw/pkg/cmds/projects/CmdCommands.py @@ -1,8 +1,9 @@ from __future__ import annotations -from .Cmd import Cmd, Parent from typing import TYPE_CHECKING, override +from .Cmd import Cmd, Parent + if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdExepath.py b/src/python/jw/pkg/cmds/projects/CmdExepath.py index ba2e6ea1..d5599817 100644 --- a/src/python/jw/pkg/cmds/projects/CmdExepath.py +++ b/src/python/jw/pkg/cmds/projects/CmdExepath.py @@ -1,8 +1,9 @@ from __future__ import annotations +from typing import TYPE_CHECKING, override + from ...App import Scope from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING, override if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py b/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py index b2d6dc8a..1623fda1 100644 --- a/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py +++ b/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py @@ -1,11 +1,13 @@ from __future__ import annotations + import os import re +from typing import TYPE_CHECKING, override + from ...lib.log import DEBUG, log from ...lib.Uri import Uri from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING, override if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdGetval.py b/src/python/jw/pkg/cmds/projects/CmdGetval.py index 54bfefba..5bf703f7 100644 --- a/src/python/jw/pkg/cmds/projects/CmdGetval.py +++ b/src/python/jw/pkg/cmds/projects/CmdGetval.py @@ -1,8 +1,9 @@ from __future__ import annotations -from .Cmd import Cmd, Parent from typing import TYPE_CHECKING, override +from .Cmd import Cmd, Parent + if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdHtdocsDir.py b/src/python/jw/pkg/cmds/projects/CmdHtdocsDir.py index 0322d93c..e91b10ab 100644 --- a/src/python/jw/pkg/cmds/projects/CmdHtdocsDir.py +++ b/src/python/jw/pkg/cmds/projects/CmdHtdocsDir.py @@ -1,8 +1,9 @@ from __future__ import annotations -from .Cmd import Cmd, Parent from typing import TYPE_CHECKING, override +from .Cmd import Cmd, Parent + if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdLdflags.py b/src/python/jw/pkg/cmds/projects/CmdLdflags.py index cf626801..009932da 100644 --- a/src/python/jw/pkg/cmds/projects/CmdLdflags.py +++ b/src/python/jw/pkg/cmds/projects/CmdLdflags.py @@ -1,8 +1,9 @@ from __future__ import annotations +from typing import TYPE_CHECKING, override + from ...App import Scope from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING, override if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdLdlibpath.py b/src/python/jw/pkg/cmds/projects/CmdLdlibpath.py index 01aa9785..064ff38f 100644 --- a/src/python/jw/pkg/cmds/projects/CmdLdlibpath.py +++ b/src/python/jw/pkg/cmds/projects/CmdLdlibpath.py @@ -1,8 +1,9 @@ from __future__ import annotations +from typing import TYPE_CHECKING, override + from ...App import Scope from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING, override if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdLibname.py b/src/python/jw/pkg/cmds/projects/CmdLibname.py index 68167261..e5968dd4 100644 --- a/src/python/jw/pkg/cmds/projects/CmdLibname.py +++ b/src/python/jw/pkg/cmds/projects/CmdLibname.py @@ -1,8 +1,9 @@ from __future__ import annotations -from .Cmd import Cmd, Parent from typing import TYPE_CHECKING, override +from .Cmd import Cmd, Parent + if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdListRepos.py b/src/python/jw/pkg/cmds/projects/CmdListRepos.py index 6324a81c..ebcf8dc6 100644 --- a/src/python/jw/pkg/cmds/projects/CmdListRepos.py +++ b/src/python/jw/pkg/cmds/projects/CmdListRepos.py @@ -1,12 +1,14 @@ from __future__ import annotations + import os import re +from typing import TYPE_CHECKING, override + from ...lib.log import DEBUG, log from ...lib.Uri import Uri from ...lib.util import get_password, get_username, run_curl_into from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING, override if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdModules.py b/src/python/jw/pkg/cmds/projects/CmdModules.py index 835c0b95..c081b0cb 100644 --- a/src/python/jw/pkg/cmds/projects/CmdModules.py +++ b/src/python/jw/pkg/cmds/projects/CmdModules.py @@ -1,9 +1,11 @@ from __future__ import annotations + import re +from typing import TYPE_CHECKING, override + from ...lib.log import DEBUG, log from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING, override if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdPath.py b/src/python/jw/pkg/cmds/projects/CmdPath.py index 9f1d5bea..05dedd84 100644 --- a/src/python/jw/pkg/cmds/projects/CmdPath.py +++ b/src/python/jw/pkg/cmds/projects/CmdPath.py @@ -1,8 +1,9 @@ from __future__ import annotations +from typing import TYPE_CHECKING, override + from ...App import Scope from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING, override if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdPkgConflicts.py b/src/python/jw/pkg/cmds/projects/CmdPkgConflicts.py index e1854bfb..ad54cb22 100644 --- a/src/python/jw/pkg/cmds/projects/CmdPkgConflicts.py +++ b/src/python/jw/pkg/cmds/projects/CmdPkgConflicts.py @@ -1,4 +1,5 @@ -from .BaseCmdPkgRelations import BaseCmdPkgRelations as Base, Parent +from .BaseCmdPkgRelations import BaseCmdPkgRelations as Base +from .BaseCmdPkgRelations import Parent class CmdPkgConflicts(Base): # export diff --git a/src/python/jw/pkg/cmds/projects/CmdPkgProvides.py b/src/python/jw/pkg/cmds/projects/CmdPkgProvides.py index ae5337f9..82746c1a 100644 --- a/src/python/jw/pkg/cmds/projects/CmdPkgProvides.py +++ b/src/python/jw/pkg/cmds/projects/CmdPkgProvides.py @@ -1,4 +1,5 @@ -from .BaseCmdPkgRelations import BaseCmdPkgRelations as Base, Parent +from .BaseCmdPkgRelations import BaseCmdPkgRelations as Base +from .BaseCmdPkgRelations import Parent class CmdPkgProvides(Base): # export diff --git a/src/python/jw/pkg/cmds/projects/CmdPkgRequires.py b/src/python/jw/pkg/cmds/projects/CmdPkgRequires.py index 53364580..421707c7 100644 --- a/src/python/jw/pkg/cmds/projects/CmdPkgRequires.py +++ b/src/python/jw/pkg/cmds/projects/CmdPkgRequires.py @@ -1,4 +1,5 @@ -from .BaseCmdPkgRelations import BaseCmdPkgRelations as Base, Parent +from .BaseCmdPkgRelations import BaseCmdPkgRelations as Base +from .BaseCmdPkgRelations import Parent class CmdPkgRequires(Base): # export diff --git a/src/python/jw/pkg/cmds/projects/CmdProjDir.py b/src/python/jw/pkg/cmds/projects/CmdProjDir.py index a3c39504..2a768687 100644 --- a/src/python/jw/pkg/cmds/projects/CmdProjDir.py +++ b/src/python/jw/pkg/cmds/projects/CmdProjDir.py @@ -1,8 +1,9 @@ from __future__ import annotations +from typing import TYPE_CHECKING, override + from ...lib.log import WARNING, log from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING, override if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdRequiredOsPkg.py b/src/python/jw/pkg/cmds/projects/CmdRequiredOsPkg.py index 17fe5e32..d66ec1d6 100644 --- a/src/python/jw/pkg/cmds/projects/CmdRequiredOsPkg.py +++ b/src/python/jw/pkg/cmds/projects/CmdRequiredOsPkg.py @@ -1,9 +1,10 @@ from __future__ import annotations +from typing import TYPE_CHECKING, override + from ...App import Scope from ...lib.log import DEBUG, log from .Cmd import Cmd, Parent -from typing import TYPE_CHECKING, override if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdSummary.py b/src/python/jw/pkg/cmds/projects/CmdSummary.py index 0607bee0..d003729a 100644 --- a/src/python/jw/pkg/cmds/projects/CmdSummary.py +++ b/src/python/jw/pkg/cmds/projects/CmdSummary.py @@ -1,8 +1,9 @@ from __future__ import annotations -from .Cmd import Cmd, Parent from typing import TYPE_CHECKING, override +from .Cmd import Cmd, Parent + if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdTest.py b/src/python/jw/pkg/cmds/projects/CmdTest.py index d81c0c7b..34c13d02 100644 --- a/src/python/jw/pkg/cmds/projects/CmdTest.py +++ b/src/python/jw/pkg/cmds/projects/CmdTest.py @@ -1,8 +1,9 @@ from __future__ import annotations -from .Cmd import Cmd, Parent from typing import TYPE_CHECKING, override +from .Cmd import Cmd, Parent + if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/CmdTmplDir.py b/src/python/jw/pkg/cmds/projects/CmdTmplDir.py index b87b7447..7b3ae24d 100644 --- a/src/python/jw/pkg/cmds/projects/CmdTmplDir.py +++ b/src/python/jw/pkg/cmds/projects/CmdTmplDir.py @@ -1,8 +1,9 @@ from __future__ import annotations -from .Cmd import Cmd, Parent from typing import TYPE_CHECKING, override +from .Cmd import Cmd, Parent + if TYPE_CHECKING: from argparse import ArgumentParser, Namespace diff --git a/src/python/jw/pkg/cmds/projects/check/Cmd.py b/src/python/jw/pkg/cmds/projects/check/Cmd.py index 139f7f58..d721eac0 100644 --- a/src/python/jw/pkg/cmds/projects/check/Cmd.py +++ b/src/python/jw/pkg/cmds/projects/check/Cmd.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import override, TYPE_CHECKING +from typing import TYPE_CHECKING, override from ....CmdBase import CmdBase as Base from ..CmdCheck import CmdCheck as Parent diff --git a/src/python/jw/pkg/cmds/projects/lib/templates.py b/src/python/jw/pkg/cmds/projects/lib/templates.py index 5d209d84..3df12aa5 100644 --- a/src/python/jw/pkg/cmds/projects/lib/templates.py +++ b/src/python/jw/pkg/cmds/projects/lib/templates.py @@ -1,4 +1,5 @@ import textwrap + from typing import Any, Iterable, TypeAlias, TypeGuard TupleList: TypeAlias = Iterable[tuple[str, str]] diff --git a/src/python/jw/pkg/cmds/secrets/Cmd.py b/src/python/jw/pkg/cmds/secrets/Cmd.py index c9bb7316..103b12b7 100644 --- a/src/python/jw/pkg/cmds/secrets/Cmd.py +++ b/src/python/jw/pkg/cmds/secrets/Cmd.py @@ -1,15 +1,15 @@ from __future__ import annotations from functools import cached_property -from typing import override, TYPE_CHECKING +from typing import TYPE_CHECKING, override from ...CmdBase import CmdBase as Base from ..CmdSecrets import CmdSecrets as Parent from .lib.DistroContext import DistroContext if TYPE_CHECKING: - from collections.abc import Collection from argparse import ArgumentParser + from collections.abc import Collection from .lib.base import Attrs diff --git a/src/python/jw/pkg/cmds/secrets/lib/DistroContext.py b/src/python/jw/pkg/cmds/secrets/lib/DistroContext.py index 95edc540..67fe0648 100644 --- a/src/python/jw/pkg/cmds/secrets/lib/DistroContext.py +++ b/src/python/jw/pkg/cmds/secrets/lib/DistroContext.py @@ -12,9 +12,9 @@ from .FilesContext import FilesContext if TYPE_CHECKING: from collections.abc import Collection - from .base import Attrs from ....lib.Distro import Distro + from .base import Attrs class DistroContext(FilesContext): diff --git a/src/python/jw/pkg/cmds/secrets/lib/tar.py b/src/python/jw/pkg/cmds/secrets/lib/tar.py index 84cde315..aeca422c 100644 --- a/src/python/jw/pkg/cmds/secrets/lib/tar.py +++ b/src/python/jw/pkg/cmds/secrets/lib/tar.py @@ -6,8 +6,8 @@ import tarfile from tarfile import TarFile from typing import TYPE_CHECKING, Callable -from ....lib.log import DEBUG, log from ....lib.ExecContext import ExecContext +from ....lib.log import DEBUG, log if TYPE_CHECKING: from typing import Iterable diff --git a/src/python/jw/pkg/lib/App.py b/src/python/jw/pkg/lib/App.py index 016ddaa2..e0891f01 100644 --- a/src/python/jw/pkg/lib/App.py +++ b/src/python/jw/pkg/lib/App.py @@ -6,7 +6,7 @@ import os import sys from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser, Namespace -from typing import Any, cast, override, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, cast, override from .AsyncRunner import AsyncRunner from .log import ( @@ -21,14 +21,14 @@ from .log import ( set_log_flags, set_log_level ) - from .Types import LoadTypes from .util import pretty_cmd if TYPE_CHECKING: + import types + from collections.abc import Awaitable, Collection from typing import TypeVar - T = TypeVar('T') class App: # export @@ -119,8 +119,8 @@ class App: # export self.parser = parser title = 'Available subcommands' - if hasattr(parent, 'name'): - title += ' of ' + getattr(parent, 'name') + if isinstance(parent, AbstractCmd): + title += ' of ' + parent.name subparsers = parser.add_subparsers( title = title, metavar = '', dest = 'command' ) @@ -139,7 +139,7 @@ class App: # export sc.cmd, sc.parser, sc.cmd.children, all = all ) return - args, unknown = self.__parser.parse_known_args() + args, _ = self.__parser.parse_known_args() cmd_name = getattr(args, 'command', None) if cmd_name in scs: sc = scs[cmd_name] @@ -185,7 +185,7 @@ class App: # export ) self._add_arguments(self.__parser) - args, unknown = self.__parser.parse_known_args() + args, _ = self.__parser.parse_known_args() set_log_flags(args.log_flags) set_log_level(args.log_level) @@ -222,7 +222,12 @@ class App: # export async def __aenter__(self) -> None: pass - async def __aexit__(self, exc_type: Any, exc: Any, tb: Any) -> None: + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc: BaseException | None, + tb: types.TracebackType | None, + ) -> None: pass async def __run(self, argv: list[str] | None = None) -> None: @@ -230,16 +235,13 @@ class App: # export try: # Import argcomplete only here to not require it to be compatible # with minimal environments - from argcomplete.completers import ( # type: ignore[import-not-found, unused-ignore] - BaseCompleter - ) + from argcomplete.completers import BaseCompleter # type: ignore[import-not-found, unused-ignore] # isort: skip class NoopCompleter(BaseCompleter): # type: ignore[misc, unused-ignore] @override def __call__( # pyright: ignore[reportGeneralTypeIssues] - self, *args: Any, **kwargs: Any - ) -> None: + self, *args: Any, **kwargs: Any) -> None: return None import argcomplete # type: ignore[import-not-found, unused-ignore] @@ -266,7 +268,7 @@ class App: # export if isinstance(ret, int) and ret >= 0 and ret <= 0xFF: exit_status = ret except Exception as e: - log_m(ERR, 'Failed: {}'.format(repr(e) if self.__back_trace else str(e))) + log_m(ERR, f'Failed: {repr(e) if self.__back_trace else str(e)}') exit_status = 1 # AssertionErrors are programming errors, hence a programmer should # get a chance to figure it out @@ -339,6 +341,7 @@ class App: # export self.__async_runner = None return ret + def run_sub_commands( # export description: str = '', name_filter: str = '^Cmd.*', diff --git a/src/python/jw/pkg/lib/AsyncRunner.py b/src/python/jw/pkg/lib/AsyncRunner.py index 66c723a2..fadfbbcd 100644 --- a/src/python/jw/pkg/lib/AsyncRunner.py +++ b/src/python/jw/pkg/lib/AsyncRunner.py @@ -4,7 +4,7 @@ import asyncio import concurrent.futures import contextlib -from typing import Any, TypeVar, TYPE_CHECKING, cast +from typing import TYPE_CHECKING, Any, TypeVar, cast if TYPE_CHECKING: from collections.abc import Awaitable, Generator diff --git a/src/python/jw/pkg/lib/Distro.py b/src/python/jw/pkg/lib/Distro.py index d45ae54f..04aad14f 100644 --- a/src/python/jw/pkg/lib/Distro.py +++ b/src/python/jw/pkg/lib/Distro.py @@ -8,8 +8,8 @@ import sys from functools import cached_property from typing import TYPE_CHECKING, Any -from .log import ERR, INFO, WARNING, log from .base import InputMode +from .log import ERR, INFO, WARNING, log if TYPE_CHECKING: from collections.abc import Collection diff --git a/src/python/jw/pkg/lib/ExecContext.py b/src/python/jw/pkg/lib/ExecContext.py index 855b30dc..35685cc7 100644 --- a/src/python/jw/pkg/lib/ExecContext.py +++ b/src/python/jw/pkg/lib/ExecContext.py @@ -5,7 +5,7 @@ import errno import sys from decimal import ROUND_FLOOR, Decimal -from typing import Any, override, TYPE_CHECKING, NamedTuple +from typing import TYPE_CHECKING, Any, NamedTuple, override if TYPE_CHECKING: from typing import Type diff --git a/src/python/jw/pkg/lib/FileContext.py b/src/python/jw/pkg/lib/FileContext.py index 0ba119ce..059152d7 100644 --- a/src/python/jw/pkg/lib/FileContext.py +++ b/src/python/jw/pkg/lib/FileContext.py @@ -4,11 +4,11 @@ import abc from enum import Enum, auto from functools import cached_property -from typing import Any, override, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, override from .log import DEBUG, ERR, log -from .Uri import Uri from .ProcFilter import ProcPipeline +from .Uri import Uri if TYPE_CHECKING: from .base import Result, StatResult diff --git a/src/python/jw/pkg/lib/Package.py b/src/python/jw/pkg/lib/Package.py index 1d3e9bbc..6fd19e24 100644 --- a/src/python/jw/pkg/lib/Package.py +++ b/src/python/jw/pkg/lib/Package.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import override, Any +from typing import Any, override meta_tags = [ 'name', diff --git a/src/python/jw/pkg/lib/PackageFilter.py b/src/python/jw/pkg/lib/PackageFilter.py index c17df3e7..c0b7eb51 100644 --- a/src/python/jw/pkg/lib/PackageFilter.py +++ b/src/python/jw/pkg/lib/PackageFilter.py @@ -1,4 +1,5 @@ from __future__ import annotations + import abc import re diff --git a/src/python/jw/pkg/lib/TarIo.py b/src/python/jw/pkg/lib/TarIo.py index 6e508c6a..e0aee4da 100644 --- a/src/python/jw/pkg/lib/TarIo.py +++ b/src/python/jw/pkg/lib/TarIo.py @@ -5,11 +5,11 @@ import io import tarfile from tarfile import TarFile, TarInfo +from typing import TYPE_CHECKING, Any, override from .CopyContext import CopyContext from .ExecContext import ExecContext from .log import DEBUG, ERR, log -from typing import TYPE_CHECKING, Any, override if TYPE_CHECKING: from .base import StatResult diff --git a/src/python/jw/pkg/lib/Types.py b/src/python/jw/pkg/lib/Types.py index 82073059..42caffcc 100644 --- a/src/python/jw/pkg/lib/Types.py +++ b/src/python/jw/pkg/lib/Types.py @@ -5,7 +5,7 @@ import os import re import sys -from typing import Any, override, TYPE_CHECKING, Generic, Iterable, TypeVar +from typing import TYPE_CHECKING, Any, Generic, Iterable, TypeVar, override from .log import ERR, OFF, log, parse_log_level diff --git a/src/python/jw/pkg/lib/Uri.py b/src/python/jw/pkg/lib/Uri.py index 54472535..6c299b31 100644 --- a/src/python/jw/pkg/lib/Uri.py +++ b/src/python/jw/pkg/lib/Uri.py @@ -3,7 +3,7 @@ from __future__ import annotations import copy from functools import cached_property -from typing import override, TYPE_CHECKING +from typing import TYPE_CHECKING, override if TYPE_CHECKING: import urllib.parse diff --git a/src/python/jw/pkg/lib/distros/arch/Distro.py b/src/python/jw/pkg/lib/distros/arch/Distro.py index c772a4f3..f7b10f8a 100644 --- a/src/python/jw/pkg/lib/distros/arch/Distro.py +++ b/src/python/jw/pkg/lib/distros/arch/Distro.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, override, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, override from ...Distro import Distro as Base diff --git a/src/python/jw/pkg/lib/distros/debian/Distro.py b/src/python/jw/pkg/lib/distros/debian/Distro.py index 8cf88a18..d0f0291b 100644 --- a/src/python/jw/pkg/lib/distros/debian/Distro.py +++ b/src/python/jw/pkg/lib/distros/debian/Distro.py @@ -2,7 +2,7 @@ from __future__ import annotations import os -from typing import Any, override, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, override from ...Distro import Distro as Base from ...log import NOTICE, log diff --git a/src/python/jw/pkg/lib/ec/Curl.py b/src/python/jw/pkg/lib/ec/Curl.py index 6757008d..2637cf15 100644 --- a/src/python/jw/pkg/lib/ec/Curl.py +++ b/src/python/jw/pkg/lib/ec/Curl.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, override, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, override from ..FileContext import FileContext as Base diff --git a/src/python/jw/pkg/lib/ec/ssh/Exec.py b/src/python/jw/pkg/lib/ec/ssh/Exec.py index e431dc90..4e169551 100644 --- a/src/python/jw/pkg/lib/ec/ssh/Exec.py +++ b/src/python/jw/pkg/lib/ec/ssh/Exec.py @@ -2,7 +2,7 @@ from __future__ import annotations import os -from typing import Any, override, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, override from ...base import InputMode from ...util import run_cmd diff --git a/src/python/jw/pkg/lib/ec/ssh/Paramiko.py b/src/python/jw/pkg/lib/ec/ssh/Paramiko.py index 3b080da9..84ac0d9e 100644 --- a/src/python/jw/pkg/lib/ec/ssh/Paramiko.py +++ b/src/python/jw/pkg/lib/ec/ssh/Paramiko.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, override, TYPE_CHECKING +from typing import TYPE_CHECKING, Any, override # Tolerate missing paramiko imports. jw-pkg is designed to work with what it # finds. diff --git a/src/python/jw/pkg/lib/init.py b/src/python/jw/pkg/lib/init.py index 4d8f2d5a..8098f687 100644 --- a/src/python/jw/pkg/lib/init.py +++ b/src/python/jw/pkg/lib/init.py @@ -1,6 +1,7 @@ from __future__ import annotations import pkgutil + from importlib import import_module from typing import TYPE_CHECKING diff --git a/src/python/jw/pkg/lib/log.py b/src/python/jw/pkg/lib/log.py index 87371181..9ebb124a 100644 --- a/src/python/jw/pkg/lib/log.py +++ b/src/python/jw/pkg/lib/log.py @@ -5,9 +5,8 @@ import re import sys import syslog -from enum import Flag, auto - from datetime import datetime +from enum import Flag, auto from os.path import basename from typing import TYPE_CHECKING, cast, override diff --git a/src/python/jw/pkg/lib/pm/rpm.py b/src/python/jw/pkg/lib/pm/rpm.py index c326bba0..ece689ce 100644 --- a/src/python/jw/pkg/lib/pm/rpm.py +++ b/src/python/jw/pkg/lib/pm/rpm.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, TYPE_CHECKING, Collection, Iterable, cast +from typing import TYPE_CHECKING, Any, Collection, Iterable, cast from ..base import InputMode from ..Package import Package diff --git a/src/python/jw/pkg/lib/util.py b/src/python/jw/pkg/lib/util.py index 27812391..8033902c 100644 --- a/src/python/jw/pkg/lib/util.py +++ b/src/python/jw/pkg/lib/util.py @@ -13,6 +13,7 @@ from .Uri import Uri if TYPE_CHECKING: from argparse import Namespace + from .ExecContext import ExecContext from .FileContext import FileContext from .ProcFilter import ProcFilter, ProcPipeline -- 2.55.0 From 6e988bea2113c7ec60d13891e0c1dbc50032b173 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Fri, 7 Aug 2026 19:08:09 +0200 Subject: [PATCH 4/4] projects-dir.mk: Add diff-projects target The diff-all and diff targets diff all projects in the workspace without filtering. Add a target "diff-projects". It sets PGIT_SH_PROJECTS to the list of projects from build-order, limiting the diff to the dependency closure around $(PROJECTS). Signed-off-by: Jan Lindemann --- make/projects-dir.mk | 2 ++ src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/make/projects-dir.mk b/make/projects-dir.mk index 115a0063..09c9e746 100644 --- a/make/projects-dir.mk +++ b/make/projects-dir.mk @@ -309,6 +309,8 @@ pull-all: purge git-get git-pull-all diff-all diff: $(SSH_WRAPPER_SH) $(PGIT_SH) --porcelain diff +diff-projects: + PGIT_SH_PROJECTS="$(patsubst %/.git,%,$(wildcard $(addsuffix /.git,$(shell make -s build-order))))" $(PGIT_SH) --porcelain diff get-official: git-get-official get-maintainer: git-get-maintainer diff --git a/src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py b/src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py index c1e3fd99..a6ce7af5 100644 --- a/src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py +++ b/src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py @@ -215,7 +215,7 @@ class AsyncSSH(Base): return if proc.stdin is not None: proc.stdin.write(data) - await proc.stdin.drain() + await proc.stdin.drain() async def _pump_stdout() -> None: while True: -- 2.55.0