Fix %base option and "Create a new change for..." setting
Check if the pre-existing ref is a PatchSet of a change with a different target branch than current push if newChangeForAllNotInTarget == true or %base option is set and create a new change for the new target. Don't add the commits about to get merged to alreadyAccepted. Else if a commit C is merged into branch A and you upload a new change with the same commit to branch B, with the %base option or if "Create a new change for every commit not in the target branch:" is configured for the project, MergeOp will merge the commit into branch B, but MergeUtil will not mark the status as "CLEAN_MERGE". The result is that you get a "Change is new" error message, and in order to merge the change you will need to upload a new PatchSet and merge that on top of commit C. Bug: Issue 3426 Change-Id: I01f4b9b04f1797d403671b27b8c2e61d1fd3bcc6
This commit is contained in:

committed by
David Pursehouse

parent
f79ac18f20
commit
9775399ea2
@@ -33,6 +33,7 @@ import com.google.gerrit.extensions.common.EditInfo;
|
||||
import com.google.gerrit.extensions.common.LabelInfo;
|
||||
import com.google.gerrit.reviewdb.client.Change;
|
||||
import com.google.gerrit.testutil.TestTimeUtil;
|
||||
import com.google.gerrit.server.git.ProjectConfig;
|
||||
|
||||
import org.eclipse.jgit.revwalk.RevCommit;
|
||||
import org.eclipse.jgit.transport.PushResult;
|
||||
@@ -378,6 +379,34 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
|
||||
"not Signed-off-by author/committer/uploader in commit message footer");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateNewChangeForAllNotInTarget() throws Exception {
|
||||
ProjectConfig config = projectCache.checkedGet(project).getConfig();
|
||||
config.getProject().setCreateNewChangeForAllNotInTarget(InheritableBoolean.TRUE);
|
||||
saveProjectConfig(project, config);
|
||||
|
||||
PushOneCommit push =
|
||||
pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT,
|
||||
"a.txt", "content");
|
||||
PushOneCommit.Result r = push.to("refs/for/master");
|
||||
r.assertOkStatus();
|
||||
|
||||
push =
|
||||
pushFactory.create(db, admin.getIdent(), testRepo, PushOneCommit.SUBJECT,
|
||||
"b.txt", "anotherContent");
|
||||
r = push.to("refs/for/master");
|
||||
r.assertOkStatus();
|
||||
|
||||
gApi.projects()
|
||||
.name(project.get())
|
||||
.branch("otherBranch")
|
||||
.create(new BranchInput());
|
||||
|
||||
PushOneCommit.Result r2 = push.to("refs/for/otherBranch");
|
||||
r2.assertOkStatus();
|
||||
assertTwoChangesWithSameRevision(r);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPushSameCommitTwiceUsingMagicBranchBaseOption()
|
||||
throws Exception {
|
||||
@@ -401,7 +430,12 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
|
||||
testRepo, "refs/for/foo%base=" + rBase.getCommitId().name(), false, false);
|
||||
assertThat(pr.getMessages()).contains("changes: new: 1, refs: 1, done");
|
||||
|
||||
List<ChangeInfo> changes = query(r.getCommitId().name());
|
||||
assertTwoChangesWithSameRevision(r);
|
||||
}
|
||||
|
||||
private void assertTwoChangesWithSameRevision(PushOneCommit.Result result)
|
||||
throws Exception {
|
||||
List<ChangeInfo> changes = query(result.getCommitId().name());
|
||||
assertThat(changes).hasSize(2);
|
||||
ChangeInfo c1 = get(changes.get(0).id);
|
||||
ChangeInfo c2 = get(changes.get(1).id);
|
||||
|
Reference in New Issue
Block a user