diff options
author | Ville Suomala <ville.suomala@systencess.fi> | 2020-02-14 15:04:09 +0200 |
---|---|---|
committer | Jukka Jokiniva <jukka.jokiniva@qt.io> | 2020-02-20 16:51:42 +0000 |
commit | 00a1b53ea4aa362a758e381ea7b4134cf3e23fab (patch) | |
tree | 04ec2fd2c05b3d435170e8f1b0d73d8d4be04443 | |
parent | 731ba877dde5bed3481b28d3cb24de436f1eea04 (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.java | 8 | ||||
-rw-r--r-- | src/test/java/com/googlesource/gerrit/plugins/qtcodereview/QtCommandBuildApproveIT.java | 33 |
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(); |