{"record":{"id":"1492bd7e43b61eb2","repo":"theonedev/onedev","slug":"user-username-is-included-multiple-times","errorCode":null,"errorMessage":"User '${userName}' is included multiple times","messagePattern":"User '(.+?)' is included multiple times","errorType":"validation","errorClass":"ExplicitException","httpStatus":null,"severity":"error","filePath":"server-core/src/main/java/io/onedev/server/util/reviewrequirement/ReviewRequirement.java","lineNumber":62,"sourceCode":"\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\tCommonTokenStream tokens = new CommonTokenStream(lexer);\n\t\t\tReviewRequirementParser parser = new ReviewRequirementParser(tokens);\n\t\t\tparser.removeErrorListeners();\n\t\t\tparser.setErrorHandler(new BailErrorStrategy());\n\t\t\t\n\t\t\tRequirementContext requirementContext = parser.requirement();\n\t\t\t\n\t\t\tfor (CriteriaContext criteria: requirementContext.criteria()) {\n\t\t\t\tif (criteria.userCriteria() != null) {\n\t\t\t\t\tString userName = getValue(criteria.userCriteria().Value());\n\t\t\t\t\tUser user = OneDev.getInstance(UserService.class).findByName(userName);\n\t\t\t\t\tif (user != null) {\n\t\t\t\t\t\tif (!users.contains(user)) \n\t\t\t\t\t\t\tusers.add(user);\n\t\t\t\t\t\telse \n\t\t\t\t\t\t\tthrow new ExplicitException(\"User '\" + userName + \"' is included multiple times\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new ExplicitException(\"Unable to find user '\" + userName + \"'\");\n\t\t\t\t\t}\n\t\t\t\t} else if (criteria.groupCriteria() != null) {\n\t\t\t\t\tString groupName = getValue(criteria.groupCriteria().Value());\n\t\t\t\t\tGroup group = OneDev.getInstance(GroupService.class).find(groupName);\n\t\t\t\t\tif (group != null) {\n\t\t\t\t\t\tif (!groups.containsKey(group)) {\n\t\t\t\t\t\t\tTerminalNode digit = criteria.groupCriteria().DIGIT();\n\t\t\t\t\t\t\tif (digit != null) \n\t\t\t\t\t\t\t\tgroups.put(group, Integer.parseInt(digit.getText()));\n\t\t\t\t\t\t\telse \n\t\t\t\t\t\t\t\tgroups.put(group, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new ExplicitException(\"Group '\" + groupName + \"' is included multiple times\");\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new ExplicitException(\"Unable to find group '\" + groupName + \"'\");","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/util/reviewrequirement/ReviewRequirement.java#L44-L80","documentation":"While parsing a review requirement, each 'user:<name>' criterion is resolved via UserService.findByName and accumulated into a set; a duplicate user throws ExplicitException with this message. The requirement would count the same user twice, which is ambiguous, so it is rejected up front.","triggerScenarios":"Parsing a requirement string listing the same user twice, e.g. 'user:bob or user:bob', or a user appearing in multiple criteria branches of the same expression.","commonSituations":"Hand-maintained requirement strings that grew over time; copy-paste of a branch that duplicated a name; automation generating requirements without deduplication.","solutions":["Remove the duplicate user occurrence from the requirement string","Replace the duplicated user with a group covering both occurrences","Wrap parse in try-catch on ExplicitException and show a user-friendly message"],"exampleFix":"// before\nreviewRequirement = \"user:bob or user:bob\";\n// after\nreviewRequirement = \"user:bob\";","handlingStrategy":"validation","validationCode":"java.util.Set<String> seen = new java.util.HashSet<>();\nfor (String name : extractUserNames(requirement)) {\n    if (!seen.add(name))\n        throw new ExplicitException(\"Duplicate user in requirement: \" + name);\n}","typeGuard":null,"tryCatchPattern":"try {\n    ReviewRequirement.parse(req);\n} catch (ExplicitException e) {\n    ui.showError(e.getMessage());\n}","preventionTips":["Deduplicate user lists before generating requirement strings","Prefer group clauses over enumerating users","Validate expressions on save with a try-catch around parse"],"tags":["review-requirement","duplicate","validation"],"backgroundTag":"invalid-argument-value","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"}