Add option ignoreFileRegEx

Add option to ignore certain files when computing reviewers.

Sometimes there are files that are changed frequently but
do not contain much value (such as version information).
When these are ignored the quality of found reviewers is
improved.

Change-Id: I92ce3db89321b85725a65b0373f48b9395be7fa9
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ChangeUpdatedListener.java b/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ChangeUpdatedListener.java
index eb7098b..660ce57 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ChangeUpdatedListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ChangeUpdatedListener.java
@@ -89,6 +89,7 @@
     int maxReviewers;
     boolean ignoreDrafts;
     String ignoreSubjectRegEx;
+    String ignoreFileRegEx;
     try {
       maxReviewers =
           cfg.getFromProjectConfigWithInheritance(projectName, pluginName)
@@ -99,6 +100,9 @@
       ignoreSubjectRegEx =
           cfg.getFromProjectConfigWithInheritance(projectName, pluginName)
               .getString("ignoreSubjectRegEx", "");
+      ignoreFileRegEx =
+          cfg.getFromProjectConfigWithInheritance(projectName, pluginName)
+              .getString("ignoreFileRegEx", "");
     } catch (NoSuchProjectException x) {
       log.error(x.getMessage(), x);
       return;
@@ -138,7 +142,8 @@
           }
 
           final Runnable task =
-              reviewersByBlameFactory.create(commit, change, ps, maxReviewers, git);
+              reviewersByBlameFactory.create(commit, change, ps, maxReviewers,
+                  git, ignoreFileRegEx);
 
           workQueue.getDefaultQueue().submit(new Runnable() {
             @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ReviewersByBlame.java b/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ReviewersByBlame.java
index bc14c9d..3daf725 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ReviewersByBlame.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ReviewersByBlame.java
@@ -62,6 +62,7 @@
   private final PatchSet ps;
   private final Repository repo;
   private final int maxReviewers;
+  private final String ignoreFileRegEx;
 
   private final AccountByEmailCache byEmailCache;
   private final AccountCache accountCache;
@@ -71,7 +72,7 @@
 
   public interface Factory {
     ReviewersByBlame create(RevCommit commit, Change change, PatchSet ps,
-        int maxReviewers, Repository repo);
+        int maxReviewers, Repository repo, String ignoreFileRegEx);
   }
 
   @Inject
@@ -82,7 +83,8 @@
       final PatchListCache patchListCache,
       @Assisted final RevCommit commit, @Assisted final Change change,
       @Assisted final PatchSet ps, @Assisted final int maxReviewers,
-      @Assisted final Repository repo) {
+      @Assisted final Repository repo,
+      @Assisted final String ignoreFileRegEx) {
     this.byEmailCache = byEmailCache;
     this.accountCache = accountCache;
     this.changes = changes;
@@ -93,6 +95,7 @@
     this.ps = ps;
     this.maxReviewers = maxReviewers;
     this.repo = repo;
+    this.ignoreFileRegEx = ignoreFileRegEx;
   }
 
   @Override
@@ -113,6 +116,8 @@
       BlameResult blameResult;
       if ((entry.getChangeType() == ChangeType.MODIFIED ||
           entry.getChangeType() == ChangeType.DELETED)
+          && (ignoreFileRegEx.isEmpty() ||
+              !entry.getNewName().matches(ignoreFileRegEx))
           && (blameResult = computeBlame(entry, commit.getParent(0))) != null) {
         List<Edit> edits = entry.getEdits();
         reviewers.putAll(getReviewersForPatch(edits, blameResult));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ReviewersByBlameModule.java b/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ReviewersByBlameModule.java
index 2c7e945..4d61984 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ReviewersByBlameModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewersbyblame/ReviewersByBlameModule.java
@@ -40,5 +40,13 @@
         .toInstance(
             new ProjectConfigEntry("Ignore Regex", "", true,
                 "Ignore commits where the subject matches the given regular expression"));
+    bind(ProjectConfigEntry.class)
+        .annotatedWith(Exports.named("ignoreFileRegEx"))
+        .toInstance(
+            new ProjectConfigEntry(
+                "Ignore file Regex",
+                "",
+                true,
+                "Ignore files that match the given regular expression when looking for reviewers"));
   }
 }
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 404f970..a0ceb1d 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -27,6 +27,11 @@
 
 	By default false.
 
+plugin.reviewers-by-blame.ignoreFileRegEx
+:	Ignore files where the filename matches the given regular expression when
+	computing the reviewers. If empty or not set, no files are ignored.
+
+	By default not set.
 
 plugin.reviewers-by-blame.ignoreSubjectRegEx
 :	Ignore commits where the subject of the commit messages matches