diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java index 3c9ce9900b..dbcc023bd3 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java @@ -41,10 +41,18 @@ import com.google.common.collect.Lists; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.NoHeadException; +import org.eclipse.jgit.errors.IncorrectObjectTypeException; +import org.eclipse.jgit.errors.MissingObjectException; +import org.eclipse.jgit.errors.StopWalkException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; +import org.eclipse.jgit.revwalk.filter.RevFilter; +import org.eclipse.jgit.treewalk.filter.AndTreeFilter; +import org.eclipse.jgit.treewalk.filter.PathFilter; +import org.eclipse.jgit.treewalk.filter.PathFilterGroup; +import org.eclipse.jgit.treewalk.filter.TreeFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,6 +69,7 @@ import sonia.scm.util.IOUtil; import java.io.IOException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; /** @@ -177,8 +186,6 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand if (!gr.getAllRefs().isEmpty()) { - converter = new GitChangesetConverter(gr, GitUtil.ID_LENGTH); - int counter = 0; int start = request.getPagingStart(); @@ -194,7 +201,6 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand List changesetList = Lists.newArrayList(); int limit = request.getPagingLimit(); - boolean started = false; ObjectId startId = null; if (!Strings.isNullOrEmpty(request.getStartChangeset())) @@ -209,22 +215,36 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand endId = gr.resolve(request.getEndChangeset()); } - org.eclipse.jgit.api.LogCommand cmd = new Git(gr).log().all(); + RevWalk revWalk = new RevWalk(gr); + + converter = new GitChangesetConverter(gr, revWalk, GitUtil.ID_LENGTH); if (!Strings.isNullOrEmpty(request.getPath())) { - cmd = cmd.addPath(request.getPath()); + revWalk.setTreeFilter( + AndTreeFilter.create( + PathFilter.create(request.getPath()), TreeFilter.ANY_DIFF)); } - for (RevCommit commit : cmd.call()) - { - if (!started && ((startId == null) || commit.getId().equals(startId))) + ObjectId head = GitUtil.getRepositoryHead(gr); + + if (head != null) + { + if (startId != null) { - started = true; + revWalk.markStart(revWalk.lookupCommit(startId)); + } + else + { + revWalk.markStart(revWalk.lookupCommit(head)); } - if (started) + Iterator iterator = revWalk.iterator(); + + while (iterator.hasNext()) { + RevCommit commit = iterator.next(); + if ((counter >= start) && ((limit < 0) || (counter < start + limit))) { @@ -248,20 +268,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand repository.getName()); } } - catch (NoHeadException ex) - { - if (logger.isTraceEnabled()) - { - logger.trace("repository seems to be empty", ex); - } - else if (logger.isWarnEnabled()) - { - logger.warn("repository seems to be empty"); - } - - changesets = new ChangesetPagingResult(0, new ArrayList()); - } - catch (GitAPIException ex) + catch (Exception ex) { throw new RepositoryException("could not create change log", ex); } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java index 650a9e0c36..5f7f9055fb 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java @@ -71,8 +71,8 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase createCommand().getChangesets(new LogCommandRequest()); assertNotNull(result); - assertEquals(5, result.getTotal()); - assertEquals(5, result.getChangesets().size()); + assertEquals(4, result.getTotal()); + assertEquals(4, result.getChangesets().size()); } /** @@ -92,11 +92,10 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase ChangesetPagingResult result = createCommand().getChangesets(request); assertNotNull(result); - assertEquals(3, result.getTotal()); - assertEquals(3, result.getChangesets().size()); + assertEquals(2, result.getTotal()); + assertEquals(2, result.getChangesets().size()); assertEquals("fcd0ef1831e4002ac43e", result.getChangesets().get(0).getId()); - assertEquals("3f76a12f08a6ba0dc988", result.getChangesets().get(1).getId()); - assertEquals("435df2f061add3589cb3", result.getChangesets().get(2).getId()); + assertEquals("435df2f061add3589cb3", result.getChangesets().get(1).getId()); } /** @@ -116,7 +115,7 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase ChangesetPagingResult result = createCommand().getChangesets(request); assertNotNull(result); - assertEquals(5, result.getTotal()); + assertEquals(4, result.getTotal()); assertEquals(2, result.getChangesets().size()); Changeset c1 = result.getChangesets().get(0); @@ -148,7 +147,7 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase ChangesetPagingResult result = createCommand().getChangesets(request); assertNotNull(result); - assertEquals(5, result.getTotal()); + assertEquals(4, result.getTotal()); assertEquals(2, result.getChangesets().size()); Changeset c1 = result.getChangesets().get(0); @@ -159,7 +158,7 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase Changeset c2 = result.getChangesets().get(1); assertNotNull(c2); - assertEquals("3f76a12f08a6ba0dc988", c2.getId()); + assertEquals("592d797cd36432e59141", c2.getId()); } /**