From 2b9c440fd1a08158b5e69d3a9e1a5bed4a17b286 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Mon, 4 Mar 2013 11:14:16 +0000 Subject: [PATCH] LogCommand.all(), peel references before using them Problem: LogCommand.all() throws an IncorrectObjectTypeException when there are tag references, and the repository does not contain the file "packed-refs". It seems that the references were not properly peeled before being added to the markStart() method. Solution: Call getRepository().peel() on every Ref that has isPeeled()==false in LogCommand.all() . Added test case for LogCommand.all() on repo with a tag. 1. I have authored 100% of the content I'm contributing, 2. I have the rights to donate the content to Eclipse, 3. I contribute the content under the EDL Bug: 402025 Change-Id: Idb8881eeb6ccce8530f2837b25296e8e83636eb7 --- .../org/eclipse/jgit/api/LogCommandTest.java | 25 +++++++++++++++++++ .../src/org/eclipse/jgit/api/LogCommand.java | 2 ++ 2 files changed, 27 insertions(+) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogCommandTest.java index 1f5364556..c6402e75e 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/LogCommandTest.java @@ -51,6 +51,7 @@ import java.util.Iterator; import java.util.List; import org.eclipse.jgit.junit.RepositoryTestCase; +import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Test; @@ -89,6 +90,30 @@ public class LogCommandTest extends RepositoryTestCase { assertFalse(log.hasNext()); } + @Test + public void logAllCommitsWithTag() throws Exception { + List commits = new ArrayList(); + Git git = Git.wrap(db); + + writeTrashFile("Test.txt", "Hello world"); + git.add().addFilepattern("Test.txt").call(); + commits.add(git.commit().setMessage("initial commit").call()); + + TagCommand tagCmd = git.tag(); + tagCmd.setName("tagname"); + tagCmd.setObjectId(commits.get(0)); + tagCmd.setTagger(new PersonIdent(db)); + Ref tag = tagCmd.call(); + + Iterator log = git.log().all().call().iterator(); + assertTrue(log.hasNext()); + RevCommit commit = log.next(); + tag = db.peel(tag); + + assertEquals(commit.getName(), tag.getPeeledObjectId().getName()); + assertTrue(commits.contains(commit)); + } + private List createCommits(Git git) throws Exception { List commits = new ArrayList(); writeTrashFile("Test.txt", "Hello world"); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java index 6d4b3474e..70b3658d9 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/LogCommand.java @@ -239,6 +239,8 @@ public class LogCommand extends GitCommand> { */ public LogCommand all() throws IOException { for (Ref ref : getRepository().getAllRefs().values()) { + if(!ref.isPeeled()) + ref = getRepository().peel(ref); ObjectId objectId = ref.getPeeledObjectId(); if (objectId == null) objectId = ref.getObjectId();