in java/com/google/gerrit/plugins/codeowners/backend/OnCodeOwnerApproval.java [109:230]
private Optional<String> buildMessageForCodeOwnerApproval(
IdentifiedUser user,
ChangeNotes changeNotes,
PatchSet patchSet,
Map<String, Short> oldApprovals,
Map<String, Short> approvals,
RequiredApproval requiredApproval,
int limit) {
LabelVote newVote = getNewVote(requiredApproval, approvals);
// limit + 1, so that we can show an indicator if there are more than <limit> files.
ImmutableList<Path> ownedPaths =
OwnedChangedFile.getOwnedPaths(
codeOwnerApprovalCheck.getOwnedPaths(
changeNotes,
changeNotes.getCurrentPatchSet(),
user.getAccountId(),
/* start= */ 0,
limit + 1));
if (ownedPaths.isEmpty()) {
// the user doesn't own any of the modified paths
return Optional.empty();
}
if (isIgnoredDueToSelfApproval(user, patchSet, requiredApproval)) {
if (isCodeOwnerApprovalNewlyApplied(requiredApproval, oldApprovals, newVote)
|| isCodeOwnerApprovalUpOrDowngraded(requiredApproval, oldApprovals, newVote)) {
return Optional.of(
String.format(
"The vote %s is ignored as code-owner approval since the label doesn't allow"
+ " self approval of the patch set uploader.",
newVote));
}
return Optional.empty();
}
boolean hasImplicitApprovalByUser =
codeOwnersPluginConfiguration
.getProjectConfig(changeNotes.getProjectName())
.areImplicitApprovalsEnabled()
&& patchSet.uploader().equals(user.getAccountId());
boolean noLongerExplicitlyApproved = false;
StringBuilder message = new StringBuilder();
if (isCodeOwnerApprovalNewlyApplied(requiredApproval, oldApprovals, newVote)) {
if (hasImplicitApprovalByUser) {
message.append(
String.format(
"By voting %s the following files are now explicitly code-owner approved by %s:\n",
newVote, AccountTemplateUtil.getAccountTemplate(user.getAccountId())));
} else {
message.append(
String.format(
"By voting %s the following files are now code-owner approved by %s:\n",
newVote, AccountTemplateUtil.getAccountTemplate(user.getAccountId())));
}
} else if (isCodeOwnerApprovalRemoved(requiredApproval, oldApprovals, newVote)) {
if (newVote.value() == 0) {
if (hasImplicitApprovalByUser) {
noLongerExplicitlyApproved = true;
message.append(
String.format(
"By removing the %s vote the following files are no longer explicitly code-owner"
+ " approved by %s:\n",
newVote.label(), AccountTemplateUtil.getAccountTemplate(user.getAccountId())));
} else {
message.append(
String.format(
"By removing the %s vote the following files are no longer code-owner approved"
+ " by %s:\n",
newVote.label(), AccountTemplateUtil.getAccountTemplate(user.getAccountId())));
}
} else {
if (hasImplicitApprovalByUser) {
noLongerExplicitlyApproved = true;
message.append(
String.format(
"By voting %s the following files are no longer explicitly code-owner approved by"
+ " %s:\n",
newVote, AccountTemplateUtil.getAccountTemplate(user.getAccountId())));
} else {
message.append(
String.format(
"By voting %s the following files are no longer code-owner approved by %s:\n",
newVote, AccountTemplateUtil.getAccountTemplate(user.getAccountId())));
}
}
} else if (isCodeOwnerApprovalUpOrDowngraded(requiredApproval, oldApprovals, newVote)) {
if (hasImplicitApprovalByUser) {
message.append(
String.format(
"By voting %s the following files are still explicitly code-owner approved by"
+ " %s:\n",
newVote, AccountTemplateUtil.getAccountTemplate(user.getAccountId())));
} else {
message.append(
String.format(
"By voting %s the following files are still code-owner approved by %s:\n",
newVote, AccountTemplateUtil.getAccountTemplate(user.getAccountId())));
}
} else {
// non-approval was downgraded (e.g. -1 to -2)
return Optional.empty();
}
if (ownedPaths.size() <= limit) {
appendPaths(message, ownedPaths.stream());
} else {
appendPaths(message, ownedPaths.stream().limit(limit));
message.append("(more files)\n");
}
if (hasImplicitApprovalByUser && noLongerExplicitlyApproved) {
message.append(
String.format(
"\nThe listed files are still implicitly approved by %s.\n",
AccountTemplateUtil.getAccountTemplate(user.getAccountId())));
}
return Optional.of(message.toString());
}