Restructure repo layout, wiring src/ and packaging for local and distro builds

- Add dev runner main.py that prefers local src/ over installed pkgmgr
- Move Arch/Debian/Fedora packaging files under packaging/* and update build scripts
- Adjust .gitignore/.dockerignore for new packaging paths and src/source/
- Improve config defaults discovery to support src/ layout and installed packages
- Update architecture diagram and add TODO overview for TAGS/MIRROR/SIGNING_KEY

https://chatgpt.com/share/693a76a0-e408-800f-9939-868524cbef4d
This commit is contained in:
kevinveenbirkenbach committed 2025-12-11 08:45:07 +01:00
1 parent 0a6c2f2988
commit a24a819511
89 files changed
+125 -38

No files matched your search

+1 -1
View File
@@ -28,4 +28,4 @@ Thumbs.db
# Arch pkg artifacts # Arch pkg artifacts
*.pkg.tar.* *.pkg.tar.*
*.log *.log
package-manager-* packaging/arch/package-manager-*
+1 -8
View File
@@ -15,16 +15,9 @@ dist/
build/* build/*
*.egg-info/ *.egg-info/
pkg pkg
src/source src/source/
package-manager-* package-manager-*
# debian
debian/package-manager/
debian/debhelper-build-stamp
debian/files
debian/.debhelper/
debian/package-manager.substvars
# Editor files # Editor files
.vscode/ .vscode/
.idea/ .idea/
+1 -1
View File
@@ -31,7 +31,7 @@ installation layers, and setup controller flow:
![PKGMGR Architecture](assets/map.png) ![PKGMGR Architecture](assets/map.png)
**Diagram status:** *Stand: 10. Dezember 2025* **Diagram status:** *Stand: 11. Dezember 2025*
**Always-up-to-date version:** https://s.veen.world/pkgmgrmp **Always-up-to-date version:** https://s.veen.world/pkgmgrmp
## Installation ⚙️ ## Installation ⚙️
+7
View File
@@ -0,0 +1,7 @@
# to-dos
For the following checkout the implementation map:
- Implement TAGS
- Implement MIRROR
- Implement SIGNING_KEY
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 1.9 MiB

+9 -1
View File
@@ -1,6 +1,14 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import sys
from pathlib import Path
# Ensure local src/ overrides installed package
ROOT = Path(__file__).resolve().parent
SRC = ROOT / "src"
if SRC.is_dir():
sys.path.insert(0, str(SRC))
from pkgmgr.cli import main from pkgmgr.cli import main
if __name__ == "__main__": if __name__ == "__main__":
main() main()
File renamed without changes.
+6
View File
@@ -0,0 +1,6 @@
# debian
package-manager/
debhelper-build-stamp
files
.debhelper/
package-manager.substvars
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+5 -4
View File
@@ -39,13 +39,14 @@ pkgmgr = "pkgmgr.cli:main"
# ----------------------------- # -----------------------------
# setuptools configuration # setuptools configuration
# ----------------------------- # -----------------------------
# We use find_packages(), not a fixed list, # Source layout: all packages live under "src/"
# and explicitly include pkgmgr* and config* [tool.setuptools]
package-dir = { "" = "src", "config" = "config" }
[tool.setuptools.packages.find] [tool.setuptools.packages.find]
where = ["."] where = ["src", "."]
include = ["pkgmgr*", "config*"] include = ["pkgmgr*", "config*"]
# Ensure defaults.yaml is shipped inside wheels & nix builds
[tool.setuptools.package-data] [tool.setuptools.package-data]
"config" = ["defaults.yaml"] "config" = ["defaults.yaml"]
+13 -2
View File
@@ -3,10 +3,21 @@ set -euo pipefail
echo "[arch/package] Building Arch package (makepkg --nodeps)..." echo "[arch/package] Building Arch package (makepkg --nodeps)..."
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
PKG_DIR="${PROJECT_ROOT}/packaging/arch"
if [[ ! -f "${PKG_DIR}/PKGBUILD" ]]; then
echo "[arch/package] ERROR: PKGBUILD not found in ${PKG_DIR}"
exit 1
fi
cd "${PKG_DIR}"
if id aur_builder >/dev/null 2>&1; then if id aur_builder >/dev/null 2>&1; then
echo "[arch/package] Using 'aur_builder' user for makepkg..." echo "[arch/package] Using 'aur_builder' user for makepkg..."
chown -R aur_builder:aur_builder "$(pwd)" chown -R aur_builder:aur_builder "${PKG_DIR}"
su aur_builder -c "cd '$(pwd)' && rm -f package-manager-*.pkg.tar.* && makepkg --noconfirm --clean --nodeps" su aur_builder -c "cd '${PKG_DIR}' && rm -f package-manager-*.pkg.tar.* && makepkg --noconfirm --clean --nodeps"
else else
echo "[arch/package] WARNING: user 'aur_builder' not found, running makepkg as current user..." echo "[arch/package] WARNING: user 'aur_builder' not found, running makepkg as current user..."
rm -f package-manager-*.pkg.tar.* rm -f package-manager-*.pkg.tar.*
+12 -3
View File
@@ -4,8 +4,17 @@ set -euo pipefail
echo "[centos/package] Setting up rpmbuild directories..." echo "[centos/package] Setting up rpmbuild directories..."
mkdir -p /root/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} mkdir -p /root/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
SPEC_PATH="${PROJECT_ROOT}/packaging/fedora/package-manager.spec"
if [[ ! -f "${SPEC_PATH}" ]]; then
echo "[centos/package] ERROR: SPEC file not found: ${SPEC_PATH}"
exit 1
fi
echo "[centos/package] Extracting version from package-manager.spec..." echo "[centos/package] Extracting version from package-manager.spec..."
version="$(grep -E '^Version:' package-manager.spec | awk '{print $2}')" version="$(grep -E '^Version:' "${SPEC_PATH}" | awk '{print $2}')"
if [[ -z "${version}" ]]; then if [[ -z "${version}" ]]; then
echo "ERROR: Version missing!" echo "ERROR: Version missing!"
exit 1 exit 1
@@ -15,13 +24,13 @@ srcdir="package-manager-${version}"
echo "[centos/package] Preparing source tree: ${srcdir}" echo "[centos/package] Preparing source tree: ${srcdir}"
rm -rf "/tmp/${srcdir}" rm -rf "/tmp/${srcdir}"
mkdir -p "/tmp/${srcdir}" mkdir -p "/tmp/${srcdir}"
cp -a . "/tmp/${srcdir}/" cp -a "${PROJECT_ROOT}/." "/tmp/${srcdir}/"
echo "[centos/package] Creating source tarball..." echo "[centos/package] Creating source tarball..."
tar czf "/root/rpmbuild/SOURCES/${srcdir}.tar.gz" -C /tmp "${srcdir}" tar czf "/root/rpmbuild/SOURCES/${srcdir}.tar.gz" -C /tmp "${srcdir}"
echo "[centos/package] Copying SPEC..." echo "[centos/package] Copying SPEC..."
cp package-manager.spec /root/rpmbuild/SPECS/ cp "${SPEC_PATH}" /root/rpmbuild/SPECS/
echo "[centos/package] Running rpmbuild..." echo "[centos/package] Running rpmbuild..."
cd /root/rpmbuild/SPECS cd /root/rpmbuild/SPECS
+19
View File
@@ -3,6 +3,25 @@ set -euo pipefail
echo "[debian/package] Building Debian package..." echo "[debian/package] Building Debian package..."
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
BUILD_ROOT="/tmp/package-manager-debian-build"
rm -rf "${BUILD_ROOT}"
mkdir -p "${BUILD_ROOT}"
echo "[debian/package] Syncing project sources to ${BUILD_ROOT}..."
rsync -a \
--exclude 'packaging/debian' \
"${PROJECT_ROOT}/" "${BUILD_ROOT}/"
echo "[debian/package] Overlaying debian/ metadata from packaging/debian..."
mkdir -p "${BUILD_ROOT}/debian"
cp -a "${PROJECT_ROOT}/packaging/debian/." "${BUILD_ROOT}/debian/"
cd "${BUILD_ROOT}"
echo "[debian/package] Running dpkg-buildpackage..."
dpkg-buildpackage -us -uc -b dpkg-buildpackage -us -uc -b
echo "[debian/package] Installing generated DEB package..." echo "[debian/package] Installing generated DEB package..."
+12 -3
View File
@@ -4,8 +4,17 @@ set -euo pipefail
echo "[fedora/package] Setting up rpmbuild directories..." echo "[fedora/package] Setting up rpmbuild directories..."
mkdir -p /root/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} mkdir -p /root/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
SPEC_PATH="${PROJECT_ROOT}/packaging/fedora/package-manager.spec"
if [[ ! -f "${SPEC_PATH}" ]]; then
echo "[fedora/package] ERROR: SPEC file not found: ${SPEC_PATH}"
exit 1
fi
echo "[fedora/package] Extracting version from package-manager.spec..." echo "[fedora/package] Extracting version from package-manager.spec..."
version="$(grep -E '^Version:' package-manager.spec | awk '{print $2}')" version="$(grep -E '^Version:' "${SPEC_PATH}" | awk '{print $2}')"
if [[ -z "${version}" ]]; then if [[ -z "${version}" ]]; then
echo "ERROR: Version missing!" echo "ERROR: Version missing!"
exit 1 exit 1
@@ -15,13 +24,13 @@ srcdir="package-manager-${version}"
echo "[fedora/package] Preparing source tree: ${srcdir}" echo "[fedora/package] Preparing source tree: ${srcdir}"
rm -rf "/tmp/${srcdir}" rm -rf "/tmp/${srcdir}"
mkdir -p "/tmp/${srcdir}" mkdir -p "/tmp/${srcdir}"
cp -a . "/tmp/${srcdir}/" cp -a "${PROJECT_ROOT}/." "/tmp/${srcdir}/"
echo "[fedora/package] Creating source tarball..." echo "[fedora/package] Creating source tarball..."
tar czf "/root/rpmbuild/SOURCES/${srcdir}.tar.gz" -C /tmp "${srcdir}" tar czf "/root/rpmbuild/SOURCES/${srcdir}.tar.gz" -C /tmp "${srcdir}"
echo "[fedora/package] Copying SPEC..." echo "[fedora/package] Copying SPEC..."
cp package-manager.spec /root/rpmbuild/SPECS/ cp "${SPEC_PATH}" /root/rpmbuild/SPECS/
echo "[fedora/package] Running rpmbuild..." echo "[fedora/package] Running rpmbuild..."
cd /root/rpmbuild/SPECS cd /root/rpmbuild/SPECS
+19
View File
@@ -3,6 +3,25 @@ set -euo pipefail
echo "[ubuntu/package] Building Ubuntu (Debian-style) package..." echo "[ubuntu/package] Building Ubuntu (Debian-style) package..."
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
BUILD_ROOT="/tmp/package-manager-ubuntu-build"
rm -rf "${BUILD_ROOT}"
mkdir -p "${BUILD_ROOT}"
echo "[ubuntu/package] Syncing project sources to ${BUILD_ROOT}..."
rsync -a \
--exclude 'packaging/debian' \
"${PROJECT_ROOT}/" "${BUILD_ROOT}/"
echo "[ubuntu/package] Overlaying debian/ metadata from packaging/debian..."
mkdir -p "${BUILD_ROOT}/debian"
cp -a "${PROJECT_ROOT}/packaging/debian/." "${BUILD_ROOT}/debian/"
cd "${BUILD_ROOT}"
echo "[ubuntu/package] Running dpkg-buildpackage..."
dpkg-buildpackage -us -uc -b dpkg-buildpackage -us -uc -b
echo "[ubuntu/package] Installing generated DEB package..." echo "[ubuntu/package] Installing generated DEB package..."
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -197,13 +197,8 @@ def _load_layer_dir(
def _load_defaults_from_package_or_project() -> Dict[str, Any]: def _load_defaults_from_package_or_project() -> Dict[str, Any]:
""" """
Fallback: Versuche Defaults aus dem installierten Paket ODER Fallback: load default configs from various possible install or development
aus dem Projekt-Root zu laden: layouts (pip-installed, editable install, source repo with src/ layout).
<pkg_root>/config_defaults
<pkg_root>/config
<project_root>/config_defaults
<project_root>/config
""" """
try: try:
import pkgmgr # type: ignore import pkgmgr # type: ignore
@@ -211,14 +206,25 @@ def _load_defaults_from_package_or_project() -> Dict[str, Any]:
return {"directories": {}, "repositories": []} return {"directories": {}, "repositories": []}
pkg_root = Path(pkgmgr.__file__).resolve().parent pkg_root = Path(pkgmgr.__file__).resolve().parent
project_root = pkg_root.parent roots = set()
candidates = [ # Case 1: installed package (site-packages/pkgmgr)
pkg_root / "config_defaults", roots.add(pkg_root)
pkg_root / "config",
project_root / "config_defaults", # Case 2: parent directory (site-packages/, src/)
project_root / "config", roots.add(pkg_root.parent)
]
# Case 3: src-layout during development:
# repo_root/src/pkgmgr -> repo_root
parent = pkg_root.parent
if parent.name == "src":
roots.add(parent.parent)
# Candidate config dirs
candidates = []
for root in roots:
candidates.append(root / "config_defaults")
candidates.append(root / "config")
for cand in candidates: for cand in candidates:
defaults = _load_layer_dir(cand, skip_filename=None) defaults = _load_layer_dir(cand, skip_filename=None)
@@ -227,7 +233,6 @@ def _load_defaults_from_package_or_project() -> Dict[str, Any]:
return {"directories": {}, "repositories": []} return {"directories": {}, "repositories": []}
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Hauptfunktion # Hauptfunktion
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.