Merge branch 'stable-2.14' into stable-2.15

* stable-2.14:
  Update to latest bazlets on stable-2.14 branch
  Ignore inactive reviewers in groups
  Use latest bazlets

Change-Id: I609c1057898f4ecd88b175ad0c4e14b1ee417d68
diff --git a/WORKSPACE b/WORKSPACE
index cd9ae96..90f8239 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,7 +3,7 @@
 load("//:bazlets.bzl", "load_bazlets")
 
 load_bazlets(
-    commit = "fb374c7a27fd94b94e5109906c09bc459355cff2",
+    commit = "28d12c28df242b21855d4bebf8cca12b9ffcb900",
     #    local_path = "/home/<user>/projects/bazlets",
 )
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/ChangeEventListener.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ChangeEventListener.java
index f83f025..47916a0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/ChangeEventListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/ChangeEventListener.java
@@ -21,12 +21,12 @@
 import com.google.common.collect.Sets;
 import com.google.gerrit.common.errors.NoSuchGroupException;
 import com.google.gerrit.extensions.annotations.PluginName;
-import com.google.gerrit.extensions.client.ChangeStatus;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.events.DraftPublishedListener;
 import com.google.gerrit.extensions.events.RevisionCreatedListener;
 import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.index.query.Predicate;
+import com.google.gerrit.index.query.QueryParseException;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.Project;
@@ -40,8 +40,6 @@
 import com.google.gerrit.server.git.WorkQueue;
 import com.google.gerrit.server.group.GroupsCollection;
 import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.query.Predicate;
-import com.google.gerrit.server.query.QueryParseException;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
 import com.google.gerrit.server.util.RequestContext;
