Simplify submission for single changes
When submitting a single change, do not use the Gerrit API and Lucene
associated searches for avoiding involved misbehavior due to async
index updates.
The logic is simple: just merge the change. No additional complexity and
API calls are needed.
Change-Id: Ie80cfa63547f62164d3bc1fd35d0fc20f9fdc680
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
index 00604e4..0d59513 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
@@ -133,10 +133,11 @@
* @throws OrmException
* @throws IOException
*/
- public void mergeReview(ChangeInfo info) throws RestApiException, NoSuchChangeException, OrmException, IOException {
+ public void mergeReview(String project, int changeNumber)
+ throws RestApiException, NoSuchChangeException, OrmException, IOException {
final SubmitInput input = new SubmitInput();
input.waitForMerge = true;
- final RevisionResource r = getRevisionResource(info.project, info._number);
+ final RevisionResource r = getRevisionResource(project, changeNumber);
submitter.apply(r, input);
}
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
index fbed498..0a2549e 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
@@ -138,8 +138,15 @@
private void autoSubmitIfMergeable(ChangeAttribute change)
throws OrmException, RestApiException, NoSuchChangeException, IOException, UpdateException {
if (atomicityHelper.isSubmittable(change.project, change.number)) {
- log.info(String.format("Change %d is submittable. Will try to merge all related changes.", change.number));
- attemptToMerge(change);
+ if (atomicityHelper.isAtomicReview(change)) {
+ log.info(
+ String.format(
+ "Change %d is submittable. Will try to merge all related changes.", change.number));
+ attemptToMergeAtomic(change);
+ } else {
+ log.info(String.format("Change %d is submittable. Submitting ...", change.number));
+ atomicityHelper.mergeReview(change.project, change.number);
+ }
}
}
@@ -167,15 +174,14 @@
return false;
}
- private void attemptToMerge(ChangeAttribute change) throws RestApiException, OrmException, NoSuchChangeException, IOException, UpdateException {
+ private void attemptToMergeAtomic(ChangeAttribute change)
+ throws RestApiException, OrmException, NoSuchChangeException, IOException, UpdateException {
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)));
- }
+ related.addAll(
+ api.changes()
+ .query("status: open AND topic: " + change.topic)
+ .withOption(ListChangesOption.CURRENT_REVISION)
+ .get());
boolean submittable = true;
boolean mergeable = true;
for (final ChangeInfo info : related) {
@@ -191,10 +197,10 @@
if (mergeable) {
log.debug(String.format("Change %d is mergeable", change.number));
for (final ChangeInfo info : related) {
- atomicityHelper.mergeReview(info);
+ atomicityHelper.mergeReview(info.project, info._number);
}
} else {
- reviewUpdater.commentOnReview(change.project, change.number, AutomergeConfig.CANT_MERGE_COMMENT_FILE);
+ reviewUpdater.commentOnReview(change.project, change.number, AutomergeConfig.CANT_MERGE_COMMENT_FILE);
}
}
}