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.PushOneCommit;
|
||||||
import com.google.gerrit.acceptance.RestResponse;
|
import com.google.gerrit.acceptance.RestResponse;
|
||||||
import com.google.gerrit.acceptance.RestSession;
|
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.EditInfo;
|
||||||
|
import com.google.gerrit.extensions.common.ListChangesOption;
|
||||||
import com.google.gerrit.extensions.restapi.BinaryResult;
|
import com.google.gerrit.extensions.restapi.BinaryResult;
|
||||||
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
|
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
|
||||||
import com.google.gerrit.reviewdb.client.Change;
|
import com.google.gerrit.reviewdb.client.Change;
|
||||||
@@ -234,6 +236,38 @@ public class ChangeEditIT extends AbstractDaemonTest {
|
|||||||
assertThat(edit.isPresent()).isFalse();
|
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
|
@Test
|
||||||
public void retrieveEdit() throws Exception {
|
public void retrieveEdit() throws Exception {
|
||||||
RestResponse r = adminSession.get(urlEdit());
|
RestResponse r = adminSession.get(urlEdit());
|
||||||
|
@@ -15,10 +15,12 @@
|
|||||||
package com.google.gerrit.server.edit;
|
package com.google.gerrit.server.edit;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
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.editRefName;
|
||||||
import static com.google.gerrit.server.edit.ChangeEditUtil.editRefPrefix;
|
import static com.google.gerrit.server.edit.ChangeEditUtil.editRefPrefix;
|
||||||
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
|
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
import com.google.common.io.ByteStreams;
|
import com.google.common.io.ByteStreams;
|
||||||
import com.google.gerrit.common.Nullable;
|
import com.google.gerrit.common.Nullable;
|
||||||
import com.google.gerrit.common.TimeUtil;
|
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.
|
* Modify file in existing change edit from its base commit.
|
||||||
*
|
*
|
||||||
@@ -322,12 +373,19 @@ public class ChangeEditModifier {
|
|||||||
|
|
||||||
private ObjectId createCommit(IdentifiedUser me, ObjectInserter inserter,
|
private ObjectId createCommit(IdentifiedUser me, ObjectInserter inserter,
|
||||||
RevCommit prevEdit, RevCommit base, ObjectId tree) throws IOException {
|
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();
|
CommitBuilder builder = new CommitBuilder();
|
||||||
builder.setTreeId(tree);
|
builder.setTreeId(tree);
|
||||||
builder.setParentIds(base);
|
builder.setParentIds(base);
|
||||||
builder.setAuthor(prevEdit.getAuthorIdent());
|
builder.setAuthor(prevEdit.getAuthorIdent());
|
||||||
builder.setCommitter(getCommitterIdent(me));
|
builder.setCommitter(getCommitterIdent(me));
|
||||||
builder.setMessage(prevEdit.getFullMessage());
|
builder.setMessage(msg);
|
||||||
return inserter.insert(builder);
|
return inserter.insert(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -224,8 +224,9 @@ public class ChangeEditUtil {
|
|||||||
throws IOException, ResourceConflictException {
|
throws IOException, ResourceConflictException {
|
||||||
RevCommit parent = rw.parseCommit(ObjectId.fromString(
|
RevCommit parent = rw.parseCommit(ObjectId.fromString(
|
||||||
basePatchSet.getRevision().get()));
|
basePatchSet.getRevision().get()));
|
||||||
if (parent.getTree().equals(edit.getTree())) {
|
if (parent.getTree().equals(edit.getTree())
|
||||||
throw new ResourceConflictException("identical tree");
|
&& edit.getFullMessage().equals(parent.getFullMessage())) {
|
||||||
|
throw new ResourceConflictException("identical tree and message");
|
||||||
}
|
}
|
||||||
return writeSquashedCommit(rw, inserter, parent, edit);
|
return writeSquashedCommit(rw, inserter, parent, edit);
|
||||||
}
|
}
|
||||||
@@ -278,7 +279,7 @@ public class ChangeEditUtil {
|
|||||||
mergeCommit.addParentId(parent.getParent(i));
|
mergeCommit.addParentId(parent.getParent(i));
|
||||||
}
|
}
|
||||||
mergeCommit.setAuthor(parent.getAuthorIdent());
|
mergeCommit.setAuthor(parent.getAuthorIdent());
|
||||||
mergeCommit.setMessage(parent.getFullMessage());
|
mergeCommit.setMessage(edit.getFullMessage());
|
||||||
mergeCommit.setCommitter(edit.getCommitterIdent());
|
mergeCommit.setCommitter(edit.getCommitterIdent());
|
||||||
mergeCommit.setTreeId(edit.getTree());
|
mergeCommit.setTreeId(edit.getTree());
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user