Merge branch 'stable-2.14' into stable-2.15

* stable-2.14:
  BUILD: Remove inaccurate SNAPSHOT suffix from manifest version
  Upgrade bazlets to latest stable-2.14 to build with 2.14.18 API

Change-Id: Iadaa58ddec954f882dd4aea6ce234a4fe124e82a
diff --git a/.gitignore b/.gitignore
index f07afcd..6042b9d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,6 @@
 *.ipr
 .idea
 /.classpath
-/.primary_build_tool
 /.project
 /.settings/
 /bazel-*
diff --git a/WORKSPACE b/WORKSPACE
index 4482bd9..9b89653 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,7 +3,7 @@
 load("//:bazlets.bzl", "load_bazlets")
 
 load_bazlets(
-    commit = "2c39029a585bd1d5b785150948f162730f7b7e42",
+    commit = "b54eaed487d37188120da6933b97c571519954ca",
     #local_path = "/home/<user>/projects/bazlets",
 )
 
diff --git a/owners-autoassign/BUILD b/owners-autoassign/BUILD
index 1dfc3a3..05eeb89 100644
--- a/owners-autoassign/BUILD
+++ b/owners-autoassign/BUILD
@@ -5,12 +5,13 @@
     srcs = glob([
         "src/main/java/**/*.java",
     ]),
+    dir_name = "owners",
     manifest_entries = [
         "Implementation-Title: Gerrit OWNERS autoassign plugin",
         "Implementation-URL: https://gerrit.googlesource.com/plugins/owners",
         "Gerrit-PluginName: owners-autoassign",
         "Gerrit-Module: com.vmware.gerrit.owners.common.AutoassignModule",
-        "Gerrit-ApiVersion: 2.14",
+        "Gerrit-ApiVersion: 2.15",
     ],
     resources = glob(["src/main/**/*"]),
     deps = [
diff --git a/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java b/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java
index aeb5960..67fdb1e 100644
--- a/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java
+++ b/owners-autoassign/src/main/java/com/vmware/gerrit/owners/common/GitRefListener.java
@@ -120,7 +120,7 @@
       newId = ObjectId.fromString(event.getNewObjectId());
     }
 
-    PatchListKey plKey = new PatchListKey(null, newId, IGNORE_NONE);
+    PatchListKey plKey = PatchListKey.againstCommit(null, newId, IGNORE_NONE);
     try {
       return patchListCache.get(plKey, change.getProject());
     } catch (PatchListNotAvailableException e) {
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java
index 07e9af8..cef57e0 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java
@@ -14,8 +14,8 @@
 
 package com.vmware.gerrit.owners.common;
 
-import static com.google.gerrit.server.account.ExternalId.SCHEME_GERRIT;
-import static com.google.gerrit.server.account.ExternalId.SCHEME_MAILTO;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_GERRIT;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_MAILTO;
 
 import com.google.gerrit.common.errors.NoSuchGroupException;
 import com.google.gerrit.reviewdb.client.Account;
@@ -25,9 +25,10 @@
 import com.google.gerrit.server.account.AccountCache;
 import com.google.gerrit.server.account.AccountResolver;
 import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.ExternalId;
 import com.google.gerrit.server.account.GroupCache;
 import com.google.gerrit.server.account.GroupMembers;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.group.InternalGroup;
 import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.gerrit.server.util.ManualRequestContext;
 import com.google.gerrit.server.util.OneOffRequestContext;
@@ -38,6 +39,7 @@
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -76,19 +78,22 @@
   }
 
   private Set<Id> findAccountsInGroup(String groupNameOrUUID) {
-    AccountGroup group =
-        Optional.ofNullable(groupCache.get(new AccountGroup.NameKey(groupNameOrUUID)))
+    Optional<InternalGroup> group =
+        groupCache
+            .get(new AccountGroup.NameKey(groupNameOrUUID))
+            .map(Optional::of)
             .orElse(groupCache.get(new AccountGroup.UUID(groupNameOrUUID)));
 
-    if (group == null) {
+    if (!group.isPresent()) {
       log.warn("Group {} was not found", groupNameOrUUID);
+      return Collections.emptySet();
     }
 
     try (ManualRequestContext ctx = oneOffRequestContext.openAs(adminUser.getAccountId())) {
 
       return groupMembers
           .create(adminUser)
-          .listAccounts(group.getGroupUUID(), null)
+          .listAccounts(group.get().getGroupUUID(), null)
           .stream()
           .map(Account::getId)
           .collect(Collectors.toSet());
@@ -100,7 +105,7 @@
 
   private Set<Account.Id> findUserOrEmail(String nameOrEmail) {
     try (ManualRequestContext ctx = oneOffRequestContext.open()) {
-      Set<Id> accountIds = resolver.findAll(ctx.getReviewDbProvider().get(), nameOrEmail);
+      Set<Id> accountIds = resolver.findAll(nameOrEmail);
       if (accountIds.isEmpty()) {
         log.warn("User '{}' does not resolve to any account.", nameOrEmail);
         return accountIds;
@@ -132,16 +137,18 @@
       }
 
       return accountIds;
-    } catch (OrmException e) {
+    } catch (OrmException | IOException | ConfigInvalidException e) {
       log.error("Error trying to resolve user " + nameOrEmail, e);
       return Collections.emptySet();
     }
   }
 
   private boolean isFullMatch(Account.Id id, String nameOrEmail) {
-    AccountState account = byId.get(id);
-    return isFullNameMatch(account, nameOrEmail)
-        || account
+    AccountState accountState = byId.get(id);
+    Account account = accountState.getAccount();
+    return isFullNameMatch(accountState, nameOrEmail)
+        || nameOrEmail.equalsIgnoreCase(account.getPreferredEmail())
+        || accountState
             .getExternalIds()
             .stream()
             .anyMatch(eid -> isEMailMatch(eid, nameOrEmail) || isUsernameMatch(eid, nameOrEmail));
diff --git a/owners/BUILD b/owners/BUILD
index 8068969..d0c1efc 100644
--- a/owners/BUILD
+++ b/owners/BUILD
@@ -35,7 +35,7 @@
         "Implementation-URL: https://gerrit.googlesource.com/plugins/owners",
         "Gerrit-PluginName: owners",
         "Gerrit-Module: com.vmware.gerrit.owners.OwnersModule",
-        "Gerrit-ApiVersion: 2.14",
+        "Gerrit-ApiVersion: 2.15",
     ],
     resources = glob(["src/main/resources/**/*"]),
     deps = [
diff --git a/tools/workspace-status.sh b/tools/workspace-status.sh
index 35966f1..83f9cdc 100755
--- a/tools/workspace-status.sh
+++ b/tools/workspace-status.sh
@@ -14,4 +14,4 @@
   cd $1; git describe --always --match "v[0-9].*" --dirty
 }
 
-echo STABLE_BUILD_OWNERS-AUTOASSIGN_LABEL $(rev .)
+echo STABLE_BUILD_OWNERS_LABEL $(rev .)