gitbutlerapp/gitbutler · error · anyhow::Error
Failed to enable merge request auto-merge: {status} - {error
Error message
Failed to enable merge request auto-merge: {status} - {error_text} What it means
Thrown by GitLabClient::set_merge_request_auto_merge when params.enabled == true and GitLab rejects PUT /projects/:id/merge_requests/:iid/merge_when_pipeline_succeeds (body {auto_merge:true}). This endpoint is GitLab's 'Merge when pipeline succeeds' and it is picky: the classic failure is 406 Not Acceptable, returned when there is no pipeline running for the MR's HEAD, the MR is not mergeable, or merge is blocked by project settings. Status and response body are both included in the message.
Source
Thrown at crates/but-gitlab/src/client.rs:500
auto_merge: bool,
}
let url = format!(
"{}/projects/{}/merge_requests/{}/merge",
self.base_url, project_id, params.mr_iid
);
let response = self
.client
.put(&url)
.json(&EnableAutoMergeBody { auto_merge: true })
.send()
.await?;
if !response.status().is_success() {
let status = response.status();
let error_text = response.text().await.unwrap_or_default();
bail!("Failed to enable merge request auto-merge: {status} - {error_text}");
}
return Ok(());
}
let url = format!(
"{}/projects/{}/merge_requests/{}/cancel_merge_when_pipeline_succeeds",
self.base_url, project_id, params.mr_iid
);
let response = self.client.post(&url).send().await?;
if !response.status().is_success() {
let status = response.status();
let error_text = response.text().await.unwrap_or_default();
bail!("Failed to disable merge request auto-merge: {status} - {error_text}");
}
View on GitHub (pinned to caf1f223d3)
Solutions
- Only offer auto-merge when a pipeline for the MR's HEAD is actually running — check via list_pipeline_jobs_for_ref
- Verify is_mergeable via get_mr_merge_status first; resolve conflicts otherwise
- If the pipeline already succeeded, call merge_merge_request directly instead of enabling auto-merge
- For 403, confirm the account can merge into the target branch
- Treat 'already enabled' (406 with that message) as success rather than an error
Example fix
// before client.set_merge_request_auto_merge(¶ms).await?; // after: pre-check pipeline presence and mergeability let jobs = client.list_pipeline_jobs_for_ref(params.project_id.clone(), &mr_source_branch).await?; ensure!(!jobs.is_empty(), "no pipeline running for this MR — cannot auto-merge"); let st = client.get_mr_merge_status(params.project_id.clone(), params.mr_iid).await?; ensure!(st.is_mergeable, "MR has conflicts — cannot enable auto-merge"); client.set_merge_request_auto_merge(¶ms).await?;
Defensive patterns
Strategy: validation
Validate before calling
// Auto-merge needs a running pipeline and a mergeable MR let st = client.get_mr_merge_status(params.project_id.clone(), params.mr_iid).await?; ensure!(st.is_mergeable, "MR is not mergeable"); let jobs = client.list_pipeline_jobs_for_ref(params.project_id.clone(), &source_branch).await?; ensure!(!jobs.is_empty(), "no pipeline running for MR head"); client.set_merge_request_auto_merge(¶ms).await?;
Try / catch
if let Err(err) = client.set_merge_request_auto_merge(¶ms).await {
if err.to_string().contains("406") { /* explain: no pipeline / checks not satisfied / already enabled */ }
else { return Err(err); }
} Prevention
- Only show 'merge when pipeline succeeds' when a pipeline is actually running for the HEAD sha
- Treat an already-enabled 406 as success to keep flows idempotent
When it happens
Trigger: Enabling auto-merge when no pipeline is currently running for the MR head SHA (406); MR has conflicts so it is not mergeable (406); 'Pipelines must succeed' or 'merge checks' settings reject it (406); MR is a draft or already merged (405/406); auto-merge already enabled (406); account lacks Developer rights (403).
Common situations: User clicks 'merge when pipeline succeeds' before CI has registered/started a pipeline for the latest push; enabling auto-merge on a draft; retrying after the pipeline already finished (should plain-merge instead).
Related errors
- Failed to get merge request: {}
- Failed to get MR merge status: {}
- Failed to update merge request: {status} - {error_text}
- Failed to merge merge request: {}
- Failed to set merge request draft state: {status} - {error_t
AI-assisted analysis of gitbutlerapp/gitbutler@caf1f223d3 (2026-08-20).
Data as JSON: /api/errors/67654c97375efb07.
Report an issue: GitHub.