Merge branch 'stable-2.11' into stable-2.12

* stable-2.11:
  CurrentSchemaVersion: Allow to use it in plugins
  Use REST implementation to list members for label with group operator
  InitAdminUser: Don't assume the group ID of the Administrators group

Change-Id: I1a24005e3eb0edaca259f65ff15258e2107112e6
This commit is contained in:
David Pursehouse
2015-11-30 10:58:02 +09:00
5 changed files with 37 additions and 66 deletions

View File

@@ -25,6 +25,7 @@ import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountExternalId;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.AccountGroupMember;
import com.google.gerrit.reviewdb.client.AccountGroupName;
import com.google.gerrit.reviewdb.client.AccountSshKey;
import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.reviewdb.server.ReviewDb;
@@ -101,9 +102,11 @@ public class InitAdminUser implements InitStep {
a.setPreferredEmail(email);
db.accounts().insert(Collections.singleton(a));
AccountGroupName adminGroup = db.accountGroupNames().get(
new AccountGroup.NameKey("Administrators"));
AccountGroupMember m =
new AccountGroupMember(new AccountGroupMember.Key(id,
new AccountGroup.Id(1)));
adminGroup.getId()));
db.accountGroupMembers().insert(Collections.singleton(m));
if (sshKey != null) {

View File

@@ -26,7 +26,7 @@ public final class CurrentSchemaVersion {
private static final String VALUE = "X";
@Column(id = 1, length = 1)
protected String one = VALUE;
public String one = VALUE;
public Key() {
}
@@ -50,12 +50,12 @@ public final class CurrentSchemaVersion {
}
@Column(id = 1)
protected Key singleton;
public Key singleton;
/** Current version number of the schema. */
@Column(id = 2)
public transient int versionNbr;
protected CurrentSchemaVersion() {
public CurrentSchemaVersion() {
}
}

View File

@@ -58,8 +58,9 @@ public class ListMembers implements RestReadView<GroupResource> {
this.accountLoader = accountLoaderFactory.create(true);
}
public void setRecursive(boolean recursive) {
public ListMembers setRecursive(boolean recursive) {
this.recursive = recursive;
return this;
}
@Override

View File

@@ -17,18 +17,16 @@ package com.google.gerrit.server.query.change;
import static com.google.gerrit.server.query.change.ChangeData.asChanges;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.gerrit.common.data.GroupDetail;
import com.google.gerrit.common.data.GroupReference;
import com.google.gerrit.common.errors.NoSuchGroupException;
import com.google.gerrit.common.errors.NotSignedInException;
import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.AccountGroupById;
import com.google.gerrit.reviewdb.client.AccountGroupMember;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.RefNames;
@@ -42,8 +40,6 @@ import com.google.gerrit.server.account.GroupBackend;
import com.google.gerrit.server.account.GroupBackends;
import com.google.gerrit.server.account.VersionedAccountDestinations;
import com.google.gerrit.server.account.VersionedAccountQueries;
import com.google.gerrit.server.account.GroupCache;
import com.google.gerrit.server.account.GroupDetailFactory;
import com.google.gerrit.server.change.ChangeTriplet;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.AllUsersName;
@@ -52,6 +48,7 @@ import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.TrackingFooters;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.strategy.SubmitStrategyFactory;
import com.google.gerrit.server.group.ListMembers;
import com.google.gerrit.server.index.ChangeIndex;
import com.google.gerrit.server.index.FieldDef;
import com.google.gerrit.server.index.IndexCollection;
@@ -155,7 +152,6 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
final Provider<InternalChangeQuery> queryProvider;
final IndexRewriter rewriter;
final IdentifiedUser.GenericFactory userFactory;
final GroupDetailFactory.Factory groupDetailFactory;
final CapabilityControl.Factory capabilityControlFactory;
final ChangeControl.GenericFactory changeControlGenericFactory;
final ChangeData.Factory changeDataFactory;
@@ -168,14 +164,14 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
final PatchListCache patchListCache;
final GitRepositoryManager repoManager;
final ProjectCache projectCache;
final GroupCache groupCache;
final Provider<ListChildProjects> listChildProjects;
final SubmitStrategyFactory submitStrategyFactory;
final ConflictsCache conflictsCache;
final TrackingFooters trackingFooters;
final boolean allowsDrafts;
final ChangeIndex index;
final IndexConfig indexConfig;
final Provider<ListMembers> listMembers;
final boolean allowsDrafts;
private final Provider<CurrentUser> self;
@@ -187,7 +183,6 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
IdentifiedUser.GenericFactory userFactory,
Provider<CurrentUser> self,
CapabilityControl.Factory capabilityControlFactory,
GroupDetailFactory.Factory groupDetailFactory,
ChangeControl.GenericFactory changeControlGenericFactory,
ChangeData.Factory changeDataFactory,
FieldDef.FillArgs fillArgs,
@@ -199,22 +194,22 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
PatchListCache patchListCache,
GitRepositoryManager repoManager,
ProjectCache projectCache,
GroupCache groupCache,
Provider<ListChildProjects> listChildProjects,
IndexCollection indexes,
SubmitStrategyFactory submitStrategyFactory,
ConflictsCache conflictsCache,
TrackingFooters trackingFooters,
IndexConfig indexConfig,
Provider<ListMembers> listMembers,
@GerritServerConfig Config cfg) {
this(db, queryProvider, rewriter, userFactory, self,
capabilityControlFactory, groupDetailFactory, changeControlGenericFactory,
capabilityControlFactory, changeControlGenericFactory,
changeDataFactory, fillArgs, plcUtil, accountResolver, groupBackend,
allProjectsName, allUsersName, patchListCache, repoManager,
projectCache, groupCache, listChildProjects, submitStrategyFactory,
projectCache, listChildProjects, submitStrategyFactory,
conflictsCache, trackingFooters,
indexes != null ? indexes.getSearchIndex() : null,
indexConfig,
indexConfig, listMembers,
cfg == null ? true : cfg.getBoolean("change", "allowDrafts", true));
}
@@ -225,7 +220,6 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
IdentifiedUser.GenericFactory userFactory,
Provider<CurrentUser> self,
CapabilityControl.Factory capabilityControlFactory,
GroupDetailFactory.Factory groupDetailFactory,
ChangeControl.GenericFactory changeControlGenericFactory,
ChangeData.Factory changeDataFactory,
FieldDef.FillArgs fillArgs,
@@ -237,13 +231,13 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
PatchListCache patchListCache,
GitRepositoryManager repoManager,
ProjectCache projectCache,
GroupCache groupCache,
Provider<ListChildProjects> listChildProjects,
SubmitStrategyFactory submitStrategyFactory,
ConflictsCache conflictsCache,
TrackingFooters trackingFooters,
ChangeIndex index,
IndexConfig indexConfig,
Provider<ListMembers> listMembers,
boolean allowsDrafts) {
this.db = db;
this.queryProvider = queryProvider;
@@ -251,7 +245,6 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
this.userFactory = userFactory;
this.self = self;
this.capabilityControlFactory = capabilityControlFactory;
this.groupDetailFactory = groupDetailFactory;
this.changeControlGenericFactory = changeControlGenericFactory;
this.changeDataFactory = changeDataFactory;
this.fillArgs = fillArgs;
@@ -263,24 +256,25 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
this.patchListCache = patchListCache;
this.repoManager = repoManager;
this.projectCache = projectCache;
this.groupCache = groupCache;
this.listChildProjects = listChildProjects;
this.submitStrategyFactory = submitStrategyFactory;
this.conflictsCache = conflictsCache;
this.trackingFooters = trackingFooters;
this.allowsDrafts = allowsDrafts;
this.index = index;
this.indexConfig = indexConfig;
this.listMembers = listMembers;
this.allowsDrafts = allowsDrafts;
}
Arguments asUser(CurrentUser otherUser) {
return new Arguments(db, queryProvider, rewriter, userFactory,
Providers.of(otherUser),
capabilityControlFactory, groupDetailFactory, changeControlGenericFactory,
capabilityControlFactory, changeControlGenericFactory,
changeDataFactory, fillArgs, plcUtil, accountResolver, groupBackend,
allProjectsName, allUsersName, patchListCache, repoManager,
projectCache, groupCache, listChildProjects, submitStrategyFactory,
conflictsCache, trackingFooters, index, indexConfig, allowsDrafts);
projectCache, listChildProjects, submitStrategyFactory,
conflictsCache, trackingFooters, index, indexConfig, listMembers,
allowsDrafts);
}
Arguments asUser(Account.Id otherId) {
@@ -603,8 +597,15 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
// expand a group predicate into multiple user predicates
if (group != null) {
Set<Account.Id> allMembers = getMemberIds(
group, new HashSet<AccountGroup.UUID>());
Set<Account.Id> allMembers =
new HashSet<>(Lists.transform(
args.listMembers.get().setRecursive(true).apply(group),
new Function<AccountInfo, Account.Id>() {
@Override
public Account.Id apply(AccountInfo accountInfo) {
return new Account.Id(accountInfo._accountId);
}
}));
int maxTerms = args.indexConfig.maxLimit();
if (allMembers.size() > maxTerms) {
// limit the number of query terms otherwise Gerrit will barf
@@ -951,39 +952,6 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
return g;
}
private Set<Account.Id> getMemberIds(AccountGroup.UUID groupUUID,
Set<AccountGroup.UUID> seenGroups) throws OrmException {
seenGroups.add(groupUUID);
Set<Account.Id> members = new HashSet<>();
AccountGroup group = args.groupCache.get(groupUUID);
if (group != null) {
try {
GroupDetail groupDetail =
args.groupDetailFactory.create(group.getId()).call();
if (groupDetail.members != null) {
for (AccountGroupMember m : groupDetail.members) {
if (!members.contains(m.getAccountId())) {
members.add(m.getAccountId());
}
}
}
// Get members of subgroups
if (groupDetail.includes != null) {
for (AccountGroupById includedGroup : groupDetail.includes) {
if (!seenGroups.contains(includedGroup.getIncludeUUID())) {
members.addAll(
getMemberIds(includedGroup.getIncludeUUID(), seenGroups));
}
}
}
} catch (NoSuchGroupException e) {
// The included group is not visible
}
}
return members;
}
private List<Change> parseChange(String value) throws OrmException,
QueryParseException {
if (PAT_LEGACY_ID.matcher(value).matches()) {

View File

@@ -25,10 +25,9 @@ public class FakeQueryBuilder extends ChangeQueryBuilder {
super(
new FakeQueryBuilder.Definition<>(
FakeQueryBuilder.class),
new ChangeQueryBuilder.Arguments(null, null, null, null,
null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, indexes, null,
null, null, null, null));
new ChangeQueryBuilder.Arguments(null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null,
null, indexes, null, null, null, null, null, null));
}
@Operator