theonedev/onedev · error · IllegalArgumentException
At least two filters needed.
Error message
At least two filters needed.
What it means
OrRevFilter.create(RevFilter[]) throws IllegalArgumentException when the array holds fewer than two filters. An OR over zero or one filter is meaningless, so JGit requires at least two subfilters, mirroring AndRevFilter.
Source
Thrown at server-core/src/main/java/org/eclipse/jgit/revwalk/filter/OrRevFilter.java:60
public static RevFilter create(RevFilter a, RevFilter b) {
if (a == ALL || b == ALL)
return ALL;
return new Binary(a, b);
}
/**
* Create a filter around many filters, one of which must match.
*
* @param list
* list of filters to match against. Must contain at least 2
* filters.
* @return a filter that must match at least one input filter.
*/
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, one of which must match.
*
* @param list
* list of filters to match against. Must contain at least 2
* filters.
* @return a filter that must match at least one input filter.
*/
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 array length before calling: return the single filter for length 1, and a constant (RevFilter.NONE) for length 0
- Only construct an OrRevFilter once at least two subfilters are present
- Prefer OrRevFilter.create(RevFilter a, RevFilter b) for the fixed two-filter case
Example fix
// before
RevFilter f = OrRevFilter.create(terms); // terms may contain 1 element
// after
RevFilter f = terms.length == 0 ? RevFilter.NONE
: terms.length == 1 ? terms[0]
: OrRevFilter.create(terms); Defensive patterns
Strategy: validation
Validate before calling
if (filters == null || filters.length < 2) {
throw new IllegalArgumentException("OrRevFilter.create needs at least 2 filters");
} Type guard
boolean canOr(RevFilter[] fs) { return fs != null && fs.length >= 2; } Try / catch
try {
RevFilter f = OrRevFilter.create(list);
} catch (IllegalArgumentException e) {
RevFilter f = list.length == 1 ? list[0] : RevFilter.NONE;
} Prevention
- Normalize 0/1-element filter arrays before combining
- Centralize OR-filter construction in a guarded helper
- Test filter builders with empty and singleton collections
When it happens
Trigger: Calling OrRevFilter.create with an array of length 0 or 1 — typically dynamic filter-building code that collects optional predicates without a size check.
Common situations: Building OR-search filters from multiple user-supplied terms where only one term matched; generic filter pipelines that previously always had >= 2 conditions.
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/302686b3d4bc8d37.
Report an issue: GitHub.