{"record":{"id":"bed5190e41b9a429","repo":"gitbutlerapp/gitbutler","slug":"fetching-repo-info-for-forge-is-not-implement","errorCode":null,"errorMessage":"Fetching repo info for forge {:?} is not implemented yet.","messagePattern":"Fetching repo info for forge (.+?) is not implemented yet\\.","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/but-forge/src/repo.rs","lineNumber":37,"sourceCode":"            let gh = but_github::GitHubClient::from_storage(storage, preferred_account)?;\n            gh.get_repo(owner, repo).await.map(RepoInfo::from)\n        }\n        ForgeName::GitLab => {\n            let preferred_account = preferred_forge_user.as_ref().and_then(|user| user.gitlab());\n            let project_id = but_gitlab::GitLabProjectId::new(owner, repo);\n            but_gitlab::fetch_project(preferred_account, project_id, storage)\n                .await\n                .map(RepoInfo::from)\n        }\n        ForgeName::Bitbucket => {\n            let preferred_account = preferred_forge_user\n                .as_ref()\n                .and_then(|user| user.bitbucket());\n            but_bitbucket::fetch_repo(preferred_account, owner, repo, storage)\n                .await\n                .map(RepoInfo::from)\n        }\n        ForgeName::Azure => Err(anyhow::anyhow!(\n            \"Fetching repo info for forge {:?} is not implemented yet.\",\n            forge_repo_info.forge\n        )),\n    }\n}\n\n#[derive(Debug, Clone, Serialize)]\n#[cfg_attr(feature = \"export-schema\", derive(schemars::JsonSchema))]\n#[serde(rename_all = \"camelCase\")]\npub struct RepoInfo {\n    pub permissions: Option<RepoPermissions>,\n    pub fork: bool,\n    /// Whether the repo deletes the source branch after a PR is merged\n    /// (GitHub's per-repo \"Automatically delete head branches\" setting).\n    /// `None` when the field wasn't returned by the forge.\n    pub delete_branch_on_merge: Option<bool>,\n}\n","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/gitbutlerapp/gitbutler/blob/caf1f223d3cfb94488c9198ad34487c6006c648f/crates/but-forge/src/repo.rs#L19-L55","documentation":"RepoInfo fetching in but-forge supports GitHub, GitLab and Bitbucket; for any other ForgeName the match arm returns this not-implemented error instead of repository metadata. Azure DevOps is the concrete forge that currently falls through.","triggerScenarios":"Calling fetch_repo_info (crates/but-forge/src/repo.rs) for a repository whose forge resolves to Azure DevOps.","commonSituations":"Same gap as CI listing: Azure DevOps remotes in mixed-forge setups; tooling that resolves repo info for every remote uniformly.","solutions":["For unsupported forges, fetch repository metadata via the forge's own API/CLI","Skip repo-info features for those remotes and degrade gracefully","Track or contribute the Azure arm in crates/but-forge/src/repo.rs backed by an Azure client"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// Rust: gate repo-info fetching on supported forges\nif !matches!(forge, ForgeName::GitHub | ForgeName::GitLab | ForgeName::Bitbucket) {\n    // skip fetch_repo_info; fetch metadata via the forge's own API instead\n}","typeGuard":"fn supports_repo_info(forge: ForgeName) -> bool {\n    matches!(forge, ForgeName::GitHub | ForgeName::GitLab | ForgeName::Bitbucket)\n}","tryCatchPattern":"match fetch_repo_info(&forge_repo_info).await {\n    Err(err) if err.to_string().contains(\"is not implemented yet\") => {\n        // degrade: hide repo metadata features for this remote\n    }\n    result => result,\n}","preventionTips":["Filter remotes by supported forge before requesting repo info","Degrade metadata features per-remote instead of failing the whole request","Watch upstream releases for Azure DevOps support before enabling it in your integration"],"tags":["forge","repo-info","azure-devops","not-implemented"],"backgroundTag":"unsupported-forge","analyzedSha":"caf1f223d3cfb94488c9198ad34487c6006c648f","analyzedAt":"2026-08-20T07:55:40.983Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}