in src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java [353:432]
private void createDownstreamMerges(MultipleDownstreamMergeInput mdsMergeInput)
throws RestApiException, FailedMergeException, ConfigInvalidException,
InvalidQueryParameterException, StorageException {
try (ManualRequestContext ctx = oneOffRequestContext.openAs(config.getContextUserId())) {
// Map from branch to error message
Map<String, String> failedMergeBranchMap = new TreeMap<>();
List<Integer> existingDownstream;
for (String downstreamBranch : mdsMergeInput.dsBranchMap.keySet()) {
// If there are existing downstream merges, update them
// Otherwise, create them.
boolean createDownstreams = true;
if (mdsMergeInput.obsoleteRevision != null) {
existingDownstream =
getExistingMergesOnBranch(
mdsMergeInput.obsoleteRevision, mdsMergeInput.topic, downstreamBranch);
if (!existingDownstream.isEmpty()) {
log.debug(
"Attempting to update downstream merge of {} on branch {}",
mdsMergeInput.currentRevision,
downstreamBranch);
// existingDownstream should almost always be of length one, but
// it's possible to construct it so that it's not
for (Integer dsChangeNumber : existingDownstream) {
try {
updateDownstreamMerge(
mdsMergeInput.currentRevision,
mdsMergeInput.subject,
dsChangeNumber,
mdsMergeInput.dsBranchMap.get(downstreamBranch),
mdsMergeInput.changeNumber,
downstreamBranch);
createDownstreams = false;
} catch (MergeConflictException e) {
failedMergeBranchMap.put(downstreamBranch, e.getMessage());
log.debug(
"Abandoning existing, obsolete {} due to merge conflict.", dsChangeNumber);
abandonChange(dsChangeNumber);
}
}
}
}
if (createDownstreams) {
log.debug(
"Attempting to create downstream merge of {} on branch {}",
mdsMergeInput.currentRevision,
downstreamBranch);
SingleDownstreamMergeInput sdsMergeInput = new SingleDownstreamMergeInput();
sdsMergeInput.currentRevision = mdsMergeInput.currentRevision;
sdsMergeInput.changeNumber = mdsMergeInput.changeNumber;
sdsMergeInput.project = mdsMergeInput.project;
sdsMergeInput.topic = mdsMergeInput.topic;
sdsMergeInput.subject = mdsMergeInput.subject;
sdsMergeInput.downstreamBranch = downstreamBranch;
sdsMergeInput.doMerge = mdsMergeInput.dsBranchMap.get(downstreamBranch);
try {
createSingleDownstreamMerge(sdsMergeInput);
} catch (MergeConflictException e) {
failedMergeBranchMap.put(downstreamBranch, e.getMessage());
}
}
}
if (!failedMergeBranchMap.isEmpty()) {
String conflictMessage = config.getConflictMessage();
if (mdsMergeInput.project.equals(config.getManifestProject())) {
conflictMessage = config.getManifestConflictMessage();
}
throw new FailedMergeException(
failedMergeBranchMap,
mdsMergeInput.currentRevision,
config.getHostName(),
mdsMergeInput.project,
mdsMergeInput.changeNumber,
mdsMergeInput.patchsetNumber,
conflictMessage,
mdsMergeInput.topic);
}
}
}