{"record":{"id":"67654c97375efb07","repo":"gitbutlerapp/gitbutler","slug":"failed-to-enable-merge-request-auto-merge-status","errorCode":null,"errorMessage":"Failed to enable merge request auto-merge: {status} - {error_text}","messagePattern":"Failed to enable merge request auto-merge: (.+?) - (.+?)","errorType":"http","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/but-gitlab/src/client.rs","lineNumber":566,"sourceCode":"                auto_merge: bool,\n            }\n\n            let url = format!(\n                \"{}/projects/{}/merge_requests/{}/merge\",\n                self.base_url, project_id, params.mr_iid\n            );\n\n            let response = self\n                .client\n                .put(&url)\n                .json(&EnableAutoMergeBody { auto_merge: true })\n                .send()\n                .await?;\n\n            if !response.status().is_success() {\n                let status = response.status();\n                let error_text = response.text().await.unwrap_or_default();\n                bail!(\"Failed to enable merge request auto-merge: {status} - {error_text}\");\n            }\n\n            return Ok(());\n        }\n\n        let url = format!(\n            \"{}/projects/{}/merge_requests/{}/cancel_merge_when_pipeline_succeeds\",\n            self.base_url, project_id, params.mr_iid\n        );\n\n        let response = self.client.post(&url).send().await?;\n\n        if !response.status().is_success() {\n            let status = response.status();\n            let error_text = response.text().await.unwrap_or_default();\n            bail!(\"Failed to disable merge request auto-merge: {status} - {error_text}\");\n        }\n","sourceCodeStart":548,"sourceCodeEnd":584,"githubUrl":"https://github.com/gitbutlerapp/gitbutler/blob/58e5313667b857ef39a730e380af31816a7b1768/crates/but-gitlab/src/client.rs#L548-L584","documentation":"set_merge_request_auto_merge calls the GitLab auto-merge endpoint (POST .../merge_trains or /auto_merge per instance version). A non-2xx response bails with the status and GitLab's error body. GitLab rejects auto-merge when the MR is not currently mergeable or when merge trains are not enabled for the project.","triggerScenarios":"Enabling auto-merge on an MR whose pipeline hasn't started/failed `merge_status` checks, when the project has merge trains disabled (GitLab returns 400/405), when the MR has unresolved discussions, or when the token lacks merge permission. Also triggered when the auto-merge strategy payload is invalid for the instance's GitLab version.","commonSituations":"Project recently switched between merge trains and simple auto-merge, so the chosen strategy is no longer valid; MR not yet ready when the client fires the call; free-tier project without merge-train feature; race where the MR gets merged before auto-merge is set.","solutions":["Inspect the embedded error_text: 400/405 commonly means merge trains are disabled or the merge_status is `not_open`/`checking`.","Verify the MR's `merge_status` is `can_be_merged` and pipeline status before enabling auto-merge; retry after pipeline finishes.","Use the correct auto_merge_strategy for the project config (`merge_train_when_pipeline_succeeds` only with merge trains enabled).","Check the user has Developer+ role and the target branch protection allows their merges.","Treat 404/405 on old GitLab instances as 'feature unsupported' and fall back to polling-and-merging."],"exampleFix":"// before\nclient.set_merge_request_auto_merge(project_id, iid, strategy).await?;\n// after\nlet mr = client.get_merge_request(project_id, iid).await?;\nif mr.merge_status == \"can_be_merged\" {\n    client.set_merge_request_auto_merge(project_id, iid, strategy).await?;\n} else {\n    // wait for pipeline / discussions to resolve first\n}","handlingStrategy":"try-catch","validationCode":"let mr = client.get_merge_request(project_id, mr_iid).await?;\nif mr.merge_status != \"can_be_merged\" || mr.draft || mr.blocking_discussions_resolved != Some(true) {\n    return Err(anyhow!(\"MR not eligible for auto-merge yet\"));\n}","typeGuard":null,"tryCatchPattern":"match client.set_merge_request_auto_merge(project_id, iid, strategy).await {\n    Err(e) if e.to_string().contains(\"405\") || e.to_string().contains(\"400\") => {\n        // merge trains disabled or MR not open: fall back to polling + merge\n    }\n    Err(e) => return Err(e),\n    Ok(()) => {}\n}","preventionTips":["Confirm the project has merge trains enabled before using merge-train strategies","Wait for the pipeline to reach a pending/running success path before enabling auto-merge","Check merge_status == \"can_be_merged\" first","Handle 'already merged' races by re-reading MR state after the error"],"tags":["gitlab","auto-merge","http-error","merge-request"],"backgroundTag":"http-error-response","analyzedSha":"58e5313667b857ef39a730e380af31816a7b1768","analyzedAt":"2026-09-18T06:50:32.052Z","contentChangedAt":"2026-09-18T06:50:32.052Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}