in src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java [178:222]
private void attemptToMergeAtomic(Change change) throws Exception {
final List<ChangeInfo> related = Lists.newArrayList();
if (atomicityHelper.isAtomicReview(change)) {
related.addAll(
api.changes()
.query("status: open AND topic: " + change.topic)
.withOption(ListChangesOption.CURRENT_REVISION)
.get());
} else {
ChangeApi changeApi = api.changes().id(change.project, change.branch, change.id);
related.add(changeApi.get(EnumSet.of(ListChangesOption.CURRENT_REVISION)));
}
for (final ChangeInfo info : related) {
if (!atomicityHelper.isSubmittable(info.project, info._number)) {
log.info(
"Change {} is not submittable because same topic change {} has not all approvals.",
change.number,
info._number);
return;
}
}
for (final ChangeInfo info : related) {
boolean dependsOnNonMergedCommit =
atomicityHelper.hasDependentReview(info.project, info._number);
if (!info.mergeable || dependsOnNonMergedCommit) {
log.info(
"Change {} is not mergeable because same topic change {} {}",
change.number,
info._number,
!info.mergeable ? "is non mergeable" : "depends on a non merged commit.");
PluginComment comment =
!info.mergeable ? config.cantMergeGitConflict : config.cantMergeDependsOnNonMerged;
reviewUpdater.commentOnReview(
change.project, change.number, String.format(comment.getContent(), info._number));
return;
}
}
log.info("Submitting atomic change {}...", change.number);
for (final ChangeInfo info : related) {
atomicityHelper.mergeReview(info.project, info._number);
}
}