You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@magpie.apache.org by "KatalKavya96 (via GitHub)" <gi...@apache.org> on 2026/09/29 08:45:14 UTC
[PR] feat(bitbucket): add guarded cloud PR merge [magpie]
KatalKavya96 opened a new pull request, #1471:
URL: https://github.com/apache/magpie/pull/1471
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->
## Summary
- Adds guarded Bitbucket Cloud pull-request merge support via `magpie-bitbucket pr merge <id> --strategy {merge,squash,rebase}`.
- Maps the Cloud merge path onto the change-request `land(id, strategy) -> landed_ref` contract shape, including extraction of the resulting merge commit when available.
- Keeps Bitbucket Data Center merge writes explicitly fail-closed and preserves queued/submitted merge state instead of reporting an incomplete merge as already landed.
## Type of change
- [ ] Skill change (`.claude/skills/<name>/`) — eval fixtures updated below
- [x] Tool / bridge contract (`tools/<system>/*.md`)
- [x] Python package (`tools/*/` with `pyproject.toml`)
- [ ] Groovy reference impl
- [ ] Cross-cutting (RFC, AGENTS.md, sandbox, privacy-LLM)
- [x] Documentation (`docs/`, `README.md`, `CONTRIBUTING.md`)
- [ ] Project template (`projects/_template/`)
- [ ] CI / dev loop (`prek`, workflows, validators)
- [ ] Other:
## Test plan
- [x] `prek run --all-files` passes
- [x] For Python packages touched: `uv run pytest` / `ruff check` / `mypy` passes
- [ ] For Groovy bridges touched: command-line invocation tested end-to-end
- [ ] For skill changes: eval suite passes for the affected skill
(`PYTHONPATH=tools/skill-evals/src python3 -m skill_evals.runner tools/skill-evals/evals/<skill>/`)
- [ ] For skill *behaviour* changes: a new or updated eval fixture is included in this PR
(a regression test for the bug fixed / the behaviour added — see CONTRIBUTING.md)
- [x] Other:
- focused merge tests cover strategy payload, completed merge normalization, queued merge normalization, `landed_ref`, Data Center fail-closed behavior, and CLI dispatch
- full Bitbucket test suite passes
- `git diff --check` passes
- workspace pytest passes with a short macOS temp path to avoid the unrelated AF_UNIX pathname-length limitation
## RFC-AI-0004 compliance
- [x] **HITL** — the merge mutation remains gated on explicit caller-side user confirmation
- [x] **Sandbox** — no new unrestricted host access; the implementation reuses the existing guarded HTTPS write path
- [x] **Vendor neutrality** — the Bitbucket-specific command is mapped onto the generic change-request `land` contract rather than introducing a new framework-level vendor
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@magpie.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] feat(bitbucket): add guarded cloud PR merge [magpie]
Posted by "potiuk (via GitHub)" <gi...@apache.org>.
potiuk commented on code in PR #1471:
URL: https://github.com/apache/magpie/pull/1471#discussion_r4181713083
##########
tools/bitbucket/src/magpie_bitbucket/normalize.py:
##########
@@ -504,6 +504,54 @@ def declined_pull_request(
}
+def merged_pull_request(
+ kind: str,
+ raw: dict[str, Any],
+) -> dict[str, Any]:
+ """Normalize a pull-request merge submission."""
+ result = raw.get("result")
+ result_data = result if isinstance(result, dict) else {}
+
+ merge_result = result_data.get("merge_result")
+ merge_result_data = merge_result if isinstance(merge_result, dict) else {}
+
+ merge_commit = merge_result_data.get("merge_commit")
+ if not isinstance(merge_commit, dict):
+ merge_commit = result_data.get("merge_commit")
+
+ merge_commit_data = merge_commit if isinstance(merge_commit, dict) else {}
+ landed_ref = _string(merge_commit_data.get("hash"))
+
+ task_status = _string(result_data.get("task_status"))
+ state = _string(result_data.get("state"))
+ http_status = raw.get("http_status")
+
+ if landed_ref:
+ merge_status = "merged"
+ elif task_status:
+ merge_status = task_status.lower()
Review Comment:
**nit** — Consider mapping the raw `task_status` to the fixed `merged` / `submitted` set and keeping the raw value in a separate field, so callers don't need to know Bitbucket's task vocabulary.
##########
tools/bitbucket/src/magpie_bitbucket/cloud.py:
##########
@@ -399,6 +400,87 @@ def decline_pull_request(
}
+def merge_pull_request(
+ config: BitbucketConfig,
+ pull_request_id: str,
+ strategy: str,
+ expected_source_commit: str,
+) -> dict[str, Any]:
+ """Submit a merge for one Bitbucket Cloud pull request."""
+ workspace = quote_path(require(config.workspace, "BITBUCKET_WORKSPACE"))
+ repo_slug = quote_path(require(config.repo_slug, "BITBUCKET_REPO_SLUG"))
+ pr_id = quote_path(pull_request_id)
+ url = f"{CLOUD_API_BASE}/repositories/{workspace}/{repo_slug}/pullrequests/{pr_id}/merge"
+
+ pull_request = get_pull_request(config, pull_request_id)
+ source = pull_request.get("source")
+ source_data = source if isinstance(source, dict) else {}
+ commit = source_data.get("commit")
+ commit_data = commit if isinstance(commit, dict) else {}
+ source_commit = commit_data.get("hash")
+
+ if not isinstance(source_commit, str) or not source_commit:
+ raise BitbucketError("Bitbucket pull request response did not contain a source commit hash")
+
+ expected_commit = expected_source_commit.strip()
+ if not expected_commit:
+ raise BitbucketError("Expected source commit must not be empty")
+
+ actual = source_commit.lower()
+ expected = expected_commit.lower()
+
+ if not (actual.startswith(expected) or expected.startswith(actual)):
Review Comment:
**minor** — The two-way prefix compare handles short hashes well, but nothing bounds the length of `expected`: `--expected-source-commit a` matches ~1/16 of all heads, so the guard can be satisfied by accident. Please require 7–40 hex characters (e.g. `re.fullmatch(r"[0-9a-fA-F]{7,40}", expected)`) before the GET, and add tests for a too-short value and for a GET response with no `source.commit.hash` (that branch is currently untested).
##########
tools/bitbucket/src/magpie_bitbucket/cloud.py:
##########
@@ -399,6 +400,87 @@ def decline_pull_request(
}
+def merge_pull_request(
+ config: BitbucketConfig,
+ pull_request_id: str,
+ strategy: str,
+ expected_source_commit: str,
+) -> dict[str, Any]:
+ """Submit a merge for one Bitbucket Cloud pull request."""
+ workspace = quote_path(require(config.workspace, "BITBUCKET_WORKSPACE"))
+ repo_slug = quote_path(require(config.repo_slug, "BITBUCKET_REPO_SLUG"))
+ pr_id = quote_path(pull_request_id)
+ url = f"{CLOUD_API_BASE}/repositories/{workspace}/{repo_slug}/pullrequests/{pr_id}/merge"
+
+ pull_request = get_pull_request(config, pull_request_id)
+ source = pull_request.get("source")
+ source_data = source if isinstance(source, dict) else {}
+ commit = source_data.get("commit")
+ commit_data = commit if isinstance(commit, dict) else {}
+ source_commit = commit_data.get("hash")
+
+ if not isinstance(source_commit, str) or not source_commit:
+ raise BitbucketError("Bitbucket pull request response did not contain a source commit hash")
+
+ expected_commit = expected_source_commit.strip()
+ if not expected_commit:
+ raise BitbucketError("Expected source commit must not be empty")
+
+ actual = source_commit.lower()
+ expected = expected_commit.lower()
+
+ if not (actual.startswith(expected) or expected.startswith(actual)):
+ raise BitbucketError(
+ "Bitbucket pull request source commit changed: "
+ f"expected {expected_source_commit}, found {source_commit}"
+ )
+
+ strategy_map = {
+ "merge": "merge_commit",
+ "squash": "squash",
+ "rebase": "rebase_fast_forward",
+ }
+
+ try:
+ merge_strategy = strategy_map[strategy]
+ except KeyError as exc:
+ raise BitbucketError(f"Unsupported pull request merge strategy: {strategy}") from exc
+
+ response = write_request_with_metadata(
Review Comment:
**minor** — The 202 path looks right now — thanks. One case still produces a misleading failure: a synchronous merge that outlasts `DEFAULT_TIMEOUT_SECONDS = 30` raises "Timed out while connecting to Bitbucket after 30s" and the CLI exits 1, although the merge may already be running server-side — a caller reading that will likely retry. Please catch the timeout on this POST and raise a distinct error saying the outcome is unknown and the caller must check `pr get <id>` before retrying (or, if the merge endpoint supports an async mode, request it so the answer is always 202 + `Location`). A way to turn a submitted merge's `task_url` into a `landed_ref` can be a follow-up — please note it in the README's follow-up list.
##########
tools/bitbucket/src/magpie_bitbucket/cloud.py:
##########
@@ -399,6 +400,87 @@ def decline_pull_request(
}
+def merge_pull_request(
+ config: BitbucketConfig,
+ pull_request_id: str,
+ strategy: str,
+ expected_source_commit: str,
+) -> dict[str, Any]:
+ """Submit a merge for one Bitbucket Cloud pull request."""
+ workspace = quote_path(require(config.workspace, "BITBUCKET_WORKSPACE"))
+ repo_slug = quote_path(require(config.repo_slug, "BITBUCKET_REPO_SLUG"))
+ pr_id = quote_path(pull_request_id)
+ url = f"{CLOUD_API_BASE}/repositories/{workspace}/{repo_slug}/pullrequests/{pr_id}/merge"
+
+ pull_request = get_pull_request(config, pull_request_id)
+ source = pull_request.get("source")
+ source_data = source if isinstance(source, dict) else {}
+ commit = source_data.get("commit")
+ commit_data = commit if isinstance(commit, dict) else {}
+ source_commit = commit_data.get("hash")
+
+ if not isinstance(source_commit, str) or not source_commit:
+ raise BitbucketError("Bitbucket pull request response did not contain a source commit hash")
+
+ expected_commit = expected_source_commit.strip()
+ if not expected_commit:
+ raise BitbucketError("Expected source commit must not be empty")
+
+ actual = source_commit.lower()
+ expected = expected_commit.lower()
+
+ if not (actual.startswith(expected) or expected.startswith(actual)):
+ raise BitbucketError(
+ "Bitbucket pull request source commit changed: "
+ f"expected {expected_source_commit}, found {source_commit}"
+ )
+
+ strategy_map = {
+ "merge": "merge_commit",
+ "squash": "squash",
+ "rebase": "rebase_fast_forward",
+ }
+
+ try:
+ merge_strategy = strategy_map[strategy]
+ except KeyError as exc:
+ raise BitbucketError(f"Unsupported pull request merge strategy: {strategy}") from exc
+
+ response = write_request_with_metadata(
+ url,
+ config,
+ method="POST",
+ payload={
+ "type": "pullrequest",
+ "merge_strategy": merge_strategy,
+ },
+ )
+
+ # Bitbucket may accept a slow merge asynchronously. An empty response
+ # body is valid for HTTP 202; Location identifies the merge task.
+ if response.status == 202:
+ return {
+ "pull_request_id": pull_request_id,
+ "strategy": strategy,
+ "source_commit": source_commit,
+ "http_status": response.status,
+ "task_url": response.location,
+ "result": response.body,
+ }
+
+ if response.body is None:
+ raise BitbucketError("Bitbucket merge response did not contain result data")
+
+ return {
+ "pull_request_id": pull_request_id,
+ "strategy": strategy,
Review Comment:
**nit** — Optionally emit `backend_strategy` (the Bitbucket value actually sent) next to `strategy`, so an auditor can see that `rebase` went out as `rebase_fast_forward`.
##########
tools/spec-loop/specs/adapters.md:
##########
@@ -230,7 +230,8 @@ uv run --all-packages --group dev pytest tools/github-rollup/tests
mutation. The bridge executes only the confirmed action; current write
coverage is Bitbucket Cloud issue-comment creation, Bitbucket Cloud
pull-request comment creation, and Bitbucket Cloud pull-request
- approve/unapprove, request-changes/remove-request-changes, and decline actions.
+ approve/unapprove, request-changes/remove-request-changes, decline, and
+ strategy-aware merge actions.
Review Comment:
**nit** — Please mirror the source-commit pin and the "caller runs `pr merge-checks` first" contract in the spec, e.g. "strategy-aware merge actions pinned to a caller-confirmed source commit; gate checks are the caller's responsibility via `pr merge-checks`".
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@magpie.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] feat(bitbucket): add guarded cloud PR merge [magpie]
Posted by "KatalKavya96 (via GitHub)" <gi...@apache.org>.
KatalKavya96 commented on PR #1471:
URL: https://github.com/apache/magpie/pull/1471#issuecomment-5989966940
Thanks @potiuk — addressed the outstanding merge review points.
This update now:
- handles Bitbucket Cloud async merge acceptance (`202` + `Location`) without treating an accepted merge as a failure
- preserves async task metadata and reads `merge_result.merge_commit.hash` as `landed_ref`
- pins the confirmed PR head with `--expected-source-commit` and fails closed before POST if the source commit changed
- maps generic `rebase` to Bitbucket’s `rebase_fast_forward` strategy
- clarifies in the README that callers must run and inspect `pr merge-checks` before invoking `pr merge`
- fixes the remaining README consistency/invocation gaps
- adds failure-path coverage for HTTP merge failures, empty non-202 responses, invalid/missing strategy, changed heads, and Data Center fail-closed behavior
Full Bitbucket tests and the complete `prek run --all-files` suite are green.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@magpie.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] feat(bitbucket): add guarded cloud PR merge [magpie]
Posted by "KatalKavya96 (via GitHub)" <gi...@apache.org>.
KatalKavya96 commented on PR #1471:
URL: https://github.com/apache/magpie/pull/1471#issuecomment-5903842747
Thanks @Kaap10
I updated the PR to:
add required --strategy {merge,squash,rebase} CLI handling
map those values to Bitbucket Cloud merge strategies
pass the selected strategy through the merge request
extract merge_commit.hash as landed_ref
preserve queued merges without reporting a landed ref prematurely
add matching strategy, normalization, CLI, and Data Center fail-closed tests
Thanks for catching the contract/implementation mismatch.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@magpie.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] feat(bitbucket): add guarded cloud PR merge [magpie]
Posted by "potiuk (via GitHub)" <gi...@apache.org>.
potiuk commented on code in PR #1471:
URL: https://github.com/apache/magpie/pull/1471#discussion_r4175440257
##########
tools/bitbucket/src/magpie_bitbucket/cloud.py:
##########
@@ -399,6 +399,47 @@ def decline_pull_request(
}
+def merge_pull_request(
+ config: BitbucketConfig,
+ pull_request_id: str,
+ strategy: str,
+) -> dict[str, Any]:
+ """Submit a merge for one Bitbucket Cloud pull request."""
+ workspace = quote_path(require(config.workspace, "BITBUCKET_WORKSPACE"))
+ repo_slug = quote_path(require(config.repo_slug, "BITBUCKET_REPO_SLUG"))
+ pr_id = quote_path(pull_request_id)
+ url = f"{CLOUD_API_BASE}/repositories/{workspace}/{repo_slug}/pullrequests/{pr_id}/merge"
+
+ strategy_map = {
+ "merge": "merge_commit",
+ "squash": "squash",
+ "rebase": "fast_forward",
Review Comment:
**minor** — `fast_forward` isn't a rebase: it fails unless the source already contains the destination tip, whereas `rebase` replays the commits. Bitbucket Cloud now appears to offer rebase strategies (`rebase_fast_forward` / `rebase_merge`) — please check the current API reference and map to the closer one. Separately, the output echoes the *requested* strategy; the `land` contract asks backends to report the strategy they actually used when they can't honour the request.
##########
tools/bitbucket/README.md:
##########
@@ -96,7 +97,7 @@ activity where exposed by the configured Bitbucket backend.
Write coverage is intentionally narrow. The bridge supports confirmed
Bitbucket Cloud issue-comment creation, top-level pull-request comment creation,
-and pull-request approve/unapprove, request-changes/remove-request-changes, and decline actions after the calling skill has obtained
+and pull-request approve/unapprove, request-changes/remove-request-changes, decline, and merge actions after the calling skill has obtained
explicit user confirmation. Other writes, such as editing/deleting comments,
merging, creating/updating issues, changing branches, or triggering
Review Comment:
**minor** — This paragraph now lists merge as supported and "merging" as out of scope two lines later. Please drop "merging," here (or say "Data Center merging"). The *Write-path discipline* section further down still lists only the older mutations and says "All other Bitbucket mutations remain out of scope", and the Invocation block has no `pr merge` example.
##########
tools/bitbucket/src/magpie_bitbucket/cli.py:
##########
@@ -182,6 +182,21 @@ def _build_parser() -> argparse.ArgumentParser:
help="Pull request ID to decline.",
)
+ pr_merge = pr_subparsers.add_parser(
+ "merge",
+ help="Merge a pull request after caller-side confirmation.",
+ )
+ pr_merge.add_argument(
+ "pull_request_id",
+ help="Pull request ID to merge.",
+ )
+ pr_merge.add_argument(
Review Comment:
**minor** — Nothing pins the head the maintainer confirmed: if the author pushes between confirmation and this call, the new commits land unreviewed. Bitbucket's merge API has no expected-hash parameter, so consider an `--expected-source-commit <sha>` that GETs the PR first and fails closed if `source.commit.hash` doesn't match (prefix-compare — Cloud returns short hashes). That narrows the window from human think-time to the GET→POST gap and makes "guarded" concrete.
##########
tools/bitbucket/src/magpie_bitbucket/cloud.py:
##########
@@ -399,6 +399,47 @@ def decline_pull_request(
}
+def merge_pull_request(
+ config: BitbucketConfig,
+ pull_request_id: str,
+ strategy: str,
+) -> dict[str, Any]:
+ """Submit a merge for one Bitbucket Cloud pull request."""
+ workspace = quote_path(require(config.workspace, "BITBUCKET_WORKSPACE"))
+ repo_slug = quote_path(require(config.repo_slug, "BITBUCKET_REPO_SLUG"))
+ pr_id = quote_path(pull_request_id)
+ url = f"{CLOUD_API_BASE}/repositories/{workspace}/{repo_slug}/pullrequests/{pr_id}/merge"
+
+ strategy_map = {
+ "merge": "merge_commit",
+ "squash": "squash",
+ "rebase": "fast_forward",
+ }
+
+ try:
+ merge_strategy = strategy_map[strategy]
+ except KeyError as exc:
+ raise BitbucketError(f"Unsupported pull request merge strategy: {strategy}") from exc
+
+ result = write_request(
+ url,
+ config,
+ method="POST",
+ payload={
+ "type": "pullrequest",
+ "merge_strategy": merge_strategy,
+ },
+ )
+ if result is None:
Review Comment:
**major** — Bitbucket Cloud's merge endpoint isn't always synchronous: past its synchronous window (or with `?async=true`) it answers 202 with a `Location` header pointing at `.../pullrequests/{id}/merge/task-status/{task_id}`, and that resource carries `task_status` and `merge_result` (with `merge_commit.hash`). Today `write_request` drops headers so the task URL is lost; an empty-body 202 raises here and the CLI exits non-zero *after the merge was submitted* (inviting a confused retry); the 30s client timeout sits right at the synchronous window; and `normalize.merged_pull_request` reads `merge_commit` only at top level, so a finished task reports `landed_ref: None`. Please surface status + `Location` from the merge call, treat 202 as submitted (returning the task URL, or polling it with a bounded loop), read `merge_result.merge_commit.hash`, and add tests for the 202-with-Location and empty-body cases — the current queued-merge test uses a hand-built dict that no endpoint r
eturns.
##########
tools/bitbucket/tests/test_bitbucket.py:
##########
@@ -3444,3 +3445,170 @@ def test_cli_pr_decline_cloud(
output = json.loads(capsys.readouterr().out)
assert output["operation"] == "pull-request-decline"
assert output["pull_request"]["state"] == "DECLINED"
+
+
+@patch("magpie_bitbucket.client.urllib.request.build_opener")
+def test_cloud_merge_pull_request_posts_default_payload(
Review Comment:
**minor** — All new tests are happy-path (plus the Data Center refusal). Please add: a 409/400 from the merge endpoint surfacing as a non-zero CLI exit with Bitbucket's message; the `result is None` branch; argparse rejecting a missing or invalid `--strategy` before any request (assert no opener call); and `pr merge` via the CLI with `BITBUCKET_KIND=datacenter` exiting non-zero without an outbound request. The `..._posts_default_payload` name is also stale now that `--strategy` is required.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@magpie.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] feat(bitbucket): add guarded cloud PR merge [magpie]
Posted by "potiuk (via GitHub)" <gi...@apache.org>.
potiuk commented on PR #1471:
URL: https://github.com/apache/magpie/pull/1471#issuecomment-5999277804
I've pushed a small maintainer fixup on top of your branch so this can land now rather than after another round — `57ce3401` (plus a merge of current `main`, `f82cc2c2`; no force-push, your commits are untouched). It covers the five points from my last review:
- **Head pin** (`cloud.py`): `--expected-source-commit` must now be 7–40 hex characters and is checked *before* any request, so a one-character prefix can no longer satisfy the pin by accident. New tests cover short / non-hex / over-long values and a PR payload with no `source.commit.hash`.
- **Timeout** (`cloud.py`): a timeout on the merge POST now raises "the merge may still have been submitted — check `pr get <id>` before retrying" instead of a plain connection error that invites a retry while the merge may already be running. Other errors (e.g. HTTP 409) pass through unchanged; both are tested.
- **`merge_status`** (`normalize.py`): fixed vocabulary `merged` / `submitted` / `failed`, with Bitbucket's raw task state kept separately as `task_status` (`SUCCESS` → `merged`, `FAILED`/`ERROR` → `failed`).
- **`backend_strategy`**: the Bitbucket strategy actually sent (e.g. `rebase` → `rebase_fast_forward`) is reported alongside `strategy`.
- **Docs**: the README `pr merge` row and `tools/spec-loop/specs/adapters.md` describe the pin, the timeout behaviour, the caller-run `pr merge-checks`, and note turning a `task_url` into a `landed_ref` as follow-up work.
The existing tests' expected SHA moved from `abc123` to `abc123d` to meet the 7-character minimum. All 194 bitbucket tests pass, ruff / mypy are clean, and CI is green.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@magpie.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] feat(bitbucket): add guarded cloud PR merge [magpie]
Posted by "KatalKavya96 (via GitHub)" <gi...@apache.org>.
KatalKavya96 commented on PR #1471:
URL: https://github.com/apache/magpie/pull/1471#issuecomment-5886806629
Hi @potiuk — next narrow #606 follow-up after #1194.
This adds guarded Bitbucket Cloud `pr merge <id> --strategy {merge,squash,rebase}`, maps it onto the change-request `land(id, strategy) -> landed_ref` contract shape, preserves queued merge state, and keeps Data Center merge writes fail-closed.
Focused/full Bitbucket tests, Ruff, mypy, repository hooks, and workspace pytest are green.
Would appreciate your review when you get a chance.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@magpie.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] feat(bitbucket): add guarded cloud PR merge [magpie]
Posted by "potiuk (via GitHub)" <gi...@apache.org>.
potiuk merged PR #1471:
URL: https://github.com/apache/magpie/pull/1471
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@magpie.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org