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 563557f0c1..53281b52b8 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
@@ -300,6 +300,18 @@ public final class BrowseCommandBuilder
return this;
}
+ /**
+ * Limit the number of result files to limit entries.
+ *
+ * @param limit The maximal number of files this request shall return.
+ *
+ * @since 2.0.0
+ */
+ public BrowseCommandBuilder setLimit(int limit) {
+ request.setLimit(limit);
+ 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 9c23fe93f2..c856421855 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
@@ -191,6 +191,17 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest
this.recursive = recursive;
}
+ /**
+ * Limit the number of result files to limit entries.
+ *
+ * @param limit The maximal number of files this request shall return.
+ *
+ * @since 2.0.0
+ */
+ public void setLimit(int limit) {
+ this.limit = limit;
+ }
+
//~--- get methods ----------------------------------------------------------
/**
@@ -232,6 +243,15 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest
return recursive;
}
+ /**
+ * Returns the limit for the number of result files.
+ *
+ * @since 2.0.0
+ */
+ public int getLimit() {
+ return limit;
+ }
+
public void updateCache(BrowserResult update) {
if (updater != null) {
updater.accept(update);
@@ -249,6 +269,10 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest
/** browse file objects recursive */
private boolean recursive = false;
+
+ /** Limit the number of result files to limit entries. */
+ private int limit = 1000;
+
// WARNING / TODO: This field creates a reverse channel from the implementation to the API. This will break
// whenever the API runs in a different process than the SPI (for example to run explicit hosts for git repositories).
private final transient Consumer updater;
diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/FileBaseCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/FileBaseCommandRequest.java
index 9f563345fd..0a2192897a 100644
--- a/scm-core/src/main/java/sonia/scm/repository/spi/FileBaseCommandRequest.java
+++ b/scm-core/src/main/java/sonia/scm/repository/spi/FileBaseCommandRequest.java
@@ -147,6 +147,10 @@ public abstract class FileBaseCommandRequest
this.revision = revision;
}
+ public void setLimit(int limit) {
+ this.limit = limit;
+ }
+
//~--- get methods ----------------------------------------------------------
/**
@@ -171,6 +175,10 @@ public abstract class FileBaseCommandRequest
return revision;
}
+ public int getLimit() {
+ return limit;
+ }
+
//~--- methods --------------------------------------------------------------
/**
@@ -208,4 +216,6 @@ public abstract class FileBaseCommandRequest
/** Field description */
private String revision;
+
+ private int limit;
}
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 faa8f0c2fa..e45ad0d04b 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
@@ -236,6 +236,19 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase {
.containsExactly(of(42L));
}
+ @Test
+ public void testBrowseLimit() throws IOException {
+ BrowseCommandRequest request = new BrowseCommandRequest();
+ request.setLimit(2);
+ FileObject root = createCommand()
+ .getBrowserResult(request).getFile();
+ assertNotNull(root);
+
+ Collection foList = root.getChildren();
+
+ assertThat(foList).hasSize(2);
+ }
+
private FileObject findFile(Collection foList, String name) {
return foList.stream()
.filter(f -> name.equals(f.getName()))