Merge branch 'stable-2.14'
* stable-2.14:
Use latest bazlets
Change-Id: If67de5f197d3fac56eec7e23bd723a4e2c76ffc3
diff --git a/WORKSPACE b/WORKSPACE
index b3bbd35..e2154a3 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,30 +3,30 @@
load("//:bazlets.bzl", "load_bazlets")
load_bazlets(
- commit = "e57da7c1ddde1389c15c86154a2ac4019099b050",
+ commit = "42bffc66c0e92753133e4cea2debe65abc359c4d",
# local_path = "/home/<user>/projects/bazlets",
)
# Release Plugin API
-load(
- "@com_googlesource_gerrit_bazlets//:gerrit_api.bzl",
- "gerrit_api",
-)
+#load(
+# "@com_googlesource_gerrit_bazlets//:gerrit_api.bzl",
+# "gerrit_api",
+#)
# Snapshot Plugin API
-#load(
-# "@com_googlesource_gerrit_bazlets//:gerrit_api_maven_local.bzl",
-# "gerrit_api_maven_local",
-#)
+load(
+ "@com_googlesource_gerrit_bazlets//:gerrit_api_maven_local.bzl",
+ "gerrit_api_maven_local",
+)
load(
"@com_googlesource_gerrit_bazlets//:gerrit_gwt.bzl",
"gerrit_gwt",
)
# Load release Plugin API
-gerrit_api()
+#gerrit_api()
# Load snapshot Plugin API
-#gerrit_api_maven_local()
+gerrit_api_maven_local()
gerrit_gwt()
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..ff0fa3d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/reviewers/PutReviewers.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/reviewers/PutReviewers.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.reviewers;
import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestApiException;
@@ -22,10 +23,12 @@
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.account.AccountResolver;
import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gerrit.server.group.GroupsCollection;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.project.ProjectResource;
import com.google.gwtorm.server.OrmException;
@@ -56,7 +59,7 @@
private final ProjectCache projectCache;
private final AccountResolver accountResolver;
private final Provider<GroupsCollection> groupsCollection;
- private final Provider<ReviewDb> reviewDbProvider;
+ private final PermissionBackend permissionBackend;
@Inject
PutReviewers(
@@ -66,22 +69,31 @@
ProjectCache projectCache,
AccountResolver accountResolver,
Provider<GroupsCollection> groupsCollection,
- Provider<ReviewDb> reviewDbProvider) {
+ PermissionBackend permissionBackend) {
this.pluginName = pluginName;
this.configFactory = configFactory;
this.metaDataUpdateFactory = metaDataUpdateFactory;
this.projectCache = projectCache;
this.accountResolver = accountResolver;
this.groupsCollection = groupsCollection;
- this.reviewDbProvider = reviewDbProvider;
+ this.permissionBackend = permissionBackend;
}
@Override
public List<ReviewerFilterSection> apply(ProjectResource rsrc, Input input)
- throws RestApiException {
+ throws RestApiException, PermissionBackendException {
Project.NameKey projectName = rsrc.getNameKey();
ReviewersConfig cfg = configFactory.create(projectName);
- if (!rsrc.getControl().isOwner() || cfg == null) {
+ try {
+ permissionBackend
+ .user(rsrc.getUser())
+ .project(rsrc.getNameKey())
+ .check(ProjectPermission.WRITE_CONFIG);
+ } catch (AuthException e) {
+ throw new ResourceNotFoundException("Project" + projectName.get() + " not found");
+ }
+
+ if (cfg == null) {
throw new ResourceNotFoundException("Project" + projectName.get() + " not found");
}
@@ -136,7 +148,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 +156,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