InlineEdit: Add support for changing commit message

Change-Id: I27fe806d699e2980f2e7eab07617df17edcb4b13
This commit is contained in:
David Ostrovsky
2014-10-24 08:56:30 +02:00
committed by David Pursehouse
parent 60f1e45bd0
commit d678da1ea7
3 changed files with 97 additions and 4 deletions

View File

@@ -30,7 +30,9 @@ import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.acceptance.RestSession;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.EditInfo;
import com.google.gerrit.extensions.common.ListChangesOption;
import com.google.gerrit.extensions.restapi.BinaryResult;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.reviewdb.client.Change;
@@ -234,6 +236,38 @@ public class ChangeEditIT extends AbstractDaemonTest {
assertThat(edit.isPresent()).isFalse();
}
@Test
public void updateMessage() throws Exception {
assertThat(modifier.createEdit(change, getCurrentPatchSet(changeId)))
.isEqualTo(RefUpdate.Result.NEW);
Optional<ChangeEdit> edit = editUtil.byChange(change);
try {
modifier.modifyMessage(
edit.get(),
edit.get().getEditCommit().getFullMessage());
fail("InvalidChangeOperationException expected");
} catch (InvalidChangeOperationException ex) {
assertThat(ex.getMessage()).isEqualTo(
"New commit message cannot be same as existing commit message");
}
String msg = String.format("New commit message\n\nChange-Id: %s",
change.getKey());
assertThat(modifier.modifyMessage(edit.get(), msg)).isEqualTo(
RefUpdate.Result.FORCED);
edit = editUtil.byChange(change);
assertThat(edit.get().getEditCommit().getFullMessage()).isEqualTo(msg);
editUtil.publish(edit.get());
assertThat(editUtil.byChange(change).isPresent()).isFalse();
ChangeInfo info = get(changeId, ListChangesOption.CURRENT_COMMIT,
ListChangesOption.CURRENT_REVISION);
assertThat(info.revisions.get(info.currentRevision).commit.message)
.isEqualTo(msg);
}
@Test
public void retrieveEdit() throws Exception {
RestResponse r = adminSession.get(urlEdit());

View File

@@ -15,10 +15,12 @@
package com.google.gerrit.server.edit;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.gerrit.server.edit.ChangeEditUtil.editRefName;
import static com.google.gerrit.server.edit.ChangeEditUtil.editRefPrefix;
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
import com.google.common.base.Strings;
import com.google.common.io.ByteStreams;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.TimeUtil;
@@ -216,6 +218,55 @@ public class ChangeEditModifier {
}
}
/**
* Modify commit message in existing change edit.
*
* @param edit change edit
* @param msg new commit message
* @return result
* @throws AuthException
* @throws InvalidChangeOperationException
* @throws IOException
*/
public RefUpdate.Result modifyMessage(ChangeEdit edit, String msg)
throws AuthException, InvalidChangeOperationException, IOException {
checkState(!Strings.isNullOrEmpty(msg), "message cannot be null");
if (!currentUser.get().isIdentifiedUser()) {
throw new AuthException("Authentication required");
}
RevCommit prevEdit = edit.getEditCommit();
if (prevEdit.getParentCount() == 0) {
throw new InvalidChangeOperationException(
"Modify edit against root commit not supported");
}
if (prevEdit.getFullMessage().equals(msg)) {
throw new InvalidChangeOperationException(
"New commit message cannot be same as existing commit message");
}
IdentifiedUser me = (IdentifiedUser) currentUser.get();
Repository repo = gitManager.openRepository(edit.getChange().getProject());
try {
RevWalk rw = new RevWalk(repo);
ObjectInserter inserter = repo.newObjectInserter();
try {
String refName = edit.getRefName();
ObjectId commit = createCommit(me, inserter, prevEdit,
rw.parseCommit(prevEdit.getParent(0)),
prevEdit.getTree(),
msg);
inserter.flush();
return update(repo, me, refName, rw, prevEdit, commit);
} finally {
rw.release();
inserter.release();
}
} finally {
repo.close();
}
}
/**
* Modify file in existing change edit from its base commit.
*
@@ -322,12 +373,19 @@ public class ChangeEditModifier {
private ObjectId createCommit(IdentifiedUser me, ObjectInserter inserter,
RevCommit prevEdit, RevCommit base, ObjectId tree) throws IOException {
return createCommit(me, inserter, prevEdit, base, tree,
prevEdit.getFullMessage());
}
private ObjectId createCommit(IdentifiedUser me, ObjectInserter inserter,
RevCommit prevEdit, RevCommit base, ObjectId tree, String msg)
throws IOException {
CommitBuilder builder = new CommitBuilder();
builder.setTreeId(tree);
builder.setParentIds(base);
builder.setAuthor(prevEdit.getAuthorIdent());
builder.setCommitter(getCommitterIdent(me));
builder.setMessage(prevEdit.getFullMessage());
builder.setMessage(msg);
return inserter.insert(builder);
}

View File

@@ -224,8 +224,9 @@ public class ChangeEditUtil {
throws IOException, ResourceConflictException {
RevCommit parent = rw.parseCommit(ObjectId.fromString(
basePatchSet.getRevision().get()));
if (parent.getTree().equals(edit.getTree())) {
throw new ResourceConflictException("identical tree");
if (parent.getTree().equals(edit.getTree())
&& edit.getFullMessage().equals(parent.getFullMessage())) {
throw new ResourceConflictException("identical tree and message");
}
return writeSquashedCommit(rw, inserter, parent, edit);
}
@@ -278,7 +279,7 @@ public class ChangeEditUtil {
mergeCommit.addParentId(parent.getParent(i));
}
mergeCommit.setAuthor(parent.getAuthorIdent());
mergeCommit.setMessage(parent.getFullMessage());
mergeCommit.setMessage(edit.getFullMessage());
mergeCommit.setCommitter(edit.getCommitterIdent());
mergeCommit.setTreeId(edit.getTree());