gitbutlerapp/gitbutler · error · anyhow::Error

Review requests for forge {forge:?} are not implemented yet.

Error message

Review requests for forge {forge:?} are not implemented yet.

What it means

`request_review()` asks specific users to review a review (PR/MR). Only the GitHub backend is wired (via `but_github::pr::request_reviewers`); other forges fall into the wildcard arm and fail before any network call.

Source

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

    storage: &but_forge_storage::Controller,
) -> Result<()> {
    let crate::forge::ForgeRepoInfo {
        forge, owner, repo, ..
    } = forge_repo_info;
    match forge {
        ForgeName::GitHub => {
            let preferred_account = preferred_forge_user.as_ref().and_then(|user| user.github());
            but_github::pr::request_reviewers(
                preferred_account,
                owner,
                repo,
                review_number,
                logins,
                storage,
            )
            .await
        }
        _ => Err(anyhow::anyhow!(
            "Review requests for forge {forge:?} are not implemented yet."
        )),
    }
}

/// Withdraw review requests for the given users on a review.
pub async fn withdraw_review_request(
    preferred_forge_user: &Option<crate::ForgeUser>,
    forge_repo_info: &crate::forge::ForgeRepoInfo,
    review_number: usize,
    logins: &[String],
    storage: &but_forge_storage::Controller,
) -> Result<()> {
    let crate::forge::ForgeRepoInfo {
        forge, owner, repo, ..
    } = forge_repo_info;
    match forge {
        ForgeName::GitHub => {

View on GitHub (pinned to caf1f223d3)

Solutions

  1. Request reviewers through the forge's own UI/API for non-GitHub reviews.
  2. Gate the request action on `forge == ForgeName::GitHub`.
  3. Implement reviewer-request calls in `but_gitlab`/`but_bitbucket` and extend the match at crates/but-forge/src/review.rs:1222-1230.

Example fix

// before
request_review(&user, &info, number, &["alice".into()], &storage).await?;

// after
if !matches!(info.forge, ForgeName::GitHub) {
    return Ok(()); // reviewer requests are GitHub-only
}
request_review(&user, &info, number, &["alice".into()], &storage).await?;
Defensive patterns

Strategy: validation

Validate before calling

use but_forge::forge::ForgeName;

if !matches!(info.forge, ForgeName::GitHub) {
    // hide 'request review' submit; only GitHub implements it
}

Type guard

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

Try / catch

match request_review(&user, &info, number, logins, &storage).await {
    Ok(()) => {}
    Err(e) if e.to_string().contains("not implemented yet") => { /* no-op; inform user */ }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Calling `request_review` with a list of logins for a review hosted on GitLab, Bitbucket or Azure — typically the submit action of a reviewer picker on a non-GitHub repo.

Common situations: Reviewer-request flows built against GitHub and reused across forges; multi-forge UIs where the button is visible everywhere; SDK automations that request reviews programmatically.

Related errors


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