theonedev/onedev · error · IllegalArgumentException
At least two filters needed.
Error message
At least two filters needed.
What it means
AndRevFilter.create(RevFilter[]) throws IllegalArgumentException when the array has fewer than two filters. An AND over zero or one filters is meaningless (the single-filter case is a no-op), so JGit requires at least two inputs.
Source
Thrown at server-core/src/main/java/org/eclipse/jgit/revwalk/filter/AndRevFilter.java:62
return b;
if (b == ALL)
return a;
return new Binary(a, b);
}
/**
* Create a filter around many filters, all of which must match.
*
* @param list
* list of filters to match against. Must contain at least 2
* filters.
* @return a filter that must match all input filters.
*/
public static RevFilter create(RevFilter[] list) {
if (list.length == 2)
return create(list[0], list[1]);
if (list.length < 2)
throw new IllegalArgumentException(JGitText.get().atLeastTwoFiltersNeeded);
final RevFilter[] subfilters = new RevFilter[list.length];
System.arraycopy(list, 0, subfilters, 0, list.length);
return new List(subfilters);
}
/**
* Create a filter around many filters, all of which must match.
*
* @param list
* list of filters to match against. Must contain at least 2
* filters.
* @return a filter that must match all input filters.
*/
public static RevFilter create(Collection<RevFilter> list) {
if (list.size() < 2)
throw new IllegalArgumentException(JGitText.get().atLeastTwoFiltersNeeded);
final RevFilter[] subfilters = new RevFilter[list.size()];
list.toArray(subfilters);View on GitHub (pinned to d44925c47c)
Solutions
- Check the array length before calling: if length is 0 return RevFilter.NONE/ALL as appropriate, if 1 return the single filter directly
- Guard with if (list.length >= 2) before invoking create
- Use AndRevFilter.create(RevFilter a, RevFilter b) only for the exact two-filter case
Example fix
// before
RevFilter f = AndRevFilter.create(collectedFilters); // may have < 2 entries
// after
RevFilter f = collectedFilters.length == 0 ? RevFilter.ALL
: collectedFilters.length == 1 ? collectedFilters[0]
: AndRevFilter.create(collectedFilters); Defensive patterns
Strategy: validation
Validate before calling
if (filters == null || filters.length < 2) {
throw new IllegalArgumentException("AndRevFilter.create needs at least 2 filters");
} Type guard
boolean canAnd(RevFilter[] fs) { return fs != null && fs.length >= 2; } Try / catch
try {
RevFilter f = AndRevFilter.create(list);
} catch (IllegalArgumentException e) {
RevFilter f = list.length == 1 ? list[0] : RevFilter.ALL;
} Prevention
- Normalize filter collections (0 -> identity filter, 1 -> itself) before combining
- Wrap combine logic in a helper instead of calling AndRevFilter.create directly from dynamic code
- Unit-test filter builders with empty and single-element inputs
When it happens
Trigger: Calling AndRevFilter.create(new RevFilter[]{f}) or AndRevFilter.create(new RevFilter[0]) — typically from generic code that collects filters into a varargs/array without checking size.
Common situations: Building a filter array from dynamic predicate lists that ended up with one (or zero) entries; migrations from null-based 'no filter' handling.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- At least two filters needed.
- Cannot match on empty string.
- Cannot match on empty string.
- Max count must be non-negative.
- Cannot match on empty string.
AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06).
Data as JSON: /api/errors/0c22bb3fd77ce1dc.
Report an issue: GitHub.