gitbutlerapp/gitbutler · error · anyhow::Error

Listing ci checks for forge {forge:?} is not implemented yet

Error message

Listing ci checks for forge {forge:?} is not implemented yet.

What it means

but-forge's CI-check listing is implemented for GitHub, GitLab and Bitbucket; the match on ForgeName ends in a catch-all arm that errors for any other forge, stating the operation is not implemented yet. Currently that means Azure DevOps remotes cannot list CI checks through this API.

Source

Thrown at crates/but-forge/src/ci.rs:193

                let runtime = tokio::runtime::Runtime::new()
                    .map_err(|err| anyhow::anyhow!("Failed to create tokio runtime: {err}"))?;
                runtime.block_on(bb.list_checks_for_ref(&workspace, &repo_slug, &reference))
            })
            .join()
            .map_err(|e| anyhow::anyhow!("Failed to join thread: {e:?}"))??;

            Ok(statuses.map(|statuses| {
                statuses
                    .into_iter()
                    .map(|status| {
                        let mut ci_check = CiCheck::from(status);
                        ci_check.reference = reference_for_checks.to_string();
                        ci_check
                    })
                    .collect()
            }))
        }
        _ => Err(anyhow::anyhow!(
            "Listing ci checks for forge {forge:?} is not implemented yet."
        )),
    }
}

#[derive(Debug, Clone, Serialize)]
#[cfg_attr(feature = "export-schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "camelCase")]
pub struct CiCheck {
    pub id: i64,
    pub name: String,
    pub output: CiOutput,
    pub started_at: Option<chrono::DateTime<chrono::Utc>>,
    pub status: CiStatus,
    pub head_sha: String,
    pub url: String,
    pub html_url: String,
    pub details_url: String,

View on GitHub (pinned to caf1f223d3)

Solutions

  1. Accept the error and hide/skip CI status for remotes on unsupported forges
  2. Query CI status for those remotes through the forge's own API/CLI instead
  3. Contribute or upvote an implementation for the missing forge in the ci.rs match
Defensive patterns

Strategy: fallback

Validate before calling

// Rust: gate on the supported forge set before calling
const CI_SUPPORTED_FORGES: &[ForgeName] =
    &[ForgeName::GitHub, ForgeName::GitLab, ForgeName::Bitbucket];
if !CI_SUPPORTED_FORGES.contains(&forge) {
    // skip CI listing for this remote; render 'CI status not supported'
}

Type guard

fn supports_ci_checks(forge: ForgeName) -> bool {
    matches!(forge, ForgeName::GitHub | ForgeName::GitLab | ForgeName::Bitbucket)
}

Try / catch

match list_ci_checks(&forge, owner, repo, reference) {
    Err(err) if err.to_string().contains("is not implemented yet") => {
        // treat CI as unsupported for this forge and hide the panel
    }
    result => result,
}

Prevention

When it happens

Trigger: Calling the CI-checks entry point in crates/but-forge/src/ci.rs for a repository whose remote resolves to a ForgeName outside {GitHub, GitLab, Bitbucket} - concretely an Azure DevOps remote.

Common situations: Teams self-hosting on Azure DevOps expecting feature parity with GitHub/GitLab; automation that enumerates all remotes and queries CI for each, hitting the unsupported arm.

Related errors


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