diff --git a/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java index e088248762..7862fdb64a 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java @@ -315,6 +315,18 @@ public final class BrowseCommandBuilder return this; } + /** + * Proceed the list from the given number on (zero based). + * + * @param proceedFrom The number of the entry, the result should start with (zero based). + * All preceding entries will be omitted. + * @since 2.0.0 + */ + public BrowseCommandBuilder setProceedFrom(int proceedFrom) { + request.setProceedFrom(proceedFrom); + return this; + } + private void updateCache(BrowserResult updatedResult) { if (!disableCache) { CacheKey key = new CacheKey(repository, request); diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java index e7181829a1..3dbe71f322 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java @@ -52,6 +52,7 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest public static final int DEFAULT_REQUEST_LIMIT = 1000; private static final long serialVersionUID = 7956624623516803183L; + private int proceedFrom; public BrowseCommandRequest() { this(null); @@ -203,6 +204,17 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest this.limit = limit; } + /** + * Proceed the list from the given number on (zero based). + * + * @param proceedFrom The number of the entry, the result should start with (zero based). + * All preceding entries will be omitted. + * @since 2.0.0 + */ + public void setProceedFrom(int proceedFrom) { + this.proceedFrom = proceedFrom; + } + //~--- get methods ---------------------------------------------------------- /** @@ -253,6 +265,15 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest return limit; } + /** + * The number of the entry, the result start with. All preceding entries will be omitted. + * + * @since 2.0.0 + */ + public int getProceedFrom() { + return proceedFrom; + } + public void updateCache(BrowserResult update) { if (updater != null) { updater.accept(update); 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 5158a74ecb..79aeb51342 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 @@ -253,7 +253,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()) + while (treeWalk.next() && resultCount < request.getLimit() + request.getProceedFrom()) { FileObject fileObject = createFileObject(repo, request, revId, treeWalk); @@ -262,7 +262,9 @@ public class GitBrowseCommand extends AbstractGitCommand return fileObject; } - files.add(fileObject); + if (resultCount >= request.getProceedFrom()) { + files.add(fileObject); + } ++resultCount; 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 e45ad0d04b..78aa12e8e0 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 @@ -249,6 +249,20 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase { assertThat(foList).hasSize(2); } + @Test + public void testBrowseProceedFrom() throws IOException { + BrowseCommandRequest request = new BrowseCommandRequest(); + request.setLimit(2); + request.setProceedFrom(2); + FileObject root = createCommand() + .getBrowserResult(request).getFile(); + assertNotNull(root); + + Collection foList = root.getChildren(); + + assertThat(foList).extracting("name").contains("c", "f.txt"); + } + private FileObject findFile(Collection foList, String name) { return foList.stream() .filter(f -> name.equals(f.getName()))