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

  1. Check the array length before calling: if length is 0 return RevFilter.NONE/ALL as appropriate, if 1 return the single filter directly
  2. Guard with if (list.length >= 2) before invoking create
  3. 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

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


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