{"record":{"id":"40a85f0bce820642","repo":"theonedev/onedev","slug":"errormessage-from-checkreopencondition","errorCode":null,"errorMessage":"errorMessage (from checkReopenCondition)","messagePattern":"errorMessage \\(from checkReopenCondition\\)","errorType":"validation","errorClass":"NotAcceptableException","httpStatus":400,"severity":"error","filePath":"server-core/src/main/java/io/onedev/server/service/impl/DefaultPullRequestService.java","lineNumber":316,"sourceCode":"            throw new NotAcceptableException(errorMessage);\n\n\t\tif (request.getSource().getObjectName(false) != null) {\n\t\t\tprojectService.deleteBranch(request.getSourceProject(), request.getSourceBranch());\n\t\t\tPullRequestChange change = new PullRequestChange();\n\t\t\tchange.setDate(new Date());\n\t\t\tchange.setData(new PullRequestSourceBranchDeleteData());\n\t\t\tchange.setRequest(request);\n\t\t\tchange.setUser(user);\n\t\t\tchangeService.create(change, note);\n\t\t}\n\t}\n\n\t@Transactional\n\t@Override\n\tpublic void reopen(User user, PullRequest request, String note) {\n        var errorMessage = request.checkReopenCondition();\n        if (errorMessage != null)\n            throw new NotAcceptableException(errorMessage);\n\n\t\trequest.setStatus(OPEN);\n\n\t\tPullRequestChange change = new PullRequestChange();\n\t\tchange.setData(new PullRequestReopenData());\n\t\tchange.setRequest(request);\n\t\tchange.setUser(user);\n\t\tchangeService.create(change, note);\n\n\t\tMergePreview mergePreview = request.checkMergePreview();\n\t\tif (mergePreview != null)\n\t\t\tupdateMergePreviewRef(request);\n\n\t\tcheckAsync(request, false, true);\n\t}\n\n\t@Transactional\n\t@Override","sourceCodeStart":298,"sourceCodeEnd":334,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/service/impl/DefaultPullRequestService.java#L298-L334","documentation":"reopen throws the message from PullRequest.checkReopenCondition() as a NotAcceptableException when the PR cannot be reopened. Guards include: PR already open, target/source branch or source project missing, another effective PR already covers the same change (open or already merged), or the source branch is already merged into the target. The thrown message equals the condition error text.","triggerScenarios":"Calling DefaultPullRequestService.reopen(user, request, note) when checkReopenCondition() returns non-null — e.g. \"Pull request already opened\", \"Target branch no longer exists\", \"Source branch no longer exists\", \"Another pull request already open for this change\", \"Change already merged\", or \"Source branch already merged into target branch\".","commonSituations":"Reopening a discarded PR after its branches were deleted; the changes were already merged via another PR; a duplicate open PR exists for the same source->target pair; fork source repository was removed.","solutions":["If already open, skip the reopen call","Restore the missing source/target branch (or source project) before reopening","If changes are already merged or another PR covers them, open a new PR for new work instead","Pre-check request.checkReopenCondition() == null before calling reopen"],"exampleFix":"// before\nprService.reopen(user, request, \"reopen it\"); // 400 \"Source branch no longer exists\"\n// after\nif (request.checkReopenCondition() == null)\n    prService.reopen(user, request, \"reopen it\");","handlingStrategy":"validation","validationCode":"String err = request.checkReopenCondition();\nboolean canReopen = err == null;","typeGuard":null,"tryCatchPattern":"try {\n    prService.reopen(user, request, note);\n} catch (NotAcceptableException e) {\n    // decide: already open / branches missing / already merged\n}","preventionTips":["Verify source and target branches still exist before reopen","Check for duplicate/effective PRs covering the same change","Skip reopen if the changes are already merged"],"tags":["pull-request","reopen","precondition"],"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-14T00:17:10.932Z"}