|
|
@@ -40,6 +40,7 @@ |
|
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|
|
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
|
|
*/ |
|
|
|
|
|
|
|
package org.eclipse.jgit.api; |
|
|
|
|
|
|
|
import static java.nio.charset.StandardCharsets.UTF_8; |
|
|
@@ -50,14 +51,10 @@ import static org.junit.Assert.fail; |
|
|
|
import static org.junit.Assume.assumeFalse; |
|
|
|
|
|
|
|
import java.io.File; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.PrintWriter; |
|
|
|
|
|
|
|
import org.eclipse.jgit.api.errors.GitAPIException; |
|
|
|
import org.eclipse.jgit.api.errors.JGitInternalException; |
|
|
|
import org.eclipse.jgit.api.errors.NoMessageException; |
|
|
|
import org.eclipse.jgit.errors.IncorrectObjectTypeException; |
|
|
|
import org.eclipse.jgit.errors.MissingObjectException; |
|
|
|
import org.eclipse.jgit.junit.RepositoryTestCase; |
|
|
|
import org.eclipse.jgit.lib.Constants; |
|
|
|
import org.eclipse.jgit.lib.ObjectId; |
|
|
@@ -76,13 +73,12 @@ import org.junit.Test; |
|
|
|
*/ |
|
|
|
public class CommitAndLogCommandTest extends RepositoryTestCase { |
|
|
|
@Test |
|
|
|
public void testSomeCommits() throws JGitInternalException, IOException, |
|
|
|
GitAPIException { |
|
|
|
|
|
|
|
public void testSomeCommits() throws Exception { |
|
|
|
// do 4 commits |
|
|
|
try (Git git = new Git(db)) { |
|
|
|
git.commit().setMessage("initial commit").call(); |
|
|
|
git.commit().setMessage("second commit").setCommitter(committer).call(); |
|
|
|
git.commit().setMessage("second commit").setCommitter(committer) |
|
|
|
.call(); |
|
|
|
git.commit().setMessage("third commit").setAuthor(author).call(); |
|
|
|
git.commit().setMessage("fourth commit").setAuthor(author) |
|
|
|
.setCommitter(committer).call(); |
|
|
@@ -90,79 +86,28 @@ public class CommitAndLogCommandTest extends RepositoryTestCase { |
|
|
|
|
|
|
|
// check that all commits came in correctly |
|
|
|
PersonIdent defaultCommitter = new PersonIdent(db); |
|
|
|
PersonIdent expectedAuthors[] = new PersonIdent[] { defaultCommitter, |
|
|
|
committer, author, author }; |
|
|
|
PersonIdent expectedAuthors[] = new PersonIdent[] { |
|
|
|
defaultCommitter, committer, author, author }; |
|
|
|
PersonIdent expectedCommitters[] = new PersonIdent[] { |
|
|
|
defaultCommitter, committer, defaultCommitter, committer }; |
|
|
|
String expectedMessages[] = new String[] { "initial commit", |
|
|
|
"second commit", "third commit", "fourth commit" }; |
|
|
|
int l = expectedAuthors.length - 1; |
|
|
|
for (RevCommit c : commits) { |
|
|
|
assertEquals(expectedAuthors[l].getName(), c.getAuthorIdent() |
|
|
|
.getName()); |
|
|
|
assertEquals(expectedCommitters[l].getName(), c.getCommitterIdent() |
|
|
|
.getName()); |
|
|
|
assertEquals(expectedAuthors[l].getName(), |
|
|
|
c.getAuthorIdent().getName()); |
|
|
|
assertEquals(expectedCommitters[l].getName(), |
|
|
|
c.getCommitterIdent().getName()); |
|
|
|
assertEquals(c.getFullMessage(), expectedMessages[l]); |
|
|
|
l--; |
|
|
|
} |
|
|
|
assertEquals(l, -1); |
|
|
|
ReflogReader reader = db.getReflogReader(Constants.HEAD); |
|
|
|
assertTrue(reader.getLastEntry().getComment().startsWith("commit:")); |
|
|
|
assertTrue( |
|
|
|
reader.getLastEntry().getComment().startsWith("commit:")); |
|
|
|
reader = db.getReflogReader(db.getBranch()); |
|
|
|
assertTrue(reader.getLastEntry().getComment().startsWith("commit:")); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testLogWithFilter() throws IOException, JGitInternalException, |
|
|
|
GitAPIException { |
|
|
|
|
|
|
|
try (Git git = new Git(db)) { |
|
|
|
// create first file |
|
|
|
File file = new File(db.getWorkTree(), "a.txt"); |
|
|
|
FileUtils.createNewFile(file); |
|
|
|
try (PrintWriter writer = new PrintWriter(file, UTF_8.name())) { |
|
|
|
writer.print("content1"); |
|
|
|
} |
|
|
|
|
|
|
|
// First commit - a.txt file |
|
|
|
git.add().addFilepattern("a.txt").call(); |
|
|
|
git.commit().setMessage("commit1").setCommitter(committer).call(); |
|
|
|
|
|
|
|
// create second file |
|
|
|
file = new File(db.getWorkTree(), "b.txt"); |
|
|
|
FileUtils.createNewFile(file); |
|
|
|
try (PrintWriter writer = new PrintWriter(file, UTF_8.name())) { |
|
|
|
writer.print("content2"); |
|
|
|
} |
|
|
|
|
|
|
|
// Second commit - b.txt file |
|
|
|
git.add().addFilepattern("b.txt").call(); |
|
|
|
git.commit().setMessage("commit2").setCommitter(committer).call(); |
|
|
|
|
|
|
|
// First log - a.txt filter |
|
|
|
int count = 0; |
|
|
|
for (RevCommit c : git.log().addPath("a.txt").call()) { |
|
|
|
assertEquals("commit1", c.getFullMessage()); |
|
|
|
count++; |
|
|
|
} |
|
|
|
assertEquals(1, count); |
|
|
|
|
|
|
|
// Second log - b.txt filter |
|
|
|
count = 0; |
|
|
|
for (RevCommit c : git.log().addPath("b.txt").call()) { |
|
|
|
assertEquals("commit2", c.getFullMessage()); |
|
|
|
count++; |
|
|
|
} |
|
|
|
assertEquals(1, count); |
|
|
|
|
|
|
|
// Third log - without filter |
|
|
|
count = 0; |
|
|
|
for (RevCommit c : git.log().call()) { |
|
|
|
assertEquals(committer, c.getCommitterIdent()); |
|
|
|
count++; |
|
|
|
} |
|
|
|
assertEquals(2, count); |
|
|
|
assertTrue( |
|
|
|
reader.getLastEntry().getComment().startsWith("commit:")); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@@ -204,19 +149,20 @@ public class CommitAndLogCommandTest extends RepositoryTestCase { |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testMergeEmptyBranches() throws IOException, |
|
|
|
JGitInternalException, GitAPIException { |
|
|
|
public void testMergeEmptyBranches() throws Exception { |
|
|
|
try (Git git = new Git(db)) { |
|
|
|
git.commit().setMessage("initial commit").call(); |
|
|
|
RefUpdate r = db.updateRef("refs/heads/side"); |
|
|
|
r.setNewObjectId(db.resolve(Constants.HEAD)); |
|
|
|
assertEquals(r.forceUpdate(), RefUpdate.Result.NEW); |
|
|
|
RevCommit second = git.commit().setMessage("second commit").setCommitter(committer).call(); |
|
|
|
RevCommit second = git.commit().setMessage("second commit") |
|
|
|
.setCommitter(committer).call(); |
|
|
|
db.updateRef(Constants.HEAD).link("refs/heads/side"); |
|
|
|
RevCommit firstSide = git.commit().setMessage("first side commit").setAuthor(author).call(); |
|
|
|
RevCommit firstSide = git.commit().setMessage("first side commit") |
|
|
|
.setAuthor(author).call(); |
|
|
|
|
|
|
|
write(new File(db.getDirectory(), Constants.MERGE_HEAD), ObjectId |
|
|
|
.toString(db.resolve("refs/heads/master"))); |
|
|
|
write(new File(db.getDirectory(), Constants.MERGE_HEAD), |
|
|
|
ObjectId.toString(db.resolve("refs/heads/master"))); |
|
|
|
write(new File(db.getDirectory(), Constants.MERGE_MSG), "merging"); |
|
|
|
|
|
|
|
RevCommit commit = git.commit().call(); |
|
|
@@ -228,8 +174,7 @@ public class CommitAndLogCommandTest extends RepositoryTestCase { |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testAddUnstagedChanges() throws IOException, |
|
|
|
JGitInternalException, GitAPIException { |
|
|
|
public void testAddUnstagedChanges() throws Exception { |
|
|
|
File file = new File(db.getWorkTree(), "a.txt"); |
|
|
|
FileUtils.createNewFile(file); |
|
|
|
try (PrintWriter writer = new PrintWriter(file, UTF_8.name())) { |
|
|
@@ -260,7 +205,7 @@ public class CommitAndLogCommandTest extends RepositoryTestCase { |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testModeChange() throws IOException, GitAPIException { |
|
|
|
public void testModeChange() throws Exception { |
|
|
|
assumeFalse(System.getProperty("os.name").startsWith("Windows"));// SKIP |
|
|
|
try (Git git = new Git(db)) { |
|
|
|
// create file |
|
|
@@ -278,7 +223,8 @@ public class CommitAndLogCommandTest extends RepositoryTestCase { |
|
|
|
FS fs = db.getFS(); |
|
|
|
fs.setExecute(file, true); |
|
|
|
git.add().addFilepattern("a.txt").call(); |
|
|
|
git.commit().setMessage("mode change").setCommitter(committer).call(); |
|
|
|
git.commit().setMessage("mode change").setCommitter(committer) |
|
|
|
.call(); |
|
|
|
|
|
|
|
// pure mode change should be committable with -o option |
|
|
|
fs.setExecute(file, false); |
|
|
@@ -289,34 +235,32 @@ public class CommitAndLogCommandTest extends RepositoryTestCase { |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testCommitRange() throws GitAPIException, |
|
|
|
JGitInternalException, MissingObjectException, |
|
|
|
IncorrectObjectTypeException { |
|
|
|
public void testCommitRange() throws Exception { |
|
|
|
// do 4 commits and set the range to the second and fourth one |
|
|
|
try (Git git = new Git(db)) { |
|
|
|
git.commit().setMessage("first commit").call(); |
|
|
|
RevCommit second = git.commit().setMessage("second commit") |
|
|
|
.setCommitter(committer).call(); |
|
|
|
git.commit().setMessage("third commit").setAuthor(author).call(); |
|
|
|
RevCommit last = git.commit().setMessage("fourth commit").setAuthor( |
|
|
|
author) |
|
|
|
.setCommitter(committer).call(); |
|
|
|
Iterable<RevCommit> commits = git.log().addRange(second.getId(), |
|
|
|
last.getId()).call(); |
|
|
|
RevCommit last = git.commit().setMessage("fourth commit") |
|
|
|
.setAuthor(author).setCommitter(committer).call(); |
|
|
|
Iterable<RevCommit> commits = git.log() |
|
|
|
.addRange(second.getId(), last.getId()).call(); |
|
|
|
|
|
|
|
// check that we have the third and fourth commit |
|
|
|
PersonIdent defaultCommitter = new PersonIdent(db); |
|
|
|
PersonIdent expectedAuthors[] = new PersonIdent[] { author, author }; |
|
|
|
PersonIdent expectedAuthors[] = new PersonIdent[] { author, |
|
|
|
author }; |
|
|
|
PersonIdent expectedCommitters[] = new PersonIdent[] { |
|
|
|
defaultCommitter, committer }; |
|
|
|
String expectedMessages[] = new String[] { "third commit", |
|
|
|
"fourth commit" }; |
|
|
|
int l = expectedAuthors.length - 1; |
|
|
|
for (RevCommit c : commits) { |
|
|
|
assertEquals(expectedAuthors[l].getName(), c.getAuthorIdent() |
|
|
|
.getName()); |
|
|
|
assertEquals(expectedCommitters[l].getName(), c.getCommitterIdent() |
|
|
|
.getName()); |
|
|
|
assertEquals(expectedAuthors[l].getName(), |
|
|
|
c.getAuthorIdent().getName()); |
|
|
|
assertEquals(expectedCommitters[l].getName(), |
|
|
|
c.getCommitterIdent().getName()); |
|
|
|
assertEquals(c.getFullMessage(), expectedMessages[l]); |
|
|
|
l--; |
|
|
|
} |
|
|
@@ -325,8 +269,7 @@ public class CommitAndLogCommandTest extends RepositoryTestCase { |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testCommitAmend() throws JGitInternalException, IOException, |
|
|
|
GitAPIException { |
|
|
|
public void testCommitAmend() throws Exception { |
|
|
|
try (Git git = new Git(db)) { |
|
|
|
git.commit().setMessage("first comit").call(); // typo |
|
|
|
git.commit().setAmend(true).setMessage("first commit").call(); |
|
|
@@ -348,15 +291,14 @@ public class CommitAndLogCommandTest extends RepositoryTestCase { |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testInsertChangeId() throws JGitInternalException, |
|
|
|
GitAPIException { |
|
|
|
public void testInsertChangeId() throws Exception { |
|
|
|
try (Git git = new Git(db)) { |
|
|
|
String messageHeader = "Some header line\n\nSome detail explanation\n"; |
|
|
|
String changeIdTemplate = "\nChange-Id: I" |
|
|
|
+ ObjectId.zeroId().getName() + "\n"; |
|
|
|
String messageFooter = "Some foooter lines\nAnother footer line\n"; |
|
|
|
RevCommit commit = git.commit().setMessage( |
|
|
|
messageHeader + messageFooter) |
|
|
|
RevCommit commit = git.commit() |
|
|
|
.setMessage(messageHeader + messageFooter) |
|
|
|
.setInsertChangeId(true).call(); |
|
|
|
// we should find a real change id (at the end of the file) |
|
|
|
byte[] chars = commit.getFullMessage().getBytes(UTF_8); |
|
|
@@ -364,11 +306,12 @@ public class CommitAndLogCommandTest extends RepositoryTestCase { |
|
|
|
String lastLine = RawParseUtils.decode(chars, lastLineBegin + 1, |
|
|
|
chars.length); |
|
|
|
assertTrue(lastLine.contains("Change-Id:")); |
|
|
|
assertFalse(lastLine.contains( |
|
|
|
"Change-Id: I" + ObjectId.zeroId().getName())); |
|
|
|
assertFalse(lastLine |
|
|
|
.contains("Change-Id: I" + ObjectId.zeroId().getName())); |
|
|
|
|
|
|
|
commit = git.commit().setMessage( |
|
|
|
messageHeader + changeIdTemplate + messageFooter) |
|
|
|
commit = git.commit() |
|
|
|
.setMessage( |
|
|
|
messageHeader + changeIdTemplate + messageFooter) |
|
|
|
.setInsertChangeId(true).call(); |
|
|
|
// we should find a real change id (in the line as dictated by the |
|
|
|
// template) |
|
|
@@ -383,11 +326,12 @@ public class CommitAndLogCommandTest extends RepositoryTestCase { |
|
|
|
String line = RawParseUtils.decode(chars, lineStart, lineEnd); |
|
|
|
|
|
|
|
assertTrue(line.contains("Change-Id:")); |
|
|
|
assertFalse(line.contains( |
|
|
|
"Change-Id: I" + ObjectId.zeroId().getName())); |
|
|
|
assertFalse(line |
|
|
|
.contains("Change-Id: I" + ObjectId.zeroId().getName())); |
|
|
|
|
|
|
|
commit = git.commit().setMessage( |
|
|
|
messageHeader + changeIdTemplate + messageFooter) |
|
|
|
commit = git.commit() |
|
|
|
.setMessage( |
|
|
|
messageHeader + changeIdTemplate + messageFooter) |
|
|
|
.setInsertChangeId(false).call(); |
|
|
|
// we should find the untouched template |
|
|
|
chars = commit.getFullMessage().getBytes(UTF_8); |
|
|
@@ -400,8 +344,8 @@ public class CommitAndLogCommandTest extends RepositoryTestCase { |
|
|
|
|
|
|
|
line = RawParseUtils.decode(chars, lineStart, lineEnd); |
|
|
|
|
|
|
|
assertTrue(commit.getFullMessage().contains( |
|
|
|
"Change-Id: I" + ObjectId.zeroId().getName())); |
|
|
|
assertTrue(commit.getFullMessage() |
|
|
|
.contains("Change-Id: I" + ObjectId.zeroId().getName())); |
|
|
|
} |
|
|
|
} |
|
|
|
} |