Allow to amend a commit with CommitCommand

Bug: 339088
Change-Id: I57dc727688c4bb6968ac076b176661c857c05afa
Signed-off-by: Chris Aniszczyk <caniszczyk@gmail.com>
This commit is contained in:
Tomasz Zarna 2011-03-07 16:33:53 +01:00 committed by Chris Aniszczyk
parent 440d7f4127
commit cda64073fd
2 changed files with 43 additions and 2 deletions

View File

@ -238,4 +238,21 @@ public void testCommitRange() throws NoHeadException, NoMessageException,
}
assertEquals(l, -1);
}
@Test
public void testCommitAmend() throws NoHeadException, NoMessageException,
UnmergedPathException, ConcurrentRefUpdateException,
JGitInternalException, WrongRepositoryStateException {
Git git = new Git(db);
git.commit().setMessage("first comit").call(); // typo
git.commit().setAmend(true).setMessage("first commit").call();
Iterable<RevCommit> commits = git.log().call();
int c = 0;
for (RevCommit commit : commits) {
assertEquals("first commit", commit.getFullMessage());
c++;
}
assertEquals(1, c);
}
}

View File

@ -87,6 +87,8 @@ public class CommitCommand extends GitCommand<RevCommit> {
private boolean all;
private boolean amend;
/**
* parents this commit should have. The current HEAD will be in this list
* and also all commits mentioned in .git/MERGE_HEAD
@ -155,7 +157,15 @@ public RevCommit call() throws NoHeadException, NoMessageException,
// determine the current HEAD and the commit it is referring to
ObjectId headId = repo.resolve(Constants.HEAD + "^{commit}");
if (headId != null)
parents.add(0, headId);
if (amend) {
RevCommit previousCommit = new RevWalk(repo)
.parseCommit(headId);
RevCommit[] p = previousCommit.getParents();
for (int i = 0; i < p.length; i++)
parents.add(0, p[i].getId());
} else {
parents.add(0, headId);
}
// lock the index
DirCache index = repo.lockDirCache();
@ -187,9 +197,10 @@ public RevCommit call() throws NoHeadException, NoMessageException,
+ revCommit.getShortMessage(), false);
ru.setExpectedOldObjectId(headId);
Result rc = ru.update();
Result rc = ru.forceUpdate();
switch (rc) {
case NEW:
case FORCED:
case FAST_FORWARD: {
setCallable(false);
if (state == RepositoryState.MERGING_RESOLVED) {
@ -387,4 +398,17 @@ public CommitCommand setAll(boolean all) {
return this;
}
/**
* Used to amend the tip of the current branch. If set to true, the previous
* commit will be amended. This is equivalent to --amend on the command
* line.
*
* @param amend
* @return {@code this}
*/
public CommitCommand setAmend(boolean amend) {
this.amend = amend;
return this;
}
}