diff --git a/scm-core/src/main/java/sonia/scm/repository/FileObject.java b/scm-core/src/main/java/sonia/scm/repository/FileObject.java index 8f1cf298de..e262177e19 100644 --- a/scm-core/src/main/java/sonia/scm/repository/FileObject.java +++ b/scm-core/src/main/java/sonia/scm/repository/FileObject.java @@ -87,7 +87,7 @@ public class FileObject implements LastModifiedAware, Serializable final FileObject other = (FileObject) obj; //J- - return Objects.equal(name, other.name) + return Objects.equal(name, other.name) && Objects.equal(path, other.path) && Objects.equal(directory, other.directory) && Objects.equal(description, other.description) @@ -282,6 +282,10 @@ public class FileObject implements LastModifiedAware, Serializable return computationAborted; } + public boolean isTruncated() { + return truncated; + } + //~--- set methods ---------------------------------------------------------- /** @@ -403,6 +407,10 @@ public class FileObject implements LastModifiedAware, Serializable this.children.add(child); } + public void setTruncated(boolean truncated) { + this.truncated = truncated; + } + //~--- fields --------------------------------------------------------------- /** file description */ @@ -435,4 +443,6 @@ public class FileObject implements LastModifiedAware, Serializable /** Children of this file (aka directory). */ private Collection children = new ArrayList<>(); + + private boolean truncated; } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java index 79aeb51342..5ececf176f 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java @@ -153,6 +153,7 @@ public class GitBrowseCommand extends AbstractGitCommand fileObject.setName(""); fileObject.setPath(""); fileObject.setDirectory(true); + fileObject.setTruncated(false); return fileObject; } @@ -253,7 +254,7 @@ public class GitBrowseCommand extends AbstractGitCommand private FileObject findChildren(FileObject parent, org.eclipse.jgit.lib.Repository repo, BrowseCommandRequest request, ObjectId revId, TreeWalk treeWalk) throws IOException { List files = Lists.newArrayList(); - while (treeWalk.next() && resultCount < request.getLimit() + request.getProceedFrom()) + while (treeWalk.next() && ++resultCount <= request.getLimit() + request.getProceedFrom()) { FileObject fileObject = createFileObject(repo, request, revId, treeWalk); @@ -262,12 +263,10 @@ public class GitBrowseCommand extends AbstractGitCommand return fileObject; } - if (resultCount >= request.getProceedFrom()) { + if (resultCount > request.getProceedFrom()) { files.add(fileObject); } - ++resultCount; - if (request.isRecursive() && fileObject.isDirectory()) { treeWalk.enterSubtree(); FileObject rc = findChildren(fileObject, repo, request, revId, treeWalk); @@ -279,6 +278,10 @@ public class GitBrowseCommand extends AbstractGitCommand parent.setChildren(files); + if (resultCount > request.getLimit() + request.getProceedFrom()) { + parent.setTruncated(true); + } + return null; } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java index 78aa12e8e0..04d2af9762 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java @@ -72,6 +72,7 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase { BrowserResult result = createCommand().getBrowserResult(request); FileObject fileObject = result.getFile(); assertEquals("a.txt", fileObject.getName()); + assertFalse(fileObject.isTruncated()); } @Test @@ -247,6 +248,7 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase { Collection foList = root.getChildren(); assertThat(foList).hasSize(2); + assertTrue(root.isTruncated()); } @Test @@ -261,6 +263,7 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase { Collection foList = root.getChildren(); assertThat(foList).extracting("name").contains("c", "f.txt"); + assertFalse(root.isTruncated()); } private FileObject findFile(Collection foList, String name) {