{"record":{"id":"f0145eeb9bb74ffb","repo":"theonedev/onedev","slug":"errormessage-from-checkmergecondition","errorCode":null,"errorMessage":"errorMessage (from checkMergeCondition)","messagePattern":"errorMessage \\(from checkMergeCondition\\)","errorType":"validation","errorClass":"NotAcceptableException","httpStatus":400,"severity":"error","filePath":"server-core/src/main/java/io/onedev/server/service/impl/DefaultPullRequestService.java","lineNumber":356,"sourceCode":"\n\t\trequest.setStatus(Status.DISCARDED);\n\t\trequest.setCloseDate(new Date());\n\n\t\tPullRequestChange change = new PullRequestChange();\n\t\tchange.setData(new PullRequestDiscardData());\n\t\tchange.setRequest(request);\n\t\tchange.setUser(user);\n\t\tchangeService.create(change, note);\n\n\t\tpendingSuggestionApplyService.discard(null, request);\n\t}\n\n\t@Transactional\n\t@Override\n\tpublic void merge(User user, PullRequest request, @Nullable String commitMessage) {\n        var errorMessage = request.checkMergeCondition();\n        if (errorMessage != null)\n            throw new NotAcceptableException(errorMessage);\n        errorMessage = request.checkMergeCommitMessage(user, commitMessage);\n        if (errorMessage != null)\n            throw new NotAcceptableException(\"Error checking merge commit message: \" + errorMessage);\n\n\t\tMergePreview mergePreview = checkNotNull(request.checkMergePreview());\n\t\tObjectId mergeCommitId = ObjectId.fromString(checkNotNull(mergePreview.getMergeCommitHash()));\n        PersonIdent person = user.asPerson();\n\n\t\tProject project = request.getTargetProject();\n\t\tMergeStrategy mergeStrategy = mergePreview.getMergeStrategy();\n\n\t\tif (mergeStrategy == CREATE_MERGE_COMMIT\n\t\t\t\t|| mergeStrategy == SQUASH_SOURCE_BRANCH_COMMITS\n\t\t\t\t|| mergeStrategy == CREATE_MERGE_COMMIT_IF_NECESSARY\n\t\t\t\t\t\t&& !mergeCommitId.name().equals(mergePreview.getHeadCommitHash())) {\n\t\t\tPersonIdent author;\n\t\t\tif (mergeStrategy != SQUASH_SOURCE_BRANCH_COMMITS)\n\t\t\t\tauthor = person;","sourceCodeStart":338,"sourceCodeEnd":374,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/service/impl/DefaultPullRequestService.java#L338-L374","documentation":"merge throws the message returned by PullRequest.checkMergeCondition() as a NotAcceptableException when the PR does not satisfy merge requirements. Possible causes include: PR closed, PR in error state, work-in-progress, merge preview missing, merge conflicts, missing approvals, required builds not passed, missing commit signature, commit message policy violations, or disallowed file types.","triggerScenarios":"Calling DefaultPullRequestService.merge(user, commitMessage) (directly, via REST, or via checkAutoMerge) when checkMergeCondition() returns non-null — e.g. \"There are merge conflicts\", \"Waiting for approvals\", \"Some required builds not passed\", \"Pull request is work in progress\".","commonSituations":"Merging before required CI builds finish; missing reviewer approvals; merge conflicts introduced by new target-branch commits; WIP-titled PRs; branch protection requiring signed commits or specific commit message patterns; file-type restrictions on the target branch.","solutions":["Resolve the specific reported condition: get approvals, let required builds pass, resolve conflicts, or remove WIP marker","Ensure merge preview is computed (wait for the PR update) before merging","Verify commit messages and file types comply with target-branch protection rules","Pre-check request.checkMergeCondition() == null before calling merge"],"exampleFix":"// before\nprService.merge(user, null); // 400 \"Waiting for approvals\"\n// after\nif (request.checkMergeCondition() == null)\n    prService.merge(user, null);\nelse\n    log.info(\"merge blocked: \" + request.checkMergeCondition());","handlingStrategy":"validation","validationCode":"String err = request.checkMergeCondition();\nboolean canMerge = err == null;","typeGuard":null,"tryCatchPattern":"try {\n    prService.merge(user, commitMessage);\n} catch (NotAcceptableException e) {\n    // message states the blocking condition (approvals, builds, conflicts, ...)\n}","preventionTips":["Check checkMergeCondition() before merge and surface the reason","Wait for required builds and approvals","Keep the branch up to date to avoid conflicts","Ensure commit message and file-type policies are satisfied"],"tags":["pull-request","merge","precondition","branch-protection"],"backgroundTag":"invalid-state-transition","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}