Skip to content

Merge develop into main for v0.1.17 release - #10

Merged
ShortArrow merged 5 commits into
mainfrom
develop
May 31, 2026
Merged

Merge develop into main for v0.1.17 release#10
ShortArrow merged 5 commits into
mainfrom
develop

Conversation

@ShortArrow

Copy link
Copy Markdown
Owner

Summary

Release 0.1.17 bundles the Git Bash Ctrl+C fix (#7) with the packaging changes that landed on develop after 0.1.16:

  • Git Bash: bind -x line buffer not cleared by Ctrl+C after expansion #7 Git Bash Ctrl+C lost after expansion (PR fix(bash): bake-mode dispatcher for Git Bash Ctrl+C (closes #7) #8, primary fix). Cache file now ships a runtime case "${OSTYPE-}" dispatcher. On msys/cygwin the trigger handler resolves abbreviations from a static table baked into the cache file in pure bash — no subprocess spawn → no signal interference. Linux bash, WSL bash, zsh, pwsh, nu are unchanged. Cache version bumped 1 → 2 so runex doctor nudges existing Git Bash users to re-run runex init bash.
  • 0.1.17 interim trade-off (tracked in Restore command-position detection on the Git Bash bake path (0.1.19) #9 for closure in 0.1.18). The bake path skips command-position detection, so echo gst<Space> expands on Git Bash. Recipe-relevant command-position prefixes (sudo, |, ||, &&, ;) keep working on both paths.
  • AUR runex source package take-over (packaging/aur/). Sibling of runex-bin; 0.1.17 is the first release using the helper.
  • packaging/aur-bin/PKGBUILD synced to 0.1.16 + drift-prevention rule documented in CONTRIBUTING.md.

Tests

  • Unit tests: 547 pass on Linux, 540 + 7 Windows-local smoke pass on Windows (Git Bash + MSYS2 real binaries)
  • Linux PTY E2E with OSTYPE spoofing: 5 tests
  • Manual end-to-end on Git Bash 2.50 and MSYS2 (winget MSYS2.MSYS2): gst<Space> / gca<Space> / up3<Space> + Ctrl+C all clear the buffer cleanly
  • CI on PR fix(bash): bake-mode dispatcher for Git Bash Ctrl+C (closes #7) #8: Linux / Windows / macOS all green

Test plan

  • CI green on PR fix(bash): bake-mode dispatcher for Git Bash Ctrl+C (closes #7) #8 (already merged into develop)
  • CI green on this merge PR
  • After merge: tag v0.1.17 push triggers release.yml (crates.io publish + GitHub Release)
  • AUR runex-bin bump (helper script)
  • AUR runex bump (= first run after take-over)
  • Homebrew formula bump
  • winget manifest submission
  • Back-merge main → develop

Closes #7. Follow-up: #9.

The AUR helper script (packaging/aur-bin/release.sh) edits the
PKGBUILD and writes .SRCINFO in place, then copies them into the
AUR clone. The in-repo copies were committed once on 0.1.11 and
never updated since, so they had drifted to a stale 0.1.11 across
the 0.1.12 → 0.1.16 release cycle — only the AUR clone copies
were current. Bring the in-repo template back in sync with what
0.1.16 actually published.

Also document the rule in CONTRIBUTING.md's AUR release step so
the next release back-merge picks the change up automatically.

No behaviour change: the AUR clone has been at 0.1.16 since the
0.1.16 push; this just lines up the repo-side template.
Adopted maintainership of the AUR `runex` package (third-party
until 0.1.16, maintained by Rafael Dominiquini, transferred to
ShortArrow on 2026-05-25). `runex-bin` already lives under
`packaging/aur-bin/`; `runex` (= source build from crates.io)
gets a sibling `packaging/aur/`.

Behaviour for users:

- AUR `runex` rebuilds from the `runex` crate published to
  crates.io. The PKGBUILD now declares `conflicts=('runex-bin')`
  for symmetry with `runex-bin`'s existing `conflicts=('runex')`
  — installing one removes the other instead of clobbering files.
- `license` is corrected to `('MIT' 'Apache-2.0')` to match the
  crate's `MIT OR Apache-2.0` declaration (Dominiquini's PKGBUILD
  had `('MIT')` only).
- The bundled LICENSE file in the AUR clone is now sourced from
  the runex repo root (= the same file shipped in `runex` itself
  / GitHub Release tarballs), so its sha256 changes from
  Dominiquini's older MIT-only file to the current dual-licensed
  LICENSE.

New files:

- `packaging/aur/PKGBUILD`: imported from Dominiquini's last
  published state (0.1.16). Maintainer line rewritten to
  ShortArrow; Dominiquini retained as `Contributor:`.
- `packaging/aur/.SRCINFO`: regenerated via `makepkg --printsrcinfo`.
- `packaging/aur/.nvchecker.toml`: imported as-is from the AUR
  clone — the nvchecker config that watches `runex` on crates.io.
- `packaging/aur/release.sh`: sha256-from-crates.io variant of
  `packaging/aur-bin/release.sh`. Bumps pkgver, refreshes the
  multi-line `sha256sums=(...)` block (with a small embedded
  python because sed's multi-line story is grim), regenerates
  `.SRCINFO` via `makepkg`, copies PKGBUILD/.SRCINFO/.nvchecker.toml
  plus the repo-root LICENSE into the AUR clone, and stages a
  local commit. Push is manual via SSH (same as `runex-bin`).

CONTRIBUTING.md:

- New `AUR runex (source)` step in the Publish section, directly
  after `AUR runex-bin`. Documents the helper invocation, the
  crates.io-publish gate (must run after `cargo publish`), the
  conflict-with-runex-bin caveat, and the same in-repo-template-
  sync rule that `runex-bin` already follows.
- Brief historical note about the transfer from Dominiquini.

Tidy:

- `packaging/{aur-bin,homebrew}/release.sh` get the `+x` bit they
  always should have had — CONTRIBUTING.md already invokes them
  as `packaging/.../release.sh X.Y.Z ...` (no `bash` prefix), so
  they need to be executable. `packaging/aur/release.sh` is born
  `+x`.

The current AUR `runex` already shows 0.1.16 (Dominiquini's last
bump on our behalf, before transfer). 0.1.17 will be the first
release using this helper — at which point the metadata polish
(maintainer, conflicts, license, LICENSE-from-repo) lands on AUR
together with the version bump.
Under Git Bash (cygwin/msys bash) the readline bind -x handler sits on
top of the cygwin signal layer. Spawning a Win32 .exe from inside that
handler — exactly what every runex hook call did — caused the next
SIGINT to be lost, so the user's Ctrl+C after an unwanted expansion no
longer cleared the line and Enter ran the stale expanded command.

Fix: cache file now ships a runtime case "${OSTYPE-}" dispatcher. On
msys/cygwin the trigger handler resolves abbreviations from a static
table baked into the cache file in pure bash (no subprocess spawn →
SIGINT delivery restored). Linux bash, WSL bash, zsh, pwsh, nu are
unchanged.

0.1.17 interim trade-off (tracked in #9 for closure in 0.1.18): the
bake path skips command-position detection, so `echo gst<Space>`
expands gst on Git Bash even though Linux bash leaves it alone.
Recipe-relevant command-position prefixes (sudo, |, ||, &&, ;) still
work because those are command positions.

Includes:
- Rust unit tests (27 in bash_static_dispatcher, 4 new in shell_export)
- Linux PTY E2E with OSTYPE=msys spoofing (5 tests)
- Windows-local smoke against real Git Bash + MSYS2 binaries (7 tests
  per binary), covering OSTYPE values msys/cygwin/msys2/linux-gnu

Verified end-to-end on Git Bash 2.50 and MSYS2 (winget) for the actual
Ctrl+C-after-expansion case. Cache version bumped 1 → 2 so doctor
nudges existing Git Bash users to re-run `runex init bash`.

Closes #7. Follow-up: #9.
@ShortArrow
ShortArrow merged commit 378f38e into main May 31, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Git Bash: bind -x line buffer not cleared by Ctrl+C after expansion

1 participant