BBC2-15 add bb pr merge#22
Open
b2l wants to merge 1 commit into
Open
Conversation
Merges an open PR via POST /pullrequests/{id}/merge with the destination
branch's default strategy, or an override via --strategy. Supports
--message for a custom merge commit message and --delete for server-side
+ local source branch cleanup.
Strategy resolution:
- --strategy validates against the destination branch's merge_strategies
allow-list (surfaced client-side with a helpful message listing the
permitted set) before the POST, rather than taking an opaque 400 from
the API.
- Without --strategy, use destination.branch.default_merge_strategy (set
via the branch's merge settings in the web UI); fall back to the API's
own default merge_commit when unset.
Both strategy fields are omitted from the default /pullrequests/{id}
serialization. Request them additively via fields=+... (see docs/bb-notes
under "Default merge strategy"). That's done in getPullRequest globally —
the extra fields are also useful to future consumers (e.g. BBC2-44) and
`+` additive syntax doesn't drop existing fields.
Response handling:
- 200 → synchronous success, print PR URL.
- 202 → poll task-status with capped exponential backoff (15 attempts,
500ms → 4s), resolve to SUCCESS or FAILED or time out with a retry
message.
- 409 / 555 → clean retry-friendly messages from the backend layer.
--delete local cleanup is best-effort. Guards: only delete when local
branch name matches the PR's source; switch to destination first when
currently on the source; fall back to a warning (non-fatal) if git
refuses (dirty tree, non-FF, etc.) — the server-side merge already
landed.
Extends GitRunner with the write primitives checkoutExistingBranch and
deleteLocalBranch (plus the hasLocalBranch query), and adds GitError
whose message carries git's stderr so users see git's own diagnostics.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
bb pr merge [id]that merges an open PR. Flags:--strategy/-s,--message/-m,--delete. Defaults to the PR for the current branch.getPullRequestnow requestsdestination.branch.default_merge_strategyanddestination.branch.merge_strategiesadditively viafields=+...— both are omitted from Bitbucket's default serialization (seedocs/bb-notes.md→ "Default merge strategy"). Exposed onPullRequestDetailasdefaultMergeStrategy/allowedMergeStrategies.--strategyis validated client-side against the branch's allow-list before the POST, so users get a clean message listing permitted strategies rather than an opaque 400.--strategy, the destination branch's configured default is used; when the branch has none, we fall back to Bitbucket's own defaultmerge_commit.202responses are polled against theLocationheader's task-status URL with capped exponential backoff (15 attempts, 500ms → 4s).409and555surface as retry-friendly errors from the backend. No auto-retry.--deletesendsclose_source_branch: true(remote-side cleanup) and, client-side, deletes the matching local branch withgit branch -d. Guards: only when the local name matches the PR's source; switch to destination first when currently on the source; warn (non-fatal) if git refuses.GitRunnerwithhasLocalBranch,checkoutExistingBranch,deleteLocalBranch; addsGitErrorwhich carries git's stderr.Test plan
bun test— 170 tests pass (13 new backend tests: merge happy path, message/delete body shaping, 202 + Location polling, 202 missing Location, 409, 555, task-status PENDING / SUCCESS / FAILED / malformed / non-2xx; 2 new fields-mapping tests ongetPullRequest)bun run lintcleanbunx tsc --noEmitcleanbb pr merge --helpshows all flagsbb pr mergein a non-Bitbucket repo fails with the-Rhint at the repo-resolve step (as expected)Manual test path
Pick a throwaway open PR you're willing to merge. Replace
<N>with its id.bb pr merge <N>— merges using the destination branch's default strategy. ExpectMerged pull request #<N>: <url>.bb pr merge <N> --strategy squash— explicit strategy. If the branch allows squash, it merges. If not, expectMerge strategy 'squash' is not allowed on branch 'main'. Allowed: merge_commit.bb pr merge <N> --strategy bogus— expectUnknown merge strategy 'bogus'. Allowed: merge_commit, squash, fast_forward, squash_fast_forward, rebase_fast_forward, rebase_merge.bb pr merge <N> --message "custom merge msg"— merges with your message as the merge commit message.bb pr merge <N> --delete. ExpectMerged pull request #<N>: <url>thenDeleted local branch '<source>'.— you should end up on the destination branch.bb pr merge <N> --delete. Same outcome; no branch switching.bb pr merge <N> --deletemerges remotely and skips the local delete silently.bb pr merge <N> --deletemerges remotely, then the local delete fails with a clearWarning: could not clean up local branch '<source>': ...line; exit code still 0.Pull request #<N> is merged; cannot merge.(ordeclined) — no API call made.bb --json pr merge <N>emits the full merged PR detail object.For the 202 path, no reliable manual setup — covered by backend tests. Keep an eye on timing if you do hit it in the wild; the polling budget is ~30s.
Closes BBC2-15.