jw.build.cmds: Move build.cmds -> cmds.projects

Reorganize the Python module structure. Placing the command classes
under jw.cmds.projects instead of jw.build.cmds will allow to add a
nested command structure, with the current commands, being mostly
related to building software, found below a "projects" toplevel
command.

Other conceivable commands could be "package" for packaging, or
"distro" for commands wrapping the distribution's package manager.

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2026-01-20 15:49:53 +01:00
commit 0b83c863a2
43 changed files with 49 additions and 13 deletions

View file

@ -22,7 +22,7 @@ Q ?= @
ifeq ($(origin PROJECTS_DIR_REMOTE_BASE),undefined) ifeq ($(origin PROJECTS_DIR_REMOTE_BASE),undefined)
ifneq ($(wildcard $(JWBDIR)),) ifneq ($(wildcard $(JWBDIR)),)
PROJECTS_DIR_REMOTE_BASE := $(shell /usr/bin/python3 $(JWBDIR)/scripts/jw-projects.py -p . get-auth-info --remote-base --only-values) PROJECTS_DIR_REMOTE_BASE := $(shell /usr/bin/python3 $(JWBDIR)/scripts/jw-projects.py -p . projects get-auth-info --remote-base --only-values)
endif endif
ifeq ($(PROJECTS_DIR_REMOTE_BASE),) ifeq ($(PROJECTS_DIR_REMOTE_BASE),)
PROJECTS_DIR_REMOTE_BASE := https://janware.com/code PROJECTS_DIR_REMOTE_BASE := https://janware.com/code
@ -44,7 +44,7 @@ endif
ifeq ($(JANWARE_USER),) ifeq ($(JANWARE_USER),)
ifneq ($(wildcard $(JWBDIR)),) ifneq ($(wildcard $(JWBDIR)),)
JANWARE_USER := $(shell /usr/bin/python3 $(JWBDIR)/scripts/jw-projects.py -p . get-auth-info --username --only-values) JANWARE_USER := $(shell /usr/bin/python3 $(JWBDIR)/scripts/jw-projects.py -p . projects get-auth-info --username --only-values)
endif endif
endif endif

View file

@ -116,7 +116,7 @@ ifeq ($(TIME),)
TIME += -p TIME += -p
endif endif
endif endif
PROJECTS_PY = $(TIME) python3 $(JWB_SCRIPT_DIR)/jw-projects.py --prefix $(shell pwd) $(PROJECTS_PY_EXTRA_OPTS) PROJECTS_PY = $(TIME) python3 $(JWB_SCRIPT_DIR)/jw-projects.py --prefix $(shell pwd) $(PROJECTS_PY_EXTRA_OPTS) projects
PROJECTS_PY_BUILD = $(PROJECTS_PY) build $(PROJECTS_PY_EXTRA_BUILD_OPTS) PROJECTS_PY_BUILD = $(PROJECTS_PY) build $(PROJECTS_PY_EXTRA_BUILD_OPTS)
PGIT_SH := /bin/bash $(JWB_SCRIPT_DIR)/pgit.sh PGIT_SH := /bin/bash $(JWB_SCRIPT_DIR)/pgit.sh

View file

@ -30,7 +30,7 @@ endif
include $(JWBDIR)/make/py-version.mk include $(JWBDIR)/make/py-version.mk
ifneq ($(TOPDIR),) ifneq ($(TOPDIR),)
proj_query_cmd = PYTHONPATH=$(JWBDIR)/src/python $(PYTHON) $(JWB_SCRIPT_DIR)/jw-projects.py -p $(PROJECTS_DIR) -t $(TOPDIR) $(PROJECTS_PY_EXTRA_OPTS) proj_query_cmd = PYTHONPATH=$(JWBDIR)/src/python $(PYTHON) $(JWB_SCRIPT_DIR)/jw-projects.py -p $(PROJECTS_DIR) -t $(TOPDIR) $(PROJECTS_PY_EXTRA_OPTS) projects
proj_query = $(shell $(proj_query_cmd) $(1)) proj_query = $(shell $(proj_query_cmd) $(1))
proj_dir = $(call proj_query,proj-dir $(1)) proj_dir = $(call proj_query,proj-dir $(1))
htdocs_dir = $(call proj_query,htdocs-dir $(1)) htdocs_dir = $(call proj_query,htdocs-dir $(1))

View file

