{"record":{"id":"180ce139c3e84476","repo":"gitbutlerapp/gitbutler","slug":"merge-status-for-forge-forge-is-not-implemente","errorCode":null,"errorMessage":"Merge status for forge {forge:?} is not implemented yet.","messagePattern":"Merge status for forge (.+?) is not implemented yet\\.","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/but-forge/src/review.rs","lineNumber":1853,"sourceCode":"        }\n        ForgeName::Bitbucket => {\n            // Bitbucket has no dedicated mergeability endpoint; derive a basic\n            // status from the PR's state and comment count.\n            let preferred_account = preferred_forge_user\n                .as_ref()\n                .and_then(|user| user.bitbucket());\n            let pr = but_bitbucket::pr::get(preferred_account, owner, repo, review_number, storage)\n                .await?;\n            Ok(ReviewMergeStatus {\n                is_mergeable: pr.is_open(),\n                // Bitbucket's state strings (\"OPEN\"/\"MERGED\"/…) don't map to the\n                // forge-agnostic mergeable_state vocabulary the UI understands, so\n                // leave it unset rather than feed a value it can't interpret.\n                mergeable_state: None,\n                comments_count: pr.comment_count,\n            })\n        }\n        _ => Err(anyhow::anyhow!(\n            \"Merge status for forge {forge:?} is not implemented yet.\"\n        )),\n    }\n}\n\n/// Get a specific review (e.g. pull request) for a given forge repository\n///\n/// The resulting review will be cached.\npub fn get_forge_review(\n    preferred_forge_user: &Option<crate::ForgeUser>,\n    forge_repo_info: &crate::forge::ForgeRepoInfo,\n    review_number: usize,\n    db: &mut but_db::DbHandle,\n    storage: &but_forge_storage::Controller,\n) -> Result<ForgeReview> {\n    let preferred_forge_user = preferred_forge_user.clone();\n    let forge_repo_info = forge_repo_info.clone();\n    let storage = storage.clone();","sourceCodeStart":1835,"sourceCodeEnd":1871,"githubUrl":"https://github.com/gitbutlerapp/gitbutler/blob/caf1f223d3cfb94488c9198ad34487c6006c648f/crates/but-forge/src/review.rs#L1835-L1871","documentation":"`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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Use GitHub/GitLab/Bitbucket for review workflows — merge-status hints don't exist for Azure yet.","Skip the call and hide the merge hint when the forge is Azure.","Add an Azure arm that maps Azure DevOps PR merge status into `ReviewMergeStatus` at crates/but-forge/src/review.rs:1804."],"exampleFix":"// before\nlet status = get_review_merge_status(&user, &info, number, &storage).await?;\n\n// after\nlet status = match info.forge {\n    ForgeName::Azure => return Ok(None), // hide the merge hint for Azure\n    _ => get_review_merge_status(&user, &info, number, &storage).await?,\n};","handlingStrategy":"validation","validationCode":"use but_forge::forge::ForgeName;\n\nif matches!(info.forge, ForgeName::Azure) {\n    // skip the merge-status hint; only GitHub/GitLab/Bitbucket implement it\n}","typeGuard":"fn merge_status_supported(forge: &but_forge::forge::ForgeName) -> bool {\n    !matches!(forge, ForgeName::Azure)\n}","tryCatchPattern":"match get_review_merge_status(&user, &info, number, &storage).await {\n    Ok(s) => s,\n    Err(e) if e.to_string().contains(\"not implemented yet\") => { /* render without merge hint */ return Ok(Default::default()); }\n    Err(e) => return Err(e),\n}","preventionTips":["Remember the wildcard arm tracks enum growth: today Azure is the only forge without merge status.","Render merge hints as optional decoration so a missing status degrades gracefully.","When adding a new ForgeName variant, grep review.rs for wildcard arms and decide each explicitly."],"tags":["rust","but-forge","merge-status","azure","not-implemented"],"backgroundTag":"not-implemented-for-platform","analyzedSha":"caf1f223d3cfb94488c9198ad34487c6006c648f","analyzedAt":"2026-08-20T07:55:40.983Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}