Commit Graph
46 Commits
Author SHA1 Message Date
kevinveenbirkenbach 29eaa44849 Release version 16.2.3 2026-10-21 22:02:43 +02:00
kevinveenbirkenbach ed2ed573cc Release version 16.2.2 2026-10-21 13:00:13 +02:00
kevinveenbirkenbach 66eb3c7082 Release version 16.2.1 2026-10-20 22:35:05 +02:00
kevinveenbirkenbach e2501cb1de Release version 16.2.0 2026-10-20 21:11:50 +02:00
kevinveenbirkenbach e1d7e32889 Release version 16.1.0 2026-10-19 16:20:32 +02:00
kevinveenbirkenbach 7363137ea2 Release version 16.0.1 2026-10-18 23:04:22 +02:00
kevinveenbirkenbach fa0b40ae00 Release version 16.0.0 2026-10-18 23:04:02 +02:00
kevinveenbirkenbach 21d2c01c66 Release version 15.0.0 2026-10-03 21:21:58 +02:00
kevinveenbirkenbach b7ba182781 Release version 14.2.0 2026-09-22 15:22:09 +02:00
kevinveenbirkenbach 46b6e94a70 Release version 14.1.0 2026-09-21 23:12:35 +02:00
kevinveenbirkenbach d19b4b5f5a Release version 14.0.0 2026-09-19 16:35:48 +02:00
kevinveenbirkenbach 8df5c31e6e Release version 13.0.0 2026-08-26 09:39:19 +02:00
kevinveenbirkenbachandClaude Opus 5 575a5a87ac refactor(layout): sort shipped scripts by language and split the unit suite
Every script a role ships now lives under `files/<language>/`, and the unit
suite is split the same way: `tests/unit/python/` beside new sibling trees for
the other languages. `tests/lint/filesystem/test_role_files_layout.py` keeps it
that way; directories whose shape is dictated from outside carry a `.nocheck`
naming the constraint (Docker build contexts, WordPress mu-plugins, the Joomla
extension, Odoo addons, Playwright suites, the `files/test/test.sh` harness
that `test-e2e-cli` resolves generically).

This cannot be applied in halves. Moving a file and repointing what names it
are the same change: 14 references resolve only at deploy time, so the tree is
green either before or after, never between.

Those 14 were found by static resolution over every reference class, not by the
test suite -- a full `make quality-high` was green while all of them were
broken:

  * 7 `src:` values built from a role variable holding a bare filename
    (svc-bkp-remote-2-local, decidim, espocrm, friendica, joomla, pixelfed x2).
    The variable doubles as the destination name inside the container, so the
    language segment belongs at the call site, not in the variable.
  * `sys-service/tasks/04_base.yml` resolved every consumer's systemd script
    through `first_found(..., errors='strict')` over `files/script.{sh,py}`.
    18 roles ship exactly that and have no template fallback: the play would
    have died on each.
  * `sys-front-inj-javascript` fell back to `<role>/files/javascript.js`; the
    interface now reads `files/javascript/javascript.js`.
  * `sys-front-inj-logout/templates/head_sub.j2` built the cache-busting mtime
    path through `path_absolute(... 'files', ...)`.
  * 4 `ansible.builtin.script:` invocations naming a bare command
    (pull.py, prune.sh, set_postgres_superuser_password.sh, ganesha-serve.sh).
  * `dev-python/files/shell/install.sh` pointed at a sibling role's script.

