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

  1. Only offer auto-merge when a pipeline for the MR's HEAD is actually running — check via list_pipeline_jobs_for_ref
  2. Verify is_mergeable via get_mr_merge_status first; resolve conflicts otherwise
  3. If the pipeline already succeeded, call merge_merge_request directly instead of enabling auto-merge
  4. For 403, confirm the account can merge into the target branch
  5. Treat 'already enabled' (406 with that message) as success rather than an error

Example fix

// before
client.set_merge_request_auto_merge(&params).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(&params).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(&params).await?;

Try / catch

if let Err(err) = client.set_merge_request_auto_merge(&params).await {
    if err.to_string().contains("406") { /* explain: no pipeline / checks not satisfied / already enabled */ }
    else { return Err(err); }
}

Prevention

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


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