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

  1. Check array length before calling: return the single filter for length 1, and a constant (RevFilter.NONE) for length 0
  2. Only construct an OrRevFilter once at least two subfilters are present
  3. 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

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


AI-assisted analysis of theonedev/onedev@d44925c47c (2026-09-06). Data as JSON: /api/errors/302686b3d4bc8d37. Report an issue: GitHub.