@@ -55,13 +53,14 @@
 import java.io.IOException;
 import java.util.List;
 import java.util.Set;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-class ChangeEventListener implements RevisionCreatedListener, DraftPublishedListener {
+class ChangeEventListener implements RevisionCreatedListener {
   private static final Logger log = LoggerFactory.getLogger(ChangeEventListener.class);
 
   private final AccountResolver accountResolver;
@@ -77,7 +76,6 @@
   private final ReviewersConfig.Factory configFactory;
   private final Provider<CurrentUser> user;
   private final ChangeQueryBuilder queryBuilder;
-  private final boolean ignoreDrafts;
 
   @Inject
   ChangeEventListener(
@@ -109,25 +107,11 @@
     this.configFactory = configFactory;
     this.user = user;
     this.queryBuilder = queryBuilder;
-    this.ignoreDrafts =
-        cfgFactory
-            .getGlobalPluginConfig(pluginName)
-            .getBoolean(pluginName, null, "ignoreDrafts", false);
   }
 
   @Override
   public void onRevisionCreated(RevisionCreatedListener.Event event) {
     ChangeInfo c = event.getChange();
-    if (ignoreDrafts && c.status == ChangeStatus.DRAFT) {
-      log.debug("Ignoring draft change");
-      return;
-    }
-    onEvent(new Project.NameKey(c.project), c._number, event.getWho());
-  }
-
-  @Override
-  public void onDraftPublished(DraftPublishedListener.Event event) {
-    ChangeInfo c = event.getChange();
     onEvent(new Project.NameKey(c.project), c._number, event.getWho());
   }
 
@@ -152,7 +136,7 @@
 
       final Change change = changeData.change();
       final Runnable task =
-          reviewersFactory.create(change, toAccounts(reviewDb, reviewers, projectName, uploader));
+          reviewersFactory.create(change, toAccounts(reviewers, projectName, uploader));
 
       workQueue
           .getDefaultQueue()
@@ -239,18 +223,17 @@
     return filterPredicate.asMatchable().match(changeData);
   }
 
-  private Set<Account> toAccounts(
-      ReviewDb reviewDb, Set<String> in, Project.NameKey p, AccountInfo uploader) {
+  private Set<Account> toAccounts(Set<String> in, Project.NameKey p, AccountInfo uploader) {
     Set<Account> reviewers = Sets.newHashSetWithExpectedSize(in.size());
     GroupMembers groupMembers = null;
     for (String r : in) {
       try {
-        Account account = accountResolver.find(reviewDb, r);
+        Account account = accountResolver.find(r);
         if (account != null) {
           reviewers.add(account);
           continue;
         }
-      } catch (OrmException e) {
+      } catch (OrmException | IOException | ConfigInvalidException e) {
         // If the account doesn't exist, find() will return null.  We only
         // get here if something went wrong accessing the database
         log.error("Failed to resolve account " + r, e);
@@ -261,12 +244,12 @@
         // "Full name <email>" to increase chance of finding only one.
         String uploaderNameEmail = String.format("%s <%s>", uploader.name, uploader.email);
         try {
-          Account uploaderAccount = accountResolver.findByNameOrEmail(reviewDb, uploaderNameEmail);
+          Account uploaderAccount = accountResolver.findByNameOrEmail(uploaderNameEmail);
           if (uploaderAccount != null) {
             groupMembers =
                 groupMembersFactory.create(identifiedUserFactory.create(uploaderAccount.getId()));
           }
-        } catch (OrmException e) {
+        } catch (OrmException | IOException e) {
           log.warn(
               String.format(
                   "Failed to list accounts for group %s, cannot retrieve uploader account %s",
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/Module.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/Module.java
index 0764524..98dad1b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/Module.java
@@ -18,7 +18,6 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.extensions.events.DraftPublishedListener;
 import com.google.gerrit.extensions.events.RevisionCreatedListener;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.extensions.restapi.RestApiModule;
@@ -53,7 +52,6 @@
     }
 
     DynamicSet.bind(binder(), RevisionCreatedListener.class).to(ChangeEventListener.class);
-    DynamicSet.bind(binder(), DraftPublishedListener.class).to(ChangeEventListener.class);
     factory(DefaultReviewers.Factory.class);
     factory(ReviewersConfig.Factory.class);
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/PutReviewers.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/PutReviewers.java
index 48c35fb..69eba6a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/PutReviewers.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/PutReviewers.java
@@ -56,7 +56,6 @@
   private final ProjectCache projectCache;
   private final AccountResolver accountResolver;
   private final Provider<GroupsCollection> groupsCollection;
-  private final Provider<ReviewDb> reviewDbProvider;
 
   @Inject
   PutReviewers(
@@ -73,7 +72,6 @@
     this.projectCache = projectCache;
     this.accountResolver = accountResolver;
     this.groupsCollection = groupsCollection;
-    this.reviewDbProvider = reviewDbProvider;
   }
 
   @Override
@@ -136,7 +134,7 @@
 
   private void validateReviewer(String reviewer) throws RestApiException {
     try {
-      Account account = accountResolver.find(reviewDbProvider.get(), reviewer);
+      Account account = accountResolver.find(reviewer);
       if (account == null) {
         try {
           groupsCollection.get().parse(reviewer);
@@ -144,7 +142,7 @@
           throw new ResourceNotFoundException("Account or group " + reviewer + " not found");
         }
       }
-    } catch (OrmException e) {
+    } catch (OrmException | IOException | ConfigInvalidException e) {
       log.error("Failed to resolve account " + reviewer);
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/reviewers/SuggestProjectReviewers.java b/src/main/java/com/googlesource/gerrit/plugins/reviewers/SuggestProjectReviewers.java
index f71c591..4212e61 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/SuggestProjectReviewers.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/SuggestProjectReviewers.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.reviewers;
 
+import com.google.gerrit.extensions.common.AccountVisibility;
 import com.google.gerrit.extensions.common.SuggestedReviewerInfo;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.RestReadView;
@@ -22,41 +23,50 @@
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.ReviewersUtil;
 import com.google.gerrit.server.ReviewersUtil.VisibilityControl;
-import com.google.gerrit.server.account.AccountVisibility;
 import com.google.gerrit.server.change.SuggestReviewers;
 import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.ProjectPermission;
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import java.io.IOException;
 import java.util.List;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Config;
 
 public class SuggestProjectReviewers extends SuggestReviewers
     implements RestReadView<ProjectResource> {
+  private final PermissionBackend permissionBackend;
+
   @Inject
   SuggestProjectReviewers(
       AccountVisibility av,
       IdentifiedUser.GenericFactory identifiedUserFactory,
       Provider<ReviewDb> dbProvider,
       @GerritServerConfig Config cfg,
-      ReviewersUtil reviewersUtil) {
+      ReviewersUtil reviewersUtil,
+      PermissionBackend permissionBackend) {
     super(av, identifiedUserFactory, dbProvider, cfg, reviewersUtil);
+    this.permissionBackend = permissionBackend;
   }
 
   @Override
   public List<SuggestedReviewerInfo> apply(ProjectResource rsrc)
-      throws BadRequestException, OrmException, IOException {
-    return reviewersUtil.suggestReviewers(null, this, rsrc.getControl(), getVisibility(rsrc), true);
+      throws BadRequestException, OrmException, IOException, ConfigInvalidException {
+    return reviewersUtil.suggestReviewers(
+        null, this, rsrc.getProjectState(), getVisibility(rsrc), true);
   }
 
   private VisibilityControl getVisibility(final ProjectResource rsrc) {
     return new VisibilityControl() {
       @Override
       public boolean isVisibleTo(Account.Id account) throws OrmException {
-        IdentifiedUser who = identifiedUserFactory.create(account);
-        return rsrc.getControl().forUser(who).isVisible();
+        return permissionBackend
+            .user(identifiedUserFactory.create(account))
+            .project(rsrc.getNameKey())
+            .testOrFalse(ProjectPermission.ACCESS);
       }
     };
   }
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 5fe2cb8..e2112fb 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -8,7 +8,6 @@
   [reviewers]
     enableREST = true
     enableUI = false
-    ignoreDrafts = true
 ```
 
 reviewers.enableREST
@@ -19,12 +18,6 @@
 :	Enable the UI.  When set to false, the 'Reviewers' menu is not displayed
 	on the project screen. Defaults to true, or false when `enableREST` is false.
 
-reviewers.ignoreDrafts
-:	Ignore draft changes. When set to true draft changes are not considered when
-	adding reviewers. Defaults to false. To ignore drafts on a per-project basis
-	set this value to false and add "-status:draft" to filter in relevant projects.
-
-
 Per project configuration of the @PLUGIN@ plugin is done in the
 `reviewers.config` file of the project. Missing values are inherited
 from the parent projects. This means a global default configuration can
@@ -42,8 +35,6 @@
   [filter "branch:stable-2.10"]
     reviewer = QAGroup
 
-  [filter "-status:draft"]
-    reviewer = DevGroup
 ```
 
 filter.\<filter\>.reviewer