blob: e9cd83c2e2b93aaa2a08a5b21b2905f53643d98e [file] [log] [blame]
/*
* Copyright (C) 2008, Google Inc.
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Distribution License v. 1.0 which is available at
* https://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
package org.eclipse.jgit.treewalk.filter;
import java.io.IOException;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.treewalk.TreeWalk;
/**
* Includes an entry only if the subfilter does not include the entry.
*/
public class NotTreeFilter extends TreeFilter {
/**
* Create a filter that negates the result of another filter.
*
* @param a
* filter to negate.
* @return a filter that does the reverse of <code>a</code>.
*/
public static TreeFilter create(TreeFilter a) {
return new NotTreeFilter(a);
}
private final TreeFilter a;
private NotTreeFilter(TreeFilter one) {
a = one;
}
@Override
public TreeFilter negate() {
return a;
}
@Override
public boolean include(TreeWalk walker)
throws MissingObjectException, IncorrectObjectTypeException,
IOException {
return matchFilter(walker) == 0;
}
@Override
public int matchFilter(TreeWalk walker)
throws MissingObjectException, IncorrectObjectTypeException,
IOException {
final int r = a.matchFilter(walker);
// switch 0 and 1, keep -1 as that defines a subpath that must be
// traversed before a final verdict can be made.
if (r == 0) {
return 1;
}
if (r == 1) {
return 0;
}
return -1;
}
@Override
public boolean shouldBeRecursive() {
return a.shouldBeRecursive();
}
@Override
public TreeFilter clone() {
final TreeFilter n = a.clone();
return n == a ? this : new NotTreeFilter(n);
}
@Override
public String toString() {
return "NOT " + a.toString(); //$NON-NLS-1$
}
}