modemu2k release process
========================

Running notes for the v0.2.0 release. Future releases: clone the
[ ] checkboxes and walk through. Marked [x] = done, [ ] = pending.

In-tree edits (before tagging)
------------------------------
[x] ChangeLog: replace `(in-progress):` with `YYYY-MM-DD` + `- modemu2k (vX.Y.Z)`
    v0.2.0 sealed in commit 4b6702c (2026-05-27).
[ ] packaging/debian/changelog: change `UNRELEASED` → `unstable` (or the
    relevant Debian distribution) and refresh the date stamp.
[ ] meson.build: confirm `version:` matches the planned tag. The man
    page .TH version is templated from it (modemu2k.1.in), so no separate
    edit — but bump `man_date` in meson.build to the release month/year.
[ ] packaging/file_id.diz: bump the `vX.Y.Z` on the first line to the
    planned tag (the BBS-distribution DIZ ships in the source tarball).
[ ] scripts/reformat.sh — reformat hand-written sources with
    clang-format. Commit the result on its own so it stays separable
    from semantic changes:
        scripts/reformat.sh
        git diff   # eyeball the changes
        git add -A && git commit -m "reformat with clang-format"
[ ] meson fmt -ir — reformat all meson.build files (default style; no
    .editorconfig in this repo). Own commit, same reasoning as above.
[ ] Verify the committed lexer is in sync (regenerate in place; the
    output path is embedded in #line directives, so regenerating to a
    different path always differs):
        flex -o src/cmdlex.c src/cmdlex.l && git diff --exit-code src/cmdlex.c
    Should be a no-op: cmdlex.c is regenerated in the same commit as
    any cmdlex.l change (see CLAUDE.md).
    Environments without flex (e.g. OBS) build from the committed copy;
    a stale one silently drops newer AT commands (bit us for v0.2.3:
    ATA was missing → test_describe/test_answer SIGABRT in osc build).

Tarball (optional — for distro maintainers that want a checksum)
----------------------------------------------------------------
[ ] meson dist -C builddir
    → produces modemu2k-X.Y.Z.tar.xz in builddir/meson-dist/
[ ] sha256sum and md5sum of the tarball — recorded here once generated:
    sha256: <fill in>
    md5:    <fill in>

Per-distro packaging files
--------------------------
[ ] packaging/aur/PKGBUILD (local AUR clone, git-excluded from this
    repo): bump pkgver, reset pkgrel=1, set sha256sums, regenerate
    .SRCINFO with `makepkg --printsrcinfo > .SRCINFO`.
[ ] ~/src/slackbuilds/network/modemu2k/modemu2k.info: bump VERSION /
    DOWNLOAD, fill `MD5SUM="<md5 from above>"`.
[ ] ~/src/OpenSuse/home:andy5995:branches:network:utilities/modemu2k/:
    bump spec Version, prepend a modemu2k.changes entry, osc build test.

v0.2.3 (2026-07-14) tarball checksums
-------------------------------------
Generate the dist tarball from the FINAL pre-tag commit (meson dist
archives the latest committed revision), then record here in the
post-release housekeeping commit — recording before the final dist
is circular (the commit changes the next tarball):
    sha256: 7ea0fd0757a27a32144ed0b99afe4e0bf684e8d022e7a2d217bf19314f7641ba
    md5:    0a1ec367463f4d5aa66afb56b4d421ff

FileGate (BBS distribution — email attach to the sysop)
-------------------------------------------------------
[ ] Build ~/Downloads/modemu2k.zip (overwrite): extract the release
    tarball, add packaging/file_id.diz as top-level FILE_ID.DIZ, then
    zip the modemu2k-X.Y.Z/ tree + FILE_ID.DIZ.
[ ] Email-attach the zip for FileGate.

GitHub Release (which also creates the tag)
-------------------------------------------
[ ] Draft the release in the GitHub UI: target = master, tag = vX.Y.Z
    (new), title = "modemu2k vX.Y.Z", body = release summary pulled from
    the ChangeLog stanza.
[ ] Click Publish. GitHub creates the tag on master at that point.
[ ] The tag push fires .github/workflows/appimage.yml; it builds AppImages
    for x86_64 and aarch64, then uses ncipollo/release-action with
    allowUpdates + omitBody/Name to attach them (plus .sha256sum files)
    to the release you just published — without touching the title or body.
    → expect 4 attachments to appear on the release page within ~2 min.
[ ] (Optional) attach the meson dist tarball from above if you generated it.

gh-pages
--------
[ ] The docs workflow auto-publishes to vMAJOR.MINOR.x/ (rolling
    pointer, not per-patch) on every push to master. Tag-publish itself
    doesn't trigger it (tags ≠ branch pushes), but any subsequent push
    to master will.
[ ] gh-pages/index.html: no hand-edit needed within a minor series —
    the docs workflow's "Rebuild landing-page version list" step sorts
    existing dirs and regenerates the <ul>. Hand-edit only when adding
    a wholly new minor series (e.g. introducing v0.3.x/).

CI sanity (do before tagging)
-----------------------------
[ ] All workflows green on master:
    - C/C++ CI (linux gcc, linux clang, linux arm gcc)
    - macOS
    - BSD
    - Build AppImage
    - CodeQL Advanced
    - Publish docs

Post-release housekeeping
-------------------------
[ ] ChangeLog: open a new `(in-progress):` block at the top for the next
    release. Bullets land here as breaking/notable changes accrue.
[ ] If any deprecations were honored this release (e.g. m2k_dial /
    m2k_online were removed), drop the `M2K_SUPPRESS_DEPRECATED` flag
    from tests/meson.build.
