Skip to content

v0.1.5

Latest

Choose a tag to compare

@github-actions github-actions released this 17 Sep 23:29
· 33 commits to main since this release
Immutable release. Only release title and notes can be modified.

jj-stack 0.1.5 completes merges in one command, including through a merge queue, and explains what still blocks a PR that has approvals and passing checks.

Breaking changes

  • jj-stack merge no longer returns as soon as GitHub queues the PRs. It waits for the merge to finish, then fetches trunk, removes the merged changes from your local stack, rebases the rest, and updates their PRs, so a queued merge no longer needs a separate jj-stack sync. Scripts that relied on the early return must pass --no-wait and run jj-stack sync <head-change-id> in a later step once GitHub has merged.

Highlights

  • While a merge queue is working, jj-stack merge shows each PR's queue position, GitHub's time estimate, and the state of the queue's checks. Press Ctrl-C to stop waiting, or pass --no-wait to return as soon as GitHub accepts the request; neither cancels it. Rerun the same jj-stack merge to resume waiting, or run jj-stack sync <head-change-id> after GitHub finishes.
  • If GitHub removes a PR from the merge queue, jj-stack merge stops without changing anything locally, reports GitHub's reason, links to the checks on the queue's temporary merge commit (they never appear on the PR's own Checks tab), and names the next step: jj-stack sync <head-change-id> when a lower PR already merged, otherwise the same jj-stack merge again.
  • jj-stack view and jj-stack list report GitHub's merge state separately from review decisions and checks. An approved PR with passing checks can show merge blocked, for example while review threads remain unresolved, and review required appears when GitHub still requires a review. jj-stack view --verbose lists unresolved review threads and failed or pending checks with links. In JSON, changes gain merge_state_status and the review_required status, and view --verbose --json adds merge_details with unresolved_threads and checks, or merge_details_error when the details could not be read.
  • If your working copy is on a change that just merged, jj-stack sync (including the automatic sync after merge) moves it to a new empty change on trunk before removing the merged change, instead of stopping and asking you to run jj new 'trunk()' first. Only a different workspace sitting on the merged change still stops the sync.

Fixes

  • After a merge queue lands the bottom of a stack and drops the PR above it, GitHub leaves that PR at its submitted commit on its old base. jj-stack sync now rebases the remaining changes onto trunk and retargets that PR, instead of stopping with "Imported pull request heads no longer form the expected stack".
  • When someone pushed to your PR branch outside jj-stack and GitHub then merged the PR, jj-stack sync still stops rather than delete your local change, but its hint now names the commit that merged and how to resolve it: compare the PR's files with jj diff -r <change-id>, then either jj abandon <change-id> and run jj-stack cleanup, or run jj-stack unstack --local <change-id> and submit again. The old hint blamed your trunk() revset.
  • jj-stack submit explains when GitHub refuses to add a PR with auto-merge enabled to a stack and tells you to disable auto-merge on that PR first, instead of a generic retry hint that led back to the same failure.
  • When a repository rule rejects the PR-branch push, such as an org ruleset that blocks force pushes or requires signatures, the error shows Git's report of each rejected ref and GitHub's reason and says that no PR branch changed, instead of printing the underlying push command line.
  • Recovery hints fill in the selected head's short change ID or the linked PR number when the command knows it, instead of placeholders such as HEAD or CHANGE, and use <change-id> and <pr> otherwise, matching the guides. jj-stack unstack reports an untrusted saved link with the same explanation, hint, and exit code as the other commands.
  • Several errors now say what happened and what to do next. An undescribed change names jj describe; immutable, merge-commit, and not-on-trunk changes gain hints; the signed-commit stop explains that merging can discard signatures and that a choice is only needed when the repo allows several methods; and the closed-PR stops in submit all name jj-stack cleanup --pull-request <pr>. Authentication failures mention GITHUB_TOKEN, GH_TOKEN, and your gh login rather than GITHUB_TOKEN alone.
  • Other jj-stack commands in the repo no longer fail with jj-stack submit is already running in this repo while submit --edit has your editor open or a --describe-with helper is running. Submit reads the stack and GitHub again once the editor closes; if the stack changed meanwhile, it stops before pushing anything, with the usual --resume-edit hint.
  • --help output has its color highlighting back and is available even when jj configuration cannot be read. Setting ui.color=always in jj no longer prevents jj-stack from reading your configuration.
  • jj-stack view --verbose shows a PR's details only when it has unresolved threads or check results to report, is blocked without any, or could not be inspected, instead of one block per healthy PR. Its advisory rows name the head's short change ID rather than a full 32-character ID.
  • Terminal hyperlinks are underlined so they are recognizable as links.
  • jj-stack merge no longer prints a Trunk: line in its result; each action row already names the base branch.

Full changelog