gitbutlerapp/gitbutler · error · anyhow::Error
Updating pull requests for forge {forge:?} is not implemente
Error message
Updating pull requests for forge {forge:?} is not implemented yet. What it means
`update_review()` (title/body/state/target-base changes) has arms for GitHub (PR update plus state), GitLab (`state_event` close/reopen) and Bitbucket (edit plus decline, reopen rejected). The remaining variant, Azure, falls into the wildcard arm and this error is returned before anything is sent to the forge.
Source
Thrown at crates/but-forge/src/review.rs:2037
.try_into()
.context("PR: Failed to cast usize to i64, somehow")?;
let params = but_bitbucket::UpdatePullRequestParams {
workspace: owner,
repo_slug: repo,
id,
title: title.as_deref(),
description: body.as_deref(),
target_branch: target_base.as_deref(),
};
but_bitbucket::pr::update(preferred_account, params, storage).await?;
}
if matches!(state, Some(ReviewState::Closed)) {
but_bitbucket::pr::decline(preferred_account, owner, repo, review_number, storage)
.await?;
}
Ok(())
}
_ => Err(anyhow::anyhow!(
"Updating pull requests for forge {forge:?} is not implemented yet."
)),
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "export-schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "lowercase")]
pub enum ReviewState {
Open,
Closed,
}
#[cfg(feature = "export-schema")]
but_schemars::register_sdk_type!(ReviewState);
impl ReviewState {
fn as_github_str(&self) -> &'static str {View on GitHub (pinned to caf1f223d3)
Solutions
- Manage Azure DevOps PRs through Azure's native API or web extension.
- Disable edit/rename/close/retarget UI for Azure-hosted reviews.
- Implement a `but_azure` update backend and extend the match at crates/but-forge/src/review.rs:1966.
Example fix
// before
update_review(&user, &info, number, payload, &storage).await?;
// after
if matches!(info.forge, ForgeName::Azure) {
return Ok(()); // updates unsupported on Azure; hide the edit UI
}
update_review(&user, &info, number, payload, &storage).await?; Defensive patterns
Strategy: validation
Validate before calling
use but_forge::forge::ForgeName;
if matches!(info.forge, ForgeName::Azure) {
// hide PR edit/close/retarget UI; update_review has no Azure arm
} Type guard
fn review_updates_supported(forge: &but_forge::forge::ForgeName) -> bool {
!matches!(forge, ForgeName::Azure)
} Try / catch
match update_review(&user, &info, number, payload, &storage).await {
Ok(()) => {}
Err(e) if e.to_string().contains("not implemented yet") => { /* leave PR unchanged */ }
Err(e) => return Err(e),
} Prevention
- Gate the whole review-edit surface (rename/close/retarget) on the forge, not each field separately.
- This error is deterministic for Azure — never retry it.
- When a new forge variant is added, update capability checks and this match in the same change.
When it happens
Trigger: Any `update_review` call — rename, retitle, close, retarget — with `ForgeRepoInfo.forge: azure`. All three implemented forges never hit this arm.
Common situations: Azure DevOps remotes; future `ForgeName` variants added without update support; edit UIs shown for every forge.
Related errors
- Repository labels for forge {forge:?} are not implemented ye
- Review labels for forge {forge:?} are not implemented yet.
- Review requests for forge {forge:?} are not implemented yet.
- Merge status for forge {forge:?} is not implemented yet.
- Reviewer candidates for forge {forge:?} are not implemented
AI-assisted analysis of gitbutlerapp/gitbutler@caf1f223d3 (2026-08-20).
Data as JSON: /api/errors/b2e23e8427fa826f.
Report an issue: GitHub.