| // Copyright (C) 2014 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.gitiles; |
| |
| import com.google.common.annotations.VisibleForTesting; |
| import java.io.IOException; |
| import org.eclipse.jgit.errors.IncorrectObjectTypeException; |
| import org.eclipse.jgit.errors.MissingObjectException; |
| import org.eclipse.jgit.errors.StopWalkException; |
| import org.eclipse.jgit.lib.PersonIdent; |
| import org.eclipse.jgit.revwalk.RevCommit; |
| import org.eclipse.jgit.revwalk.RevWalk; |
| import org.eclipse.jgit.revwalk.filter.RevFilter; |
| |
| /** Filter which only includes commits matching a person identity. */ |
| public abstract class IdentRevFilter extends RevFilter { |
| public static IdentRevFilter author(String author) { |
| return new Author(author); |
| } |
| |
| public static IdentRevFilter committer(String committer) { |
| return new Committer(committer); |
| } |
| |
| private final String pattern; |
| |
| protected IdentRevFilter(String pattern) { |
| this.pattern = pattern; |
| } |
| |
| @Override |
| public boolean include(RevWalk walker, RevCommit commit) |
| throws StopWalkException, MissingObjectException, IncorrectObjectTypeException, IOException { |
| return matchesPerson(getIdent(walker, commit)); |
| } |
| |
| @Override |
| public RevFilter clone() { |
| return this; |
| } |
| |
| /** @return whether the given person matches the author filter. */ |
| @VisibleForTesting |
| boolean matchesPerson(PersonIdent person) { |
| // Equivalent to --fixed-strings, to avoid pathological performance of Java |
| // regex matching. |
| // TODO(kalman): Find/use a port of re2. |
| return person.getName().contains(pattern) || person.getEmailAddress().contains(pattern); |
| } |
| |
| protected abstract PersonIdent getIdent(RevWalk walk, RevCommit commit) |
| throws MissingObjectException, IOException; |
| |
| private static class Author extends IdentRevFilter { |
| private Author(String author) { |
| super(author); |
| } |
| |
| @Override |
| protected PersonIdent getIdent(RevWalk walk, RevCommit commit) |
| throws MissingObjectException, IOException { |
| walk.parseBody(commit); |
| return commit.getAuthorIdent(); |
| } |
| } |
| |
| private static class Committer extends IdentRevFilter { |
| private Committer(String committer) { |
| super(committer); |
| } |
| |
| @Override |
| protected PersonIdent getIdent(RevWalk walk, RevCommit commit) |
| throws MissingObjectException, IOException { |
| walk.parseBody(commit); |
| return commit.getCommitterIdent(); |
| } |
| } |
| } |