Depth-dependent paths inside the moved trees were bumped accordingly: 59
`parents[N]` computations, 12 relative climbs, and the per-role recover CLI,
whose path `cli/administration/recover/recoverers.py` still assembled from the
pre-move location.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 01:31:09 +02:00
kevinveenbirkenbach b40a5b286e Release 12.0.0 2026-08-08 10:29:28 +02:00
kevinveenbirkenbach 490b42d509 Release 11.6.0 2026-07-08 03:07:30 +02:00
kevinveenbirkenbach 68c7555fbe Release 11.5.0 2026-07-04 21:20:44 +02:00
kevinveenbirkenbach ae41724cba Release version 11.4.0 2026-07-01 04:09:50 +02:00
kevinveenbirkenbach 42cec33388 Release 11.3.0 2026-06-29 20:56:20 +02:00
kevinveenbirkenbach cf78079448 Release version 11.2.0 2026-06-28 20:38:36 +02:00
kevinveenbirkenbach 354491c5f2 Release 11.1.0 2026-06-27 21:36:31 +02:00
kevinveenbirkenbachandClaude Opus 4.8 8a586ad373 feat(lint): validate generated distro changelogs + harden the mirror generator
Adds a lint-packages target/workflow that parses the generated packaging metadata with each ecosystem's native parser (dpkg-parsechangelog, rpmspec, bash -n for the PKGBUILD), failing on any parser stderr so warnings cannot slip through. Wired into the make lint fan-out and ci-orchestrator's lint gate; an install group provisions the parsers (best-effort, cross-distro).

Hardens package_mirror so the generated changelogs parse without warnings: every RPM body line gets a '- ' continuation prefix (a column-0 '*' was read as a new %changelog entry -> 'bad date'), and the archived-releases notice is folded into the oldest kept entry instead of trailing after the final entry (free text there made dpkg-parsechangelog warn). Regenerates packaging/debian/changelog and the Fedora spec accordingly.

Adds a test-lint check (test_package_changelog_completeness) asserting both package changelogs list every CHANGELOG.md + docs/changelog release and that their inline window matches CHANGELOG.md, plus unit regressions for the RPM continuation prefix and the Debian footer fold.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 21:36:30 +02:00
kevinveenbirkenbachandClaude Opus 4.8 376822ebe4 fix(changelog): indent Debian changelog bodies so dpkg-buildpackage parses them
format_debian_entry indented only the first body line per entry, leaving the rest at column 0. dpkg's changelog parser treats un-indented change lines as badly formatted, loses the entry boundary and reports 'cannot parse maintainer email address ""', failing the .deb build in build-ci-images. Every non-empty body line is now indented by two spaces.

trim_and_archive additionally dropped the '# Changelog' H1 preamble on every rewrite (it rebuilt content from the version entries only), which would break the MD041 markdown lint on the next trim. The preamble before the first version header is now preserved.

Regenerated packaging/debian/changelog and packaging/fedora/infinito-nexus.spec from CHANGELOG.md (untrimmed). Also adds the missing YAML document-start to web-app-pihole/tasks/main.yml.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 21:36:30 +02:00
kevinveenbirkenbach 9c2e8379fb Release 11.0.0 2026-06-27 14:35:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 3bdc8180c7 chore(changelog): archive releases past active window
Trim CHANGELOG.md to the active window and move older entries (4.0.3 through 8.0.4) into docs/changelog/; regenerate the Debian and Fedora package changelogs from the kept entries.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 10:46:05 +02:00
kevinveenbirkenbach 9bfbb7c3cb Release version 9.3.0 2026-06-11 10:33:55 +02:00
kevinveenbirkenbach d142431f9c Release version 9.2.0 2026-06-03 10:37:49 +02:00
kevinveenbirkenbach 4a2beaa3e7 Release version 9.1.0 2026-06-01 11:29:42 +02:00
kevinveenbirkenbach 9699ab33b3 Release version 9.0.2 2026-05-29 12:47:55 +02:00
kevinveenbirkenbach b9a3a8762a Release version 9.0.1 2026-05-28 21:19:49 +02:00
kevinveenbirkenbach 3d7bb7b983 Release version 9.0.0 2026-05-28 18:37:57 +02:00
kevinveenbirkenbach 21e878d7cd Release version 8.0.5 2026-05-28 17:50:39 +02:00
kevinveenbirkenbach 91ad89b3f4 Release version 8.0.4 2026-05-28 13:50:57 +02:00
kevinveenbirkenbach b12397e988 Release version 8.0.3 2026-05-28 11:51:38 +02:00
kevinveenbirkenbach 211fbcecf8 Release version 8.0.2 2026-05-28 11:12:31 +02:00
kevinveenbirkenbach fae8fa468a Release version 8.0.1 2026-05-28 09:14:46 +02:00
kevinveenbirkenbachandClaude Opus 4.7 954cb3ff07 fix(debian/changelog): keep source name as infinito-nexus, not infinito-nexus-core
Release 8.0.0 (12e53905f) bumped the changelog's top entry to
`infinito-nexus-core` while every other packaging artefact still
addresses the distro package as `infinito-nexus`:

  * `packaging/arch/PKGBUILD`             pkgname=infinito-nexus
  * `packaging/fedora/infinito-nexus.spec` Name: infinito-nexus
  * `packaging/debian/control`             Source/Package: infinito-nexus
  * `scripts/install/package.sh`           globs for infinito-nexus_*.deb,
                                            infinito-nexus-*.pkg.tar.*,
                                            infinito-nexus-*.rpm

