InlineEdit: Add support for changing commit message
Change-Id: I27fe806d699e2980f2e7eab07617df17edcb4b13
This commit is contained in:

committed by
David Pursehouse

parent
60f1e45bd0
commit
d678da1ea7
@@ -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());
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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());
|
||||
|
||||
|
Reference in New Issue
Block a user