@ -163,7 +163,7 @@ git-update-project-description:
ssh $(JANWARE_USER)@git.janware.com "/opt/jw-pkg/bin/git-srv-admin.sh $(OPT_JANWARE_PROJECT) update-descriptions $(PROJECT)" ssh $(JANWARE_USER)@git.janware.com "/opt/jw-pkg/bin/git-srv-admin.sh $(OPT_JANWARE_PROJECT) update-descriptions $(PROJECT)"
projects-%: projects-%:
$(PYTHON) $(JWB_SCRIPT_DIR)/jw-projects.py build $* $(PROJECT) $(PYTHON) $(JWB_SCRIPT_DIR)/jw-projects.py projects build $* $(PROJECT)
install-deps-devel: install-deps-devel:
sudo zypper in $(shell echo $(RPM_REQUIRES_DEVEL) | sed "s/ *= */-/g; s/ [^ ]\+-__NEXT_VERSION__//") sudo zypper in $(shell echo $(RPM_REQUIRES_DEVEL) | sed "s/ *= */-/g; s/ [^ ]\+-__NEXT_VERSION__//")

View file

@ -41,7 +41,7 @@ subpackage_description()
os_cascade() os_cascade()
{ {
# might want to run python3 path/to/jw-projects.py --os=suse-tumbleweed os-cascade # might want to run python3 path/to/jw-projects.py --os=suse-tumbleweed projects os-cascade
# or turn this into a python script and use jw-projects.py as a module. # or turn this into a python script and use jw-projects.py as a module.
if [ "$DISTRIBUTION" ]; then if [ "$DISTRIBUTION" ]; then

View file

@ -145,7 +145,7 @@ clone()
local git_srv_admin="$SSH $login@git.janware.com /opt/jw-pkg/bin/git-srv-admin.sh" local git_srv_admin="$SSH $login@git.janware.com /opt/jw-pkg/bin/git-srv-admin.sh"
if [ -z "$projects" ]; then if [ -z "$projects" ]; then
projects=`$jw_projects list-repos --from-user $fromuser $remote_base` projects=`$jw_projects projects list-repos --from-user $fromuser $remote_base`
[ "$?" != 0 ] && exit 1 [ "$?" != 0 ] && exit 1
fi fi

View file

@ -8,8 +8,6 @@ import os, sys, argparse, pwd, re
from .lib.App import App as Base from .lib.App import App as Base
from .lib.log import * from .lib.log import *
from .cmds.build import *
# meaning of pkg.requires.xxx variables # meaning of pkg.requires.xxx variables
# build: needs to be built and installed before this can be built # build: needs to be built and installed before this can be built
# devel: needs to be installed before this-devel can be installed, i.e. before _other_ packages can be built against this # devel: needs to be installed before this-devel can be installed, i.e. before _other_ packages can be built against this
@ -52,7 +50,7 @@ class ResultCache(object):
class App(Base): class App(Base):
def __init__(self): def __init__(self):
super().__init__("jw-pkg swiss army knife", modules=["jw.pkg.cmds.build"]) super().__init__("jw-pkg swiss army knife", modules=["jw.pkg.cmds"])
self.global_args = [] self.global_args = []
self.opt_os = None self.opt_os = None

View file

@ -1,17 +1,24 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import annotations from __future__ import annotations
from typing import Type, Union, TypeVar
import inspect, abc, argparse
from argparse import ArgumentParser from argparse import ArgumentParser
from ..lib.Cmd import Cmd as Base from ..lib.Cmd import Cmd as Base
from ..lib.Types import LoadTypes
class Cmd(Base): # export class Cmd(Base): # export
def __init__(self, name: str, help: str) -> None: def __init__(self, name: str, help: str) -> None:
super().__init__(name, help) super().__init__(name, help)
from ..App import App
def _add_subcommands(self) -> None:
self.add_subcommands(
LoadTypes(
[__name__.rsplit('.', 1)[0] + '.' + self.name],
type_name_filter=r'Cmd[^.]'
)
)
async def run(self, args): async def run(self, args):
return self._run(args) return self._run(args)

View file

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
import sys, inspect, re
from argparse import ArgumentParser
from .Cmd import Cmd as CmdBase
class CmdProjects(CmdBase): # export
def __init__(self) -> None:
super().__init__('projects', help='Project metadata evaluation for building packages')
self._add_subcommands()
def add_arguments(self, p: ArgumentParser) -> None:
super().add_arguments(p)
def _run(self, args):
breakpoint()
raise Exception("Running with args", args)

View file

@ -0,0 +1 @@
from .CmdProjects import CmdProjects

View file

@ -0,0 +1,11 @@
import importlib, pkgutil
__all__ = []
for finder, module_name, ispkg in pkgutil.iter_modules(__path__):
if not module_name.startswith("Cmd"):
continue
module = importlib.import_module(f".{module_name}", __name__)
cls = getattr(module, module_name)
globals()[module_name] = cls
__all__.append(module_name)