dpkg-source --before-build refused to build because the changelog said
`infinito-nexus-core` while control said `infinito-nexus`; after the
preceding (now reverted) "align control with changelog" attempt, the
dpkg output filename became `infinito-nexus-core_8.0.0-1_all.deb`,
which fails the installer's `infinito-nexus_*.deb` glob check.

The repository name (`infinito-nexus-core`) is unrelated to the
distro-package name. The packaging convention is the short form
`infinito-nexus`. Align the changelog with the rest of the packaging
fleet instead of dragging every other file along.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-27 19:52:58 +02:00
kevinveenbirkenbach 12e53905fd Release 8.0.0 2026-05-27 17:37:31 +02:00
kevinveenbirkenbachandClaude Opus 4.7 067b191b44 fix(packaging/debian): suppress dh_auto_clean make-recurse
dpkg-buildpackage's debhelper sequence auto-detected the project's
Makefile and invoked 'make -j4 clean' from inside the package-build
sandbox at /tmp/infinito-nexus-debian-build. That recipe's BASH_ENV
sources scripts/meta/env/load.sh -> detect.sh, which (per the SPOT
contract) hard-fails when python3 is not yet on PATH — the package
hasn't been installed yet, so its python3 dependency isn't either.

Mirror the existing override_dh_auto_{build,test,install}: : pattern
to silence the auto-clean recurse. The .deb produced is unchanged
(no build artefacts to clean in the first place).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 01:25:51 +02:00
kevinveenbirkenbachandClaude Opus 4.7 79409ebf10 test(tooling): integrate markdownlint-cli2, ansible-lint, galaxy-importer + fix the resulting baseline
Tooling integration
* add .markdownlint-cli2.jsonc, .ansible-lint, .ansible-lint-ignore
  configs (permissive day-1: cosmetic rules disabled, semantic ones on)
* extend scripts/install/lint.sh with generic install_pip_pkg helper +
  ensure_ansible_lint / ensure_galaxy_importer / ensure_markdownlint_cli2
  ensure_* functions (pip / npm with sudo / --user / --break-system-packages
  fallbacks). install_ansible_tools now also pulls ansible-lint and
  galaxy-importer; new `markdown` install group.
* extend scripts/lint/ansible.sh to run ansible-lint after the existing
  syntax-check.
* add scripts/lint/markdown.sh and scripts/lint/galaxy.sh runners. The
  galaxy runner parallelizes via xargs (-P=$(nproc)), prints OK/FAIL per
  role, and treats `bare-name dependency` errors as success since our
  roles/ tree is not a Galaxy collection layout. All other Galaxy schema
  errors still fail.
* Makefile: new lint-markdown and lint-galaxy targets, both wired into
  `make lint`.
* CI: new workflows lint-markdown.yml and lint-galaxy.yml; lint-ansible.yml
  now installs ansible-core + ansible-lint; ci-orchestrator wires both
  new lint workflows into lint-gate.

Galaxy schema fixes
* shorten the canonical `galaxy_info.company` block from three lines to
  two ("Kevin Veen-Birkenbach\nhttps://www.veen.world", 45 chars) so it
  stays under Galaxy's hard 50-char limit. Updated everywhere: 229 role
  meta/main.yml plus _CANONICAL_COMPANY in
  tests/lint/repository/test_role_meta_main_galaxy_schema.py.
