TestRepository: Allow setting explicit Change-Id

This includes both leaving existing Change-Ids alone (as, for example
Gerrit's commit-msg hook does) and programmatically setting a value.

Change-Id: Iaaffb0107ae27de24df1f0e95a8d628fb8ea5364
This commit is contained in:
Dave Borowitz 2015-03-12 12:14:47 -07:00
parent 6ed07f5cb5
commit 8b6f9ace15
2 changed files with 33 additions and 9 deletions

View File

@ -875,7 +875,7 @@ public class CommitBuilder {
private PersonIdent author; private PersonIdent author;
private PersonIdent committer; private PersonIdent committer;
private boolean insertChangeId; private String changeId;
private boolean updateCommitterTime; private boolean updateCommitterTime;
@ -1002,7 +1002,14 @@ public PersonIdent committer() {
} }
public CommitBuilder insertChangeId() { public CommitBuilder insertChangeId() {
insertChangeId = true; changeId = "";
return this;
}
public CommitBuilder insertChangeId(String c) {
// Validate, but store as a string so we can use "" as a sentinel.
ObjectId.fromString(c);
changeId = c;
return this; return this;
} }
@ -1029,8 +1036,7 @@ public RevCommit create() throws Exception {
c.setTreeId(topLevelTree); c.setTreeId(topLevelTree);
else else
c.setTreeId(tree.writeTree(ins)); c.setTreeId(tree.writeTree(ins));
if (insertChangeId) insertChangeId(c);
insertChangeId(c);
c.setMessage(message); c.setMessage(message);
commitId = ins.insert(c); commitId = ins.insert(c);
ins.flush(); ins.flush();
@ -1045,6 +1051,8 @@ public RevCommit create() throws Exception {
private void insertChangeId(org.eclipse.jgit.lib.CommitBuilder c) private void insertChangeId(org.eclipse.jgit.lib.CommitBuilder c)
throws IOException { throws IOException {
if (changeId == null)
return;
int idx = ChangeIdUtil.indexOfChangeId(message, "\n"); int idx = ChangeIdUtil.indexOfChangeId(message, "\n");
if (idx >= 0) if (idx >= 0)
return; return;
@ -1052,13 +1060,18 @@ private void insertChangeId(org.eclipse.jgit.lib.CommitBuilder c)
ObjectId firstParentId = null; ObjectId firstParentId = null;
if (!parents.isEmpty()) if (!parents.isEmpty())
firstParentId = parents.get(0); firstParentId = parents.get(0);
ObjectId changeId = ChangeIdUtil.computeChangeId(c.getTreeId(),
firstParentId, c.getAuthor(), c.getCommitter(), message); ObjectId cid;
message = ChangeIdUtil.insertId(message, changeId); if (changeId.equals(""))
if (changeId != null) cid = ChangeIdUtil.computeChangeId(c.getTreeId(), firstParentId,
c.getAuthor(), c.getCommitter(), message);
else
cid = ObjectId.fromString(changeId);
message = ChangeIdUtil.insertId(message, cid);
if (cid != null)
message = message.replaceAll("\nChange-Id: I" //$NON-NLS-1$ message = message.replaceAll("\nChange-Id: I" //$NON-NLS-1$
+ ObjectId.zeroId().getName() + "\n", "\nChange-Id: I" //$NON-NLS-1$ //$NON-NLS-2$ + ObjectId.zeroId().getName() + "\n", "\nChange-Id: I" //$NON-NLS-1$ //$NON-NLS-2$
+ changeId.getName() + "\n"); //$NON-NLS-1$ + cid.getName() + "\n"); //$NON-NLS-1$
} }
public CommitBuilder child() throws Exception { public CommitBuilder child() throws Exception {

View File

@ -112,6 +112,17 @@ public void insertChangeIdIgnoresExisting() throws Exception {
assertEquals(msg, c.getFullMessage()); assertEquals(msg, c.getFullMessage());
} }
@Test
public void insertExplicitChangeId() throws Exception {
RevCommit c = tr.commit().message("message")
.insertChangeId("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")
.create();
rw.parseBody(c);
assertEquals("message\n\n"
+ "Change-Id: Ideadbeefdeadbeefdeadbeefdeadbeefdeadbeef\n"
, c.getFullMessage());
}
@Test @Test
public void resetFromSymref() throws Exception { public void resetFromSymref() throws Exception {
repo.updateRef("HEAD").link("refs/heads/master"); repo.updateRef("HEAD").link("refs/heads/master");