in java/com/google/gerrit/server/notedb/CommitRewriter.java [881:1064]
private Optional<String> fixedCommitMessage(RevCommit revCommit, ChangeFixProgress fixProgress)
throws ConfigInvalidException {
byte[] raw = revCommit.getRawBuffer();
Charset enc = RawParseUtils.parseEncoding(raw);
Optional<CommitMessageRange> commitMessageRange =
ChangeNoteUtil.parseCommitMessageRange(revCommit);
if (!commitMessageRange.isPresent()) {
throw new ConfigInvalidException("Failed to parse commit message " + revCommit.getName());
}
String changeSubject =
RawParseUtils.decode(
enc,
raw,
commitMessageRange.get().subjectStart(),
commitMessageRange.get().subjectEnd());
Optional<String> fixedChangeMessage = Optional.empty();
String originalChangeMessage = null;
if (commitMessageRange.isPresent() && commitMessageRange.get().hasChangeMessage()) {
originalChangeMessage =
RawParseUtils.decode(
enc,
raw,
commitMessageRange.get().changeMessageStart(),
commitMessageRange.get().changeMessageEnd() + 1)
.trim();
}
List<FooterLine> footerLines = revCommit.getFooterLines();
StringBuilder footerLinesBuilder = new StringBuilder();
boolean anyFootersFixed = false;
for (FooterLine fl : footerLines) {
String footerKey = fl.getKey();
String footerValue = fl.getValue();
if (footerKey.equalsIgnoreCase(FOOTER_TAG.getName())) {
fixProgress.tag = footerValue;
} else if (footerKey.equalsIgnoreCase(FOOTER_ASSIGNEE.getName())) {
Account.Id oldAssignee = fixProgress.assigneeId;
FixIdentResult fixedAssignee = null;
if (footerValue.equals("")) {
fixProgress.assigneeId = null;
} else {
fixedAssignee = getFixedIdentString(fixProgress, footerValue);
fixProgress.assigneeId = fixedAssignee.accountId;
}
if (!fixedChangeMessage.isPresent()) {
fixedChangeMessage =
fixAssigneeChangeMessage(
fixProgress,
Optional.ofNullable(oldAssignee),
Optional.ofNullable(fixProgress.assigneeId),
originalChangeMessage);
}
if (fixedAssignee != null && fixedAssignee.fixedIdentString.isPresent()) {
addFooter(footerLinesBuilder, footerKey, fixedAssignee.fixedIdentString.get());
anyFootersFixed = true;
continue;
}
} else if (Arrays.stream(ReviewerStateInternal.values())
.anyMatch(state -> footerKey.equalsIgnoreCase(state.getFooterKey().getName()))) {
if (!fixedChangeMessage.isPresent()) {
fixedChangeMessage = fixReviewerChangeMessage(originalChangeMessage);
}
FixIdentResult fixedReviewer = getFixedIdentString(fixProgress, footerValue);
if (fixedReviewer.fixedIdentString.isPresent()) {
addFooter(footerLinesBuilder, footerKey, fixedReviewer.fixedIdentString.get());
anyFootersFixed = true;
continue;
}
} else if (footerKey.equalsIgnoreCase(FOOTER_REAL_USER.getName())) {
FixIdentResult fixedRealUser = getFixedIdentString(fixProgress, footerValue);
if (fixedRealUser.fixedIdentString.isPresent()) {
addFooter(footerLinesBuilder, footerKey, fixedRealUser.fixedIdentString.get());
anyFootersFixed = true;
continue;
}
} else if (footerKey.equalsIgnoreCase(FOOTER_LABEL.getName())) {
int uuidStart = footerValue.indexOf(", ");
int voterIdentStart = footerValue.indexOf(' ', uuidStart != -1 ? uuidStart + 2 : 0);
FixIdentResult fixedVoter = null;
if (voterIdentStart > 0) {
String originalIdentString = footerValue.substring(voterIdentStart + 1);
fixedVoter = getFixedIdentString(fixProgress, originalIdentString);
}
if (!fixedChangeMessage.isPresent()) {
fixedChangeMessage =
fixRemoveVoteChangeMessage(
fixProgress,
fixedVoter == null
? fixProgress.updateAuthorId
: Optional.of(fixedVoter.accountId),
originalChangeMessage);
}
if (fixedVoter != null && fixedVoter.fixedIdentString.isPresent()) {
String fixedLabelVote =
footerValue.substring(0, voterIdentStart) + " " + fixedVoter.fixedIdentString.get();
addFooter(footerLinesBuilder, footerKey, fixedLabelVote);
anyFootersFixed = true;
continue;
}
} else if (footerKey.equalsIgnoreCase(FOOTER_SUBMITTED_WITH.getName())) {
// Record format:
// Submitted-with: OK
// Submitted-with: OK: Code-Review: User Name <accountId@serverId>
int voterIdentStart = StringUtils.ordinalIndexOf(footerValue, ": ", 2);
if (voterIdentStart >= 0) {
String originalIdentString = footerValue.substring(voterIdentStart + 2);
FixIdentResult fixedVoter = getFixedIdentString(fixProgress, originalIdentString);
if (fixedVoter.fixedIdentString.isPresent()) {
String fixedLabelVote =
footerValue.substring(0, voterIdentStart)
+ ": "
+ fixedVoter.fixedIdentString.get();
addFooter(footerLinesBuilder, footerKey, fixedLabelVote);
anyFootersFixed = true;
continue;
}
}
} else if (footerKey.equalsIgnoreCase(FOOTER_ATTENTION.getName())) {
AttentionStatusInNoteDb originalAttentionSetUpdate =
gson.fromJson(footerValue, AttentionStatusInNoteDb.class);
FixIdentResult fixedAttentionAccount =
getFixedIdentString(fixProgress, originalAttentionSetUpdate.personIdent);
Optional<String> fixedReason = fixAttentionSetReason(originalAttentionSetUpdate.reason);
if (fixedAttentionAccount.fixedIdentString.isPresent() || fixedReason.isPresent()) {
AttentionStatusInNoteDb fixedAttentionSetUpdate =
new AttentionStatusInNoteDb(
fixedAttentionAccount.fixedIdentString.isPresent()
? fixedAttentionAccount.fixedIdentString.get()
: originalAttentionSetUpdate.personIdent,
originalAttentionSetUpdate.operation,
fixedReason.isPresent() ? fixedReason.get() : originalAttentionSetUpdate.reason);
addFooter(footerLinesBuilder, footerKey, gson.toJson(fixedAttentionSetUpdate));
anyFootersFixed = true;
continue;
}
}
addFooter(footerLinesBuilder, footerKey, footerValue);
}
// Some of the old commits are missing corresponding footers but still have change messages that
// need the fix. For such cases, try to guess or replace with the default string (see
// getPossibleAccountReplacement)
if (!fixedChangeMessage.isPresent()) {
fixedChangeMessage = fixReviewerChangeMessage(originalChangeMessage);
}
if (!fixedChangeMessage.isPresent()) {
fixedChangeMessage = fixRemoveVotesChangeMessage(fixProgress, originalChangeMessage);
}
if (!fixedChangeMessage.isPresent()) {
fixedChangeMessage =
fixRemoveVoteChangeMessage(fixProgress, Optional.empty(), originalChangeMessage);
}
if (!fixedChangeMessage.isPresent()) {
fixedChangeMessage =
fixAssigneeChangeMessage(
fixProgress, Optional.empty(), Optional.empty(), originalChangeMessage);
}
if (!fixedChangeMessage.isPresent()) {
fixedChangeMessage = fixSubmitChangeMessage(originalChangeMessage);
}
if (!fixedChangeMessage.isPresent()) {
fixedChangeMessage = fixDeleteChangeMessageCommitMessage(originalChangeMessage);
}
if (!fixedChangeMessage.isPresent()) {
fixedChangeMessage =
fixCodeOwnersOnReviewChangeMessage(fixProgress.updateAuthorId, originalChangeMessage);
}
if (!fixedChangeMessage.isPresent()
&& Objects.equals(fixProgress.tag, CODE_OWNER_ADD_REVIEWER_TAG)) {
fixedChangeMessage =
fixCodeOwnersOnAddReviewerChangeMessage(fixProgress, originalChangeMessage);
}
if (!anyFootersFixed && !fixedChangeMessage.isPresent()) {
return Optional.empty();
}
StringBuilder fixedCommitBuilder = new StringBuilder();
fixedCommitBuilder.append(changeSubject);
fixedCommitBuilder.append("\n\n");
if (commitMessageRange.get().hasChangeMessage()) {
fixedCommitBuilder.append(fixedChangeMessage.orElse(originalChangeMessage));
fixedCommitBuilder.append("\n\n");
}
fixedCommitBuilder.append(footerLinesBuilder);
return Optional.of(fixedCommitBuilder.toString());
}