* shorten 19 over-long role descriptions to <=255 chars.
* add stub READMEs for sys-svc-compose-ca and sys-utils-service-loader.

Markdown baseline fixes
* markdownlint-cli2 --fix run repo-wide (formatting normalization
  across CHANGELOG, role READMEs, docs).
* manual MD041 fixes: prepend H1 in 15 files (CHANGELOG, LICENSE,
  TODO.md helpers, role README templates, etc.).
* MD025 / MD003 / MD001 / MD032 manual fixes for heading-style and
  list-spacing edge cases.
* role README content polish: "## Single Point of Truth (SPOT)" headings
  renamed to "## User data resolution" (D3 self-label rule).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 23:46:37 +02:00
kevinveenbirkenbachandClaude Opus 4.7 66badf258e refactor(changelog): split archive CLI into per-responsibility modules
Break cli/contributing/changelog/archive/__main__.py into four
single-responsibility modules under the same package:

* versioning.py — pad_version / unpad_version / archive_filename
  (the canonical <padded-semver>-<date>.md filename schema).
* archive_dir.py — existing_archives, archived_releases_from_directory,
  build_index_section (filesystem operations on docs/changelog/).
* changelog_md.py — split_into_entries, md_body_after_header,
  trim_and_archive (CHANGELOG.md parsing and trimming, plus the
  always-rebuild-index logic).
* package_mirror.py — mirror_to_debian_changelog,
  mirror_to_rpm_spec_changelog (Debian and RPM regeneration from
  CHANGELOG.md kept entries, with the trailing notice that points at
  docs.infinito.nexus and lists archived versions as plain text).

__main__.py shrinks to argparse plus a thin orchestration layer that
parses CHANGELOG.md once, runs trim_and_archive, reads the populated
archive directory, and mirrors into the package files.

Add `mirror_to_debian_changelog` and `mirror_to_rpm_spec_changelog`
content-idempotency: skip the write when the regenerated content
already matches what is on disk so re-runs leave file mtimes
unchanged. Verified end-to-end: a follow-up run on a fully-processed
tree leaves all three files (CHANGELOG.md, Debian changelog, RPM
spec) byte-identical and mtime-stable.

Replace `datetime.strptime` calls with `date.fromisoformat` so the
DTZ007 lint stays clean: we only need calendar-date parsing for
display formatting, not timezone-aware moments.

Tests follow the same split: one test_<module>.py per source module,
40 tests in total. Shared fixtures live in _helpers.py (underscore
prefix exempts it from the test-file-naming lint), and each test
class explicitly mixes TempRepoMixin with unittest.TestCase so the
test-files-have-tests AST lint sees the direct unittest base.

Update docs/contributing/actions/release.md so the procedure
description matches the current behaviour: package changelogs are
"mirrored" (not "trimmed") from CHANGELOG.md, and the idempotence
section calls out byte-idempotency on each of the three files.

Run the CLI once against the live tree to bring packaging/debian/
changelog and packaging/fedora/infinito-nexus.spec back into sync
with CHANGELOG.md and the docs/changelog/ archive directory.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 16:19:42 +02:00
kevinveenbirkenbach fa7c021525 Release version 7.0.0 2026-05-08 13:22:20 +02:00
kevinveenbirkenbach 15e9693eaf Release version 6.0.0 2026-04-25 17:59:57 +02:00
kevinveenbirkenbach e49631fec6 packaging: add PyYAML runtime dependency 2026-03-20 21:03:11 +01:00
kevinveenbirkenbach ad3f159548 Require Docker Compose in dev packaging 2026-03-19 11:25:49 +01:00
kevinveenbirkenbach d720937763 Fix EL9 RPM Python packaging dependency 2026-03-19 04:33:35 +01:00
kevinveenbirkenbach 3b11d7f469 feat(packaging): add distro packages and install via package metadata 2026-03-19 02:53:15 +01:00