aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Suomala <ville.suomala@systencess.fi>2020-02-14 15:04:09 +0200
committerJukka Jokiniva <jukka.jokiniva@qt.io>2020-02-20 16:51:42 +0000
commit00a1b53ea4aa362a758e381ea7b4134cf3e23fab (patch)
tree04ec2fd2c05b3d435170e8f1b0d73d8d4be04443
parent731ba877dde5bed3481b28d3cb24de436f1eea04 (diff)
Avoid double handling of change(s) on merge of merge
A change was included twice to the batch update. This caused exception on staging approve and changes were left on 'integrating' status. Fixes: QTQAINFRA-3379 Change-Id: I776f942ee54351e1e9478d631a189728d5fbc658 Reviewed-by: Jukka Jokiniva <jukka.jokiniva@qt.io>
-rw-r--r--src/main/java/com/googlesource/gerrit/plugins/qtcodereview/QtUtil.java8
-rw-r--r--src/test/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandBuildApproveIT.java33
2 files changed, 37 insertions, 4 deletions
diff --git a/src/main/java/com/googlesource/gerrit/plugins/qtcodereview/QtUtil.java b/src/main/java/com/googlesource/gerrit/plugins/qtcodereview/QtUtil.java
index cfc827c..f1dba69 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/qtcodereview/QtUtil.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/qtcodereview/QtUtil.java
@@ -40,6 +40,7 @@ import java.io.IOException;
import java.sql.Timestamp;
import java.util.AbstractMap;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -512,8 +513,7 @@ public class QtUtil {
Repository git, final Branch.NameKey branch, final Branch.NameKey destination)
throws IOException, BranchNotFoundException {
- List<Map.Entry<ChangeData, RevCommit>> result =
- new ArrayList<Map.Entry<ChangeData, RevCommit>>();
+ Map<Change.Id, Map.Entry<ChangeData, RevCommit>> map = new HashMap<>();
RevWalk revWalk = new RevWalk(git);
try {
@@ -542,13 +542,13 @@ public class QtUtil {
logger.atWarning().log(
"qtcodereview: commit belongs to multiple changes: %s", commit.name());
ChangeData cd = changes.get(0);
- result.add(new AbstractMap.SimpleEntry<ChangeData, RevCommit>(cd, commit));
+ map.put(cd.getId(), new AbstractMap.SimpleEntry<ChangeData, RevCommit>(cd, commit));
}
}
} finally {
revWalk.dispose();
}
- return result;
+ return new ArrayList<Map.Entry<ChangeData, RevCommit>>(map.values());
}
public static RevCommit merge(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandBuildApproveIT.java b/src/test/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandBuildApproveIT.java
index 2a54303..939ca13 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandBuildApproveIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandBuildApproveIT.java
@@ -131,6 +131,39 @@ public class QtCommandBuildApproveIT extends QtCodeReviewIT {
}
@Test
+ public void avoid_Double_Handling_Of_Change_On_Merge_Of_Merge() throws Exception {
+ // make a change on feature branch
+ final PushOneCommit.Result f1 = pushCommit("feature", "f1-commitmsg", "f1-file", "f1-content");
+ approve(f1.getChangeId());
+ gApi.changes().id(f1.getCommit().getName()).current().submit();
+
+ // make a change on master branch
+ final PushOneCommit.Result m1 = pushCommit("master", "m1-commitmsg", "m1-file", "m1-content");
+ approve(m1.getChangeId());
+
+ // merge feature branch into master
+ final PushOneCommit mm = pushFactory.create(admin.newIdent(), testRepo);
+ mm.setParents(ImmutableList.of(f1.getCommit(), m1.getCommit()));
+ final PushOneCommit.Result m = mm.to("refs/for/master");
+ m.assertOkStatus();
+ approve(m.getChangeId());
+
+ // Stage master branch change
+ QtStage(m1);
+ // Stage merge change
+ QtStage(m);
+
+ // Create build and approve it
+ QtNewBuild("master", "merge-build-000");
+ QtApproveBuild("master", "merge-build-000");
+
+ final Changes changes = gApi.changes();
+ assertThat(changes.id(project.get(), "feature", f1.getChangeId()).get(CURRENT_REVISION).status).isEqualTo(ChangeStatus.MERGED);
+ assertThat(changes.id(project.get(), "master", m1.getChangeId()).get(CURRENT_REVISION).status).isEqualTo(ChangeStatus.MERGED);
+ assertThat(changes.id(project.get(), "master", m.getChangeId()).get(CURRENT_REVISION).status).isEqualTo(ChangeStatus.MERGED);
+ }
+
+ @Test
public void multiChange_New_Staged_Integrating_Failed() throws Exception {
// Push 3 independent commits
RevCommit initialHead = getRemoteHead();