diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitCommandTest.java index 3729387f3..3e73c7598 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/CommitCommandTest.java @@ -48,7 +48,9 @@ import static org.junit.Assert.assertTrue; import java.io.File; +import java.util.Date; import java.util.List; +import java.util.TimeZone; import org.eclipse.jgit.api.errors.WrongRepositoryStateException; import org.eclipse.jgit.diff.DiffEntry; @@ -57,6 +59,7 @@ import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.RefUpdate; import org.eclipse.jgit.lib.RefUpdate.Result; import org.eclipse.jgit.lib.Repository; @@ -427,4 +430,45 @@ public void commitAmendOnInitialShouldFail() throws Exception { Git git = new Git(db); git.commit().setAmend(true).setMessage("initial commit").call(); } + + @Test + public void commitAmendWithoutAuthorShouldSetOriginalAuthorAndAuthorTime() + throws Exception { + Git git = new Git(db); + + writeTrashFile("file1", "file1"); + git.add().addFilepattern("file1").call(); + + final String authorName = "First Author"; + final String authorEmail = "author@example.org"; + final Date authorDate = new Date(1349621117000L); + PersonIdent firstAuthor = new PersonIdent(authorName, authorEmail, + authorDate, TimeZone.getTimeZone("UTC")); + git.commit().setMessage("initial commit").setAuthor(firstAuthor).call(); + + RevCommit amended = git.commit().setAmend(true) + .setMessage("amend commit").call(); + + PersonIdent amendedAuthor = amended.getAuthorIdent(); + assertEquals(authorName, amendedAuthor.getName()); + assertEquals(authorEmail, amendedAuthor.getEmailAddress()); + assertEquals(authorDate.getTime(), amendedAuthor.getWhen().getTime()); + } + + @Test + public void commitAmendWithAuthorShouldUseIt() throws Exception { + Git git = new Git(db); + + writeTrashFile("file1", "file1"); + git.add().addFilepattern("file1").call(); + git.commit().setMessage("initial commit").call(); + + RevCommit amended = git.commit().setAmend(true) + .setAuthor("New Author", "newauthor@example.org") + .setMessage("amend commit").call(); + + PersonIdent amendedAuthor = amended.getAuthorIdent(); + assertEquals("New Author", amendedAuthor.getName()); + assertEquals("newauthor@example.org", amendedAuthor.getEmailAddress()); + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java index 87c282d11..a166790a4 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java @@ -187,6 +187,8 @@ public RevCommit call() throws GitAPIException, NoHeadException, RevCommit[] p = previousCommit.getParents(); for (int i = 0; i < p.length; i++) parents.add(0, p[i].getId()); + if (author == null) + author = previousCommit.getAuthorIdent(); } else { parents.add(0, headId); } @@ -471,7 +473,7 @@ private int lookupOnly(String pathString) { private void processOptions(RepositoryState state) throws NoMessageException { if (committer == null) committer = new PersonIdent(repo); - if (author == null) + if (author == null && !amend) author = committer; // when doing a merge commit parse MERGE_HEAD and MERGE_MSG files @@ -574,7 +576,8 @@ public PersonIdent getCommitter() { /** * Sets the author for this {@code commit}. If no author is explicitly * specified because this method is never called or called with {@code null} - * value then the author will be set to the committer. + * value then the author will be set to the committer or to the original + * author when amending. * * @param author * the author used for the {@code commit} @@ -589,7 +592,8 @@ public CommitCommand setAuthor(PersonIdent author) { /** * Sets the author for this {@code commit}. If no author is explicitly * specified because this method is never called or called with {@code null} - * value then the author will be set to the committer. + * value then the author will be set to the committer or to the original + * author when amending. * * @param name * the name of the author used for the {@code commit}