diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java index e4a32c8ca6..413c5765b0 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java @@ -52,6 +52,7 @@ import sonia.scm.repository.SvnUtil; import sonia.scm.util.Util; import java.util.Collection; +import java.util.Iterator; import static org.tmatesoft.svn.core.SVNErrorCode.FS_NO_SUCH_REVISION; import static sonia.scm.ContextEntry.ContextBuilder.entity; @@ -73,6 +74,8 @@ public class SvnBrowseCommand extends AbstractSvnCommand private static final Logger logger = LoggerFactory.getLogger(SvnBrowseCommand.class); + private int resultCount = 0; + SvnBrowseCommand(SvnContext context, Repository repository) { super(context, repository); @@ -128,11 +131,13 @@ public class SvnBrowseCommand extends AbstractSvnCommand throws SVNException { Collection entries = svnRepository.getDir(parent.getPath(), revisionNumber, null, (Collection) null); - for (SVNDirEntry entry : entries) - { + for (Iterator iterator = entries.iterator(); resultCount < request.getLimit() + request.getProceedFrom() && iterator.hasNext(); ++resultCount) { + SVNDirEntry entry = iterator.next(); FileObject child = createFileObject(request, svnRepository, revisionNumber, entry, basePath); - parent.addChild(child); + if (resultCount >= request.getProceedFrom()) { + parent.addChild(child); + } if (child.isDirectory() && request.isRecursive()) { traverse(svnRepository, revisionNumber, request, child, createBasePath(child.getPath())); diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBrowseCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBrowseCommandTest.java index 980d486b5c..0244e9dbeb 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBrowseCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBrowseCommandTest.java @@ -40,10 +40,10 @@ import sonia.scm.repository.FileObject; import java.io.IOException; import java.util.Collection; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; /** @@ -65,7 +65,17 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase @Test public void testBrowse() { - Collection foList = getRootFromTip(new BrowseCommandRequest()); + BrowserResult result = createCommand().getBrowserResult(new BrowseCommandRequest()); + + assertNotNull(result); + + Collection foList1 = result.getFile().getChildren(); + + assertNotNull(foList1); + assertFalse(foList1.isEmpty()); + assertEquals(2, foList1.size()); + + Collection foList = foList1; FileObject a = getFileObject(foList, "a.txt"); FileObject c = getFileObject(foList, "c"); @@ -140,14 +150,24 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase request.setDisableLastCommit(true); - Collection foList = getRootFromTip(request); + BrowserResult result = createCommand().getBrowserResult(request); + + assertNotNull(result); + + Collection foList1 = result.getFile().getChildren(); + + assertNotNull(foList1); + assertFalse(foList1.isEmpty()); + assertEquals(2, foList1.size()); + + Collection foList = foList1; FileObject a = getFileObject(foList, "a.txt"); assertFalse(a.getDescription().isPresent()); assertFalse(a.getCommitDate().isPresent()); } - + @Test public void testRecursive() { BrowseCommandRequest request = new BrowseCommandRequest(); @@ -168,6 +188,32 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase assertEquals(2, c.getChildren().size()); } + @Test + public void testLimit() { + BrowseCommandRequest request = new BrowseCommandRequest(); + request.setLimit(1); + BrowserResult result = createCommand().getBrowserResult(request); + + assertNotNull(result); + + Collection foList = result.getFile().getChildren(); + + assertThat(foList).extracting("name").containsExactlyInAnyOrder("a.txt"); + } + + @Test + public void testProceedFrom() { + BrowseCommandRequest request = new BrowseCommandRequest(); + request.setProceedFrom(1); + BrowserResult result = createCommand().getBrowserResult(request); + + assertNotNull(result); + + Collection foList = result.getFile().getChildren(); + + assertThat(foList).extracting("name").containsExactlyInAnyOrder("c"); + } + /** * Method description * @@ -198,17 +244,4 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase .orElseThrow(() -> new AssertionError("file " + name + " not found")); } - private Collection getRootFromTip(BrowseCommandRequest request) { - BrowserResult result = createCommand().getBrowserResult(request); - - assertNotNull(result); - - Collection foList = result.getFile().getChildren(); - - assertNotNull(foList); - assertFalse(foList.isEmpty()); - assertEquals(2, foList.size()); - - return foList; - } }