Merge "ReceiveCommits: Fix set comparison to avoid no-op group updates"
This commit is contained in:
		@@ -27,6 +27,7 @@ import com.google.gerrit.common.TimeUtil;
 | 
			
		||||
import com.google.gerrit.extensions.common.CommitInfo;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.Change;
 | 
			
		||||
import com.google.gerrit.reviewdb.client.PatchSet;
 | 
			
		||||
import com.google.gerrit.server.change.ChangesCollection;
 | 
			
		||||
import com.google.gerrit.server.change.GetRelated.ChangeAndCommit;
 | 
			
		||||
import com.google.gerrit.server.change.GetRelated.RelatedInfo;
 | 
			
		||||
import com.google.gerrit.server.edit.ChangeEditModifier;
 | 
			
		||||
@@ -71,6 +72,9 @@ public class GetRelatedIT extends AbstractDaemonTest {
 | 
			
		||||
  @Inject
 | 
			
		||||
  private BatchUpdate.Factory updateFactory;
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  private ChangesCollection changes;
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void getRelatedNoResult() throws Exception {
 | 
			
		||||
    PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo);
 | 
			
		||||
@@ -99,6 +103,38 @@ public class GetRelatedIT extends AbstractDaemonTest {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void getRelatedLinearSeparatePushes() throws Exception {
 | 
			
		||||
    // 1,1---2,1
 | 
			
		||||
    RevCommit c1_1 = commitBuilder()
 | 
			
		||||
        .add("a.txt", "1")
 | 
			
		||||
        .message("subject: 1")
 | 
			
		||||
        .create();
 | 
			
		||||
    RevCommit c2_1 = commitBuilder()
 | 
			
		||||
        .add("b.txt", "2")
 | 
			
		||||
        .message("subject: 2")
 | 
			
		||||
        .create();
 | 
			
		||||
 | 
			
		||||
    testRepo.reset(c1_1);
 | 
			
		||||
    pushHead(testRepo, "refs/for/master", false);
 | 
			
		||||
    PatchSet.Id ps1_1 = getPatchSetId(c1_1);
 | 
			
		||||
    String oldETag = changes.parse(ps1_1.getParentKey()).getETag();
 | 
			
		||||
 | 
			
		||||
    testRepo.reset(c2_1);
 | 
			
		||||
    pushHead(testRepo, "refs/for/master", false);
 | 
			
		||||
    PatchSet.Id ps2_1 = getPatchSetId(c2_1);
 | 
			
		||||
 | 
			
		||||
    // Push of change 2 should not affect groups (or anything else) of change 1.
 | 
			
		||||
    assertThat(changes.parse(ps1_1.getParentKey()).getETag())
 | 
			
		||||
        .isEqualTo(oldETag);
 | 
			
		||||
 | 
			
		||||
    for (PatchSet.Id ps : ImmutableList.of(ps2_1, ps1_1)) {
 | 
			
		||||
      assertRelated(ps,
 | 
			
		||||
          changeAndCommit(ps2_1, c2_1, 1),
 | 
			
		||||
          changeAndCommit(ps1_1, c1_1, 1));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void getRelatedReorder() throws Exception {
 | 
			
		||||
    // 1,1---2,1
 | 
			
		||||
 
 | 
			
		||||
@@ -2448,7 +2448,7 @@ public class ReceiveCommits {
 | 
			
		||||
              if (groups == null) {
 | 
			
		||||
                return false;
 | 
			
		||||
              }
 | 
			
		||||
            } else if (Sets.newHashSet(oldGroups).equals(groups)) {
 | 
			
		||||
            } else if (sameGroups(oldGroups, groups)) {
 | 
			
		||||
              return false;
 | 
			
		||||
            }
 | 
			
		||||
            psUtil.setGroups(ctx.getDb(), ctx.getUpdate(psId), ps, groups);
 | 
			
		||||
@@ -2459,6 +2459,10 @@ public class ReceiveCommits {
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean sameGroups(List<String> a, List<String> b) {
 | 
			
		||||
      return Sets.newHashSet(a).equals(Sets.newHashSet(b));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    CheckedFuture<Void, RestApiException> updateGroups() {
 | 
			
		||||
      final Thread caller = Thread.currentThread();
 | 
			
		||||
      ListenableFuture<Void> future = changeUpdateExector.submit(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user