{"record":{"id":"da4b5055b2987f78","repo":"theonedev/onedev","slug":"error-validating-auto-merge-commit-message","errorCode":null,"errorMessage":"Error validating auto merge commit message: ","messagePattern":"Error validating auto merge commit message: ","errorType":"http","errorClass":"NotAcceptableException","httpStatus":406,"severity":"warning","filePath":"server-core/src/main/java/io/onedev/server/rest/resource/PullRequestResource.java","lineNumber":516,"sourceCode":"\t@POST\n\tpublic Response setAutoMerge(@PathParam(\"requestId\") Long requestId, @NotNull AutoMergeData data) {\n\t\tvar subject = SecurityUtils.getSubject();\n\t\tvar user = SecurityUtils.getUser(subject);\n\t\tPullRequest request = pullRequestService.load(requestId);\n\t\tif (!SecurityUtils.canModifyPullRequest(subject, request) || !SecurityUtils.canWriteCode(subject, request.getProject()))\n\t\t\tthrow new UnauthorizedException();\n\t\tif (!request.isOpen())\n\t\t\tthrow new NotAcceptableException(\"Pull request is closed\");\n\n\t\tif (data.isEnabled() && request.checkMergeCondition() == null)\n\t\t\tthrow new NotAcceptableException(\"This pull request is not eligible for auto-merge, as it can be merged directly now\");\n\n\t\tvar autoMerge = new AutoMerge();\n\t\tautoMerge.setEnabled(data.isEnabled());\n\t\tautoMerge.setCommitMessage(data.getCommitMessage());\n\t\tvar errorMessage = request.checkMergeCommitMessage(user, autoMerge.getCommitMessage());\n\t\tif (errorMessage != null)\n\t\t\tthrow new NotAcceptableException(\"Error validating auto merge commit message: \" + errorMessage);\n\n\t\tpullRequestChangeService.changeAutoMerge(user, request, autoMerge);\n\n\t\treturn Response.ok().build();\n\t}\n\t\n\t@Api(order=1600)\n\t@Path(\"/{requestId}/reopen\")\n    @POST\n    public Response reopenPullRequest(@PathParam(\"requestId\") Long requestId, String note) {\n\t\tPullRequest request = pullRequestService.load(requestId);\n\t\tvar subject = SecurityUtils.getSubject();\n\t\tvar user = SecurityUtils.getUser(subject);\n    \tif (!SecurityUtils.canModifyPullRequest(subject, request))\n\t\t\tthrow new UnauthorizedException();\n    \t\n\t\tpullRequestService.reopen(user, request, note);\n\t\treturn Response.ok().build();","sourceCodeStart":498,"sourceCodeEnd":534,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/rest/resource/PullRequestResource.java#L498-L534","documentation":"Thrown by POST /pull-requests/{requestId}/auto-merge when the provided (or default) merge commit message fails validation. request.checkMergeCommitMessage() returns a non-null error (e.g. message exceeds length limits, contains disallowed placeholders, or violates project commit-message rules) and the endpoint surfaces it as HTTP 406 with prefix 'Error validating auto merge commit message: '.","triggerScenarios":"POSTing to /~api/pull-requests/{requestId}/auto-merge with AutoMergeData.commitMessage that violates the project's merge-commit message requirements (too long, empty when required, invalid content).","commonSituations":"Scripts generating commit messages with special characters or exceeding server limits; passing the PR title verbatim when project policy requires a fixed format; locale/encoding issues making the message contain unexpected characters.","solutions":["Read the error text after the prefix — it states the exact validation rule violated","Shorten or reformat the commitMessage in AutoMergeData to satisfy project policy","Omit commitMessage entirely to let OneDev use the default merge commit message","Check project settings for merge commit message template/limits and conform to them"],"exampleFix":"// before\n{enabled: true, commitMessage: longGeneratedTitle + ' -- ' + body5000chars}\n// after\n{enabled: true, commitMessage: 'Merge pull request #' + id + ' from ' + branch}","handlingStrategy":"validation","validationCode":"const msg = buildCommitMessage();\nif (!msg || msg.length > 500) { // match project merge-commit policy\n  throw new Error('merge commit message violates project policy');\n}\npost('/~api/pull-requests/' + id + '/auto-merge', {enabled: true, commitMessage: msg})","typeGuard":"function isValidCommitMessage(msg) {\n  return typeof msg === 'string' && msg.trim().length > 0 && msg.length <= 500;\n}","tryCatchPattern":"try {\n  post('/~api/pull-requests/' + id + '/auto-merge', {enabled: true, commitMessage: msg});\n} catch (e) {\n  if (e.status === 406 && /commit message/i.test(e.body || '')) {\n    log('Commit message rejected: ' + (e.body || '').replace(/^.*: /, ''));\n  } else throw e;\n}","preventionTips":["Omit commitMessage to accept the server's default unless a custom message is required","Match the project's merge-commit template and length limits when generating messages","Strip control characters and normalize encoding before sending","Parse the text after 'Error validating auto merge commit message: ' to learn the exact rule"],"tags":["rest","pull-request","validation","commit-message"],"backgroundTag":"schema-validation-failed","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}