gitbutlerapp/gitbutler · error · anyhow::Error

Merge status for forge {forge:?} is not implemented yet.

Error message

Merge status for forge {forge:?} is not implemented yet.

What it means

`get_review_merge_status()` fetches fresh runtime merge state per forge. GitHub (PR merge status), GitLab (MR merge status) and Bitbucket (derived from the PR, with `mergeable_state: None` because Bitbucket state strings don't map) are all implemented. The wildcard arm exists for remaining `ForgeName` values — today that means Azure — and returns this error.

Source

Thrown at crates/but-forge/src/review.rs:1853

        }
        ForgeName::Bitbucket => {
            // Bitbucket has no dedicated mergeability endpoint; derive a basic
            // status from the PR's state and comment count.
            let preferred_account = preferred_forge_user
                .as_ref()
                .and_then(|user| user.bitbucket());
            let pr = but_bitbucket::pr::get(preferred_account, owner, repo, review_number, storage)
                .await?;
            Ok(ReviewMergeStatus {
                is_mergeable: pr.is_open(),
                // Bitbucket's state strings ("OPEN"/"MERGED"/…) don't map to the
                // forge-agnostic mergeable_state vocabulary the UI understands, so
                // leave it unset rather than feed a value it can't interpret.
                mergeable_state: None,
                comments_count: pr.comment_count,
            })
        }
        _ => Err(anyhow::anyhow!(
            "Merge status for forge {forge:?} is not implemented yet."
        )),
    }
}

/// Get a specific review (e.g. pull request) for a given forge repository
///
/// The resulting review will be cached.
pub fn get_forge_review(
    preferred_forge_user: &Option<crate::ForgeUser>,
    forge_repo_info: &crate::forge::ForgeRepoInfo,
    review_number: usize,
    db: &mut but_db::DbHandle,
    storage: &but_forge_storage::Controller,
) -> Result<ForgeReview> {
    let preferred_forge_user = preferred_forge_user.clone();
    let forge_repo_info = forge_repo_info.clone();
    let storage = storage.clone();

View on GitHub (pinned to caf1f223d3)

Solutions

  1. Use GitHub/GitLab/Bitbucket for review workflows — merge-status hints don't exist for Azure yet.
  2. Skip the call and hide the merge hint when the forge is Azure.
  3. Add an Azure arm that maps Azure DevOps PR merge status into `ReviewMergeStatus` at crates/but-forge/src/review.rs:1804.

Example fix

// before
let status = get_review_merge_status(&user, &info, number, &storage).await?;

// after
let status = match info.forge {
    ForgeName::Azure => return Ok(None), // hide the merge hint for Azure
    _ => get_review_merge_status(&user, &info, number, &storage).await?,
};
Defensive patterns

Strategy: validation

Validate before calling

use but_forge::forge::ForgeName;

if matches!(info.forge, ForgeName::Azure) {
    // skip the merge-status hint; only GitHub/GitLab/Bitbucket implement it
}

Type guard

fn merge_status_supported(forge: &but_forge::forge::ForgeName) -> bool {
    !matches!(forge, ForgeName::Azure)
}

Try / catch

match get_review_merge_status(&user, &info, number, &storage).await {
    Ok(s) => s,
    Err(e) if e.to_string().contains("not implemented yet") => { /* render without merge hint */ return Ok(Default::default()); }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Calling `get_review_merge_status` when `ForgeRepoInfo.forge` is Azure (an Azure DevOps remote). GitHub, GitLab and Bitbucket always return a `ReviewMergeStatus` and never hit this arm.

Common situations: Azure DevOps remotes in the workspace; a new `ForgeName` variant added to the enum without a merge-status arm; UI merge hints enabled regardless of forge.

Related errors


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