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

  1. Manage Azure DevOps PRs through Azure's native API or web extension.
  2. Disable edit/rename/close/retarget UI for Azure-hosted reviews.
  3. 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

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


AI-assisted analysis of gitbutlerapp/gitbutler@caf1f223d3 (2026-08-20). Data as JSON: /api/errors/b2e23e8427fa826f. Report an issue: GitHub.