Skip to content

Changelog

Changelog

All notable changes to this project are documented here. The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

Unreleased

0.1.0 - 2026-07-18

First release. pkgforge stages files into a build root, records their intended install metadata in a file DB, and renders that DB into RPM/Debian packaging manifests. Built on the duho declarative CLI framework; Python 3.9+, Linux runtime.

Added

  • Commands: install (stage a source and record its entry — files, directories, symlinks, decompression, hardlinks, --exclude, --chown, --remove-source), scan (walk a tree and record entries; --missing fills gaps), dbdump (render the DB to a packaging manifest), initdb, and compact (collapse an append-log DB to one record per live path).
  • Dump formats: rpmspecfiles (RPM %files lines with %attr/%dir and a meta.rpmprefix) and debian (install + permissions artifacts). The format registry supports multi-artifact formats.
  • Pluggable file-DB backends behind one DbProvider interface: jsonl (append-only JSON Lines, the default), yaml (append-only YAML), and sqlite (a real SQLite store, upserted in place). Every command behaves identically across all three. The backend is inferred from the --db suffix (.jsonl/.ndjson, .yaml/.yml, .db/.sqlite/.sqlite3); --db-format / PKGFORGE_DB_FORMAT overrides it, and reading auto-detects a file's actual format. register_provider() lets a third-party package add its own backend; DbProvider, open_db, and register_provider are exported from the package.
  • Environment-driven configuration for unattended builds (PKGFORGE_ROOT, PKGFORGE_DB, PKGFORGE_DB_FORMAT), --version, and shell completion.
  • Tar-family archives extract via stdlib tarfile (safe data filter where supported); bsdtar is only a fallback for other formats (e.g. .iso).
  • Documentation site (mkdocs-material) with a guide + API reference, a benchmarks/ runner, an end-to-end example, and CI (test.yml/release.yml).

Notes

  • File-DB entries store mode as an octal permission string; two sentinels (- = OS default, -- = resolve from disk) defer a field to the staged file.
  • Hardlink install uses os.link for portability across Python 3.9–3.13 (Path.link_to was removed in 3.12; Path.hardlink_to only exists from 3.10).