Merge changes I745e780e,Ib9950272
* changes:
Get all projects from ProjectCache instead of GitRepositoryManager
Create SubmoduleSectionParser using assisted injection
diff --git a/Documentation/cmd-stream-events.txt b/Documentation/cmd-stream-events.txt
index c754f35..dcdbb07 100644
--- a/Documentation/cmd-stream-events.txt
+++ b/Documentation/cmd-stream-events.txt
@@ -153,6 +153,19 @@
eventCreatedOn:: Time in seconds since the UNIX epoch when this event was
created.
+=== Project Created
+
+Sent when a new project has been created.
+
+type:: "project-created"
+
+projectName:: The created project name
+
+projectHead:: The created project head name
+
+eventCreatedOn:: Time in seconds since the UNIX epoch when this event was
+created.
+
=== Merge Failed
Sent when a change has failed to be merged into the git repository.
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index dab0f5e..742d996 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -1832,6 +1832,11 @@
Optional filename for the hashtags changed hook, if not specified then
`hashtags-changed` will be used.
+[[hooks.projectCreatedHook]]hooks.projectCreatedHook::
++
+Optional filename for the project created hook, if not specified then
+`project-created` will be used.
+
[[hooks.mergeFailedHook]]hooks.mergeFailedHook::
+
Optional filename for the merge failed hook, if not specified then
diff --git a/Documentation/config-hooks.txt b/Documentation/config-hooks.txt
index 5666dff..d4f53bf 100644
--- a/Documentation/config-hooks.txt
+++ b/Documentation/config-hooks.txt
@@ -110,6 +110,14 @@
ref-updated --oldrev <old rev> --newrev <new rev> --refname <ref name> --project <project name> --submitter <submitter>
====
+=== project-created
+
+Called whenever a project has been created.
+
+====
+ project-created --project <project name> --head <head name>
+====
+
=== reviewer-added
Called whenever a reviewer is added to a change.
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.java
index 93db1a7..8cf3a0c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.java
@@ -19,8 +19,8 @@
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.GitwebLink;
import com.google.gerrit.client.WebLinkInfo;
-import com.google.gerrit.client.actions.ActionInfo;
import com.google.gerrit.client.account.AccountInfo;
+import com.google.gerrit.client.actions.ActionInfo;
import com.google.gerrit.client.changes.ChangeInfo;
import com.google.gerrit.client.changes.ChangeInfo.CommitInfo;
import com.google.gerrit.client.changes.ChangeInfo.GitPerson;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeInfo.java
index 9d5fc6b..a4f2e3f 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeInfo.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeInfo.java
@@ -149,10 +149,11 @@
* if no label is missing, or if more than one label is missing.
*/
public final int getMissingLabelIndex() {
- int i = 0;
+ int i = -1;
int ret = -1;
List<LabelInfo> labels = Natives.asList(all_labels().values());
for (LabelInfo label : labels) {
+ i++;
if (!permitted_labels().containsKey(label.name())) {
continue;
}
@@ -183,7 +184,6 @@
set_submittable(false);
return -1;
}
- i++;
}
set_submittable(ret == -1);
return ret;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java
index 3a58373..19c3145 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java
@@ -20,6 +20,7 @@
import com.google.gerrit.common.data.LabelType;
import com.google.gerrit.common.data.LabelTypes;
import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.events.NewProjectCreatedListener;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.reviewdb.client.Account;
@@ -40,11 +41,11 @@
import com.google.gerrit.server.events.ChangeRestoredEvent;
import com.google.gerrit.server.events.CommentAddedEvent;
import com.google.gerrit.server.events.DraftPublishedEvent;
-import com.google.gerrit.server.events.Event;
import com.google.gerrit.server.events.EventFactory;
import com.google.gerrit.server.events.HashtagsChangedEvent;
import com.google.gerrit.server.events.MergeFailedEvent;
import com.google.gerrit.server.events.PatchSetCreatedEvent;
+import com.google.gerrit.server.events.ProjectCreatedEvent;
import com.google.gerrit.server.events.RefUpdatedEvent;
import com.google.gerrit.server.events.ReviewerAddedEvent;
import com.google.gerrit.server.events.TopicChangedEvent;
@@ -89,7 +90,7 @@
/** Spawns local executables when a hook action occurs. */
@Singleton
public class ChangeHookRunner implements ChangeHooks, EventDispatcher,
- EventSource, LifecycleListener {
+ EventSource, LifecycleListener, NewProjectCreatedListener {
/** A logger for this class. */
private static final Logger log = LoggerFactory.getLogger(ChangeHookRunner.class);
@@ -100,6 +101,7 @@
bind(ChangeHooks.class).to(ChangeHookRunner.class);
bind(EventDispatcher.class).to(ChangeHookRunner.class);
bind(EventSource.class).to(ChangeHookRunner.class);
+ DynamicSet.bind(binder(), NewProjectCreatedListener.class).to(ChangeHookRunner.class);
listener().to(ChangeHookRunner.class);
}
}
@@ -209,6 +211,9 @@
/** Path of the hashtags changed hook */
private final Path hashtagsChangedHook;
+ /** Path of the project created hook. */
+ private final Path projectCreatedHook;
+
private final String anonymousCowardName;
/** Repository Manager. */
@@ -282,6 +287,7 @@
claSignedHook = hook(config, hooksPath, "cla-signed");
refUpdateHook = hook(config, hooksPath, "ref-update");
hashtagsChangedHook = hook(config, hooksPath, "hashtags-changed");
+ projectCreatedHook = hook(config, hooksPath, "project-created");
syncHookTimeout = config.getInt("hooks", "syncHookTimeout", 30);
syncHookThreadPool = Executors.newCachedThreadPool(
@@ -346,6 +352,20 @@
return runSyncHook(project.getNameKey(), refUpdateHook, args);
}
+ @Override
+ public void doProjectCreatedHook(Project.NameKey project, String headName) {
+ ProjectCreatedEvent event = new ProjectCreatedEvent();
+ event.projectName = project.get();
+ event.headName = headName;
+ fireEvent(project, event);
+
+ List<String> args = new ArrayList<>();
+ addArg(args, "--project", project.get());
+ addArg(args, "--head", headName);
+
+ runHook(project, projectCreatedHook, args);
+ }
+
/**
* Fire the Patchset Created Hook.
*
@@ -695,24 +715,24 @@
}
@Override
- public void postEvent(Change change, Event event, ReviewDb db)
- throws OrmException {
+ public void postEvent(Change change, com.google.gerrit.server.events.Event event,
+ ReviewDb db) throws OrmException {
fireEvent(change, event, db);
}
@Override
- public void postEvent(Branch.NameKey branchName, Event event) {
+ public void postEvent(Branch.NameKey branchName, com.google.gerrit.server.events.Event event) {
fireEvent(branchName, event);
}
- private void fireEventForUnrestrictedListeners(Event event) {
+ private void fireEventForUnrestrictedListeners(com.google.gerrit.server.events.Event event) {
for (EventListener listener : unrestrictedListeners) {
listener.onEvent(event);
}
}
- private void fireEvent(Change change, Event event, ReviewDb db)
- throws OrmException {
+ private void fireEvent(Change change, com.google.gerrit.server.events.Event event,
+ ReviewDb db) throws OrmException {
for (EventListenerHolder holder : listeners.values()) {
if (isVisibleTo(change, holder.user, db)) {
holder.listener.onEvent(event);
@@ -722,7 +742,32 @@
fireEventForUnrestrictedListeners( event );
}
- private void fireEvent(Branch.NameKey branchName, Event event) {
+ private void fireEvent(Project.NameKey project, ProjectCreatedEvent event) {
+ for (EventListenerHolder holder : listeners.values()) {
+ if (isVisibleTo(project, event, holder.user)) {
+ holder.listener.onEvent(event);
+ }
+ }
+
+ fireEventForUnrestrictedListeners(event);
+ }
+
+ private void fireEventForUnrestrictedListeners(ProjectCreatedEvent event) {
+ for (EventListener listener : unrestrictedListeners) {
+ listener.onEvent(event);
+ }
+ }
+
+ private boolean isVisibleTo(Project.NameKey project, ProjectCreatedEvent event, CurrentUser user) {
+ ProjectState pe = projectCache.get(project);
+ if (pe == null) {
+ return false;
+ }
+ ProjectControl pc = pe.controlFor(user);
+ return pc.controlForRef(event.getHeadName()).isVisible();
+ }
+
+ private void fireEvent(Branch.NameKey branchName, com.google.gerrit.server.events.Event event) {
for (EventListenerHolder holder : listeners.values()) {
if (isVisibleTo(branchName, holder.user)) {
holder.listener.onEvent(event);
@@ -995,4 +1040,10 @@
super.runHook();
}
}
+
+ @Override
+ public void onNewProjectCreated(NewProjectCreatedListener.Event event) {
+ Project.NameKey project = new Project.NameKey(event.getProjectName());
+ doProjectCreatedHook(project, event.getHeadName());
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHooks.java b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHooks.java
index 7f7e8b2..b16a8a5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHooks.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHooks.java
@@ -181,4 +181,12 @@
public void doHashtagsChangedHook(Change change, Account account,
Set<String>added, Set<String> removed, Set<String> hashtags,
ReviewDb db) throws OrmException;
+
+ /**
+ * Fire the project created hook
+ *
+ * @param project The project that was created
+ * @param headName The head name of the created project
+ */
+ public void doProjectCreatedHook(Project.NameKey project, String headName);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/DisabledChangeHooks.java b/gerrit-server/src/main/java/com/google/gerrit/common/DisabledChangeHooks.java
index 156672e..bed77a7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/common/DisabledChangeHooks.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/common/DisabledChangeHooks.java
@@ -114,6 +114,10 @@
}
@Override
+ public void doProjectCreatedHook(Project.NameKey project, String headName) {
+ }
+
+ @Override
public void postEvent(Change change, Event event, ReviewDb db) {
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventTypes.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventTypes.java
index 908fd0a..9b37c38 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventTypes.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventTypes.java
@@ -35,6 +35,7 @@
registerClass(new ReviewerAddedEvent());
registerClass(new PatchSetCreatedEvent());
registerClass(new TopicChangedEvent());
+ registerClass(new ProjectCreatedEvent());
}
/** Register an event.
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectCreatedEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectCreatedEvent.java
new file mode 100644
index 0000000..c1534df
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/ProjectCreatedEvent.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2015 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.events;
+
+import com.google.gerrit.reviewdb.client.Project;
+
+public class ProjectCreatedEvent extends ProjectEvent {
+ public String projectName;
+ public String headName;
+
+ public ProjectCreatedEvent() {
+ super("project-created");
+ }
+
+ @Override
+ public Project.NameKey getProjectNameKey() {
+ return new Project.NameKey(projectName);
+ }
+
+ public String getHeadName() {
+ return headName;
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseIfNecessary.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseIfNecessary.java
index a0fac39..e6fff19 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseIfNecessary.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseIfNecessary.java
@@ -19,8 +19,8 @@
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.change.RebaseChange;
import com.google.gerrit.server.change.PatchSetInserter.ValidatePolicy;
+import com.google.gerrit.server.change.RebaseChange;
import com.google.gerrit.server.git.CodeReviewCommit;
import com.google.gerrit.server.git.CommitMergeStatus;
import com.google.gerrit.server.git.MergeConflictException;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java
index 0040762..43b8c8d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java
@@ -146,18 +146,26 @@
}
};
+ @Deprecated
/** Topic, a short annotation on the branch. */
- public static final FieldDef<ChangeData, String> TOPIC =
+ public static final FieldDef<ChangeData, String> LEGACY_TOPIC =
new FieldDef.Single<ChangeData, String>(
"topic2", FieldType.EXACT, false) {
@Override
public String get(ChangeData input, FillArgs args)
throws OrmException {
- Change c = input.change();
- if (c == null) {
- return null;
- }
- return firstNonNull(c.getTopic(), "");
+ return getTopic(input);
+ }
+ };
+
+ /** Topic, a short annotation on the branch. */
+ public static final FieldDef<ChangeData, String> TOPIC =
+ new FieldDef.Single<ChangeData, String>(
+ "topic3", FieldType.PREFIX, false) {
+ @Override
+ public String get(ChangeData input, FillArgs args)
+ throws OrmException {
+ return getTopic(input);
}
};
@@ -523,6 +531,14 @@
}
};
+ private static String getTopic(ChangeData input) throws OrmException {
+ Change c = input.change();
+ if (c == null) {
+ return null;
+ }
+ return firstNonNull(c.getTopic(), "");
+ }
+
private static <T> List<byte[]> toProtos(ProtobufCodec<T> codec, Collection<T> objs)
throws OrmException {
List<byte[]> result = Lists.newArrayListWithCapacity(objs.size());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeSchemas.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeSchemas.java
index ef6d626..46c8297 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeSchemas.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeSchemas.java
@@ -38,7 +38,7 @@
ChangeField.PROJECT,
ChangeField.PROJECTS,
ChangeField.REF,
- ChangeField.TOPIC,
+ ChangeField.LEGACY_TOPIC,
ChangeField.UPDATED,
ChangeField.FILE_PART,
ChangeField.PATH,
@@ -68,7 +68,7 @@
ChangeField.PROJECT,
ChangeField.PROJECTS,
ChangeField.REF,
- ChangeField.TOPIC,
+ ChangeField.LEGACY_TOPIC,
ChangeField.UPDATED,
ChangeField.FILE_PART,
ChangeField.PATH,
@@ -88,6 +88,7 @@
ChangeField.DELTA,
ChangeField.HASHTAG);
+ @SuppressWarnings("deprecation")
static final Schema<ChangeData> V14 = schema(
ChangeField.LEGACY_ID,
ChangeField.ID,
@@ -95,7 +96,7 @@
ChangeField.PROJECT,
ChangeField.PROJECTS,
ChangeField.REF,
- ChangeField.TOPIC,
+ ChangeField.LEGACY_TOPIC,
ChangeField.UPDATED,
ChangeField.FILE_PART,
ChangeField.PATH,
@@ -115,6 +116,7 @@
ChangeField.DELTA,
ChangeField.HASHTAG);
+ @SuppressWarnings("deprecation")
static final Schema<ChangeData> V15 = schema(
ChangeField.LEGACY_ID,
ChangeField.ID,
@@ -122,6 +124,34 @@
ChangeField.PROJECT,
ChangeField.PROJECTS,
ChangeField.REF,
+ ChangeField.LEGACY_TOPIC,
+ ChangeField.UPDATED,
+ ChangeField.FILE_PART,
+ ChangeField.PATH,
+ ChangeField.OWNER,
+ ChangeField.REVIEWER,
+ ChangeField.COMMIT,
+ ChangeField.TR,
+ ChangeField.LABEL,
+ ChangeField.REVIEWED,
+ ChangeField.COMMIT_MESSAGE,
+ ChangeField.COMMENT,
+ ChangeField.CHANGE,
+ ChangeField.APPROVAL,
+ ChangeField.MERGEABLE,
+ ChangeField.ADDED,
+ ChangeField.DELETED,
+ ChangeField.DELTA,
+ ChangeField.HASHTAG,
+ ChangeField.COMMENTBY);
+
+ static final Schema<ChangeData> V16 = schema(
+ ChangeField.LEGACY_ID,
+ ChangeField.ID,
+ ChangeField.STATUS,
+ ChangeField.PROJECT,
+ ChangeField.PROJECTS,
+ ChangeField.REF,
ChangeField.TOPIC,
ChangeField.UPDATED,
ChangeField.FILE_PART,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ProjectWatch.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ProjectWatch.java
index 63709c6..95b0219 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ProjectWatch.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ProjectWatch.java
@@ -87,10 +87,9 @@
try {
add(matching, nc);
} catch (QueryParseException e) {
- log.warn(String.format(
- "Project %s has invalid notify %s filter \"%s\"",
+ log.warn("Project {} has invalid notify {} filter \"{}\": {}",
state.getProject().getName(), nc.getName(),
- nc.getFilter()), e);
+ nc.getFilter(), e.getMessage());
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
index 94fe742..d14a223 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
@@ -15,11 +15,11 @@
package com.google.gerrit.server.query.change;
import static com.google.gerrit.server.query.change.ChangeData.asChanges;
+import static com.google.gerrit.server.query.change.InternalChangeQuery.schema;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
-import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.GroupReference;
import com.google.gerrit.common.errors.NotSignedInException;
import com.google.gerrit.reviewdb.client.Account;
@@ -43,7 +43,6 @@
import com.google.gerrit.server.index.ChangeIndex;
import com.google.gerrit.server.index.FieldDef;
import com.google.gerrit.server.index.IndexCollection;
-import com.google.gerrit.server.index.Schema;
import com.google.gerrit.server.patch.PatchListCache;
import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.project.ListChildProjects;
@@ -467,9 +466,9 @@
@Operator
public Predicate<ChangeData> topic(String name) {
if (name.startsWith("^")) {
- return new RegexTopicPredicate(name);
+ return new RegexTopicPredicate(schema(args.indexes), name);
}
- return new TopicPredicate(name);
+ return new TopicPredicate(schema(args.indexes), name);
}
@Operator
@@ -864,9 +863,4 @@
private Account.Id self() throws QueryParseException {
return args.getIdentifiedUser().getAccountId();
}
-
- private static Schema<ChangeData> schema(@Nullable IndexCollection indexes) {
- ChangeIndex index = indexes != null ? indexes.getSearchIndex() : null;
- return index != null ? index.getSchema() : null;
- }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
index c552a7b..573bc77 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
@@ -17,9 +17,13 @@
import static com.google.gerrit.server.query.Predicate.and;
import static com.google.gerrit.server.query.change.ChangeStatusPredicate.open;
+import com.google.gerrit.common.Nullable;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.index.ChangeIndex;
+import com.google.gerrit.server.index.IndexCollection;
+import com.google.gerrit.server.index.Schema;
import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryParseException;
import com.google.gwtorm.server.OrmException;
@@ -55,19 +59,18 @@
return new ChangeStatusPredicate(status);
}
- private static Predicate<ChangeData> topic(String topic) {
- return new TopicPredicate(topic);
- }
-
private static Predicate<ChangeData> commit(AbbreviatedObjectId id) {
return new CommitPredicate(id);
}
private final QueryProcessor qp;
+ private final IndexCollection indexes;
@Inject
- InternalChangeQuery(QueryProcessor queryProcessor) {
+ InternalChangeQuery(QueryProcessor queryProcessor,
+ IndexCollection indexes) {
qp = queryProcessor.enforceVisibility(false);
+ this.indexes = indexes;
}
public InternalChangeQuery setLimit(int n) {
@@ -80,6 +83,10 @@
return this;
}
+ private Predicate<ChangeData> topic(String topic) {
+ return new TopicPredicate(schema(indexes), topic);
+ }
+
public List<ChangeData> byKey(Change.Key key) throws OrmException {
return byKeyPrefix(key.get());
}
@@ -145,4 +152,9 @@
throw new OrmException(e);
}
}
+
+ static Schema<ChangeData> schema(@Nullable IndexCollection indexes) {
+ ChangeIndex index = indexes != null ? indexes.getSearchIndex() : null;
+ return index != null ? index.getSchema() : null;
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java
index 3a9604f..7d5f1dc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java
@@ -15,8 +15,8 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.RegexPredicate;
+import com.google.gerrit.server.index.Schema;
import com.google.gwtorm.server.OrmException;
import dk.brics.automaton.RegExp;
@@ -25,8 +25,8 @@
class RegexTopicPredicate extends RegexPredicate<ChangeData> {
private final RunAutomaton pattern;
- RegexTopicPredicate(String re) {
- super(ChangeField.TOPIC, re);
+ RegexTopicPredicate(Schema<ChangeData> schema, String re) {
+ super(TopicPredicate.topicField(schema), re);
if (re.startsWith("^")) {
re = re.substring(1);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java
index 07a6714..7196c9f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java
@@ -18,12 +18,26 @@
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.index.ChangeField;
+import com.google.gerrit.server.index.FieldDef;
import com.google.gerrit.server.index.IndexPredicate;
+import com.google.gerrit.server.index.Schema;
import com.google.gwtorm.server.OrmException;
class TopicPredicate extends IndexPredicate<ChangeData> {
- TopicPredicate(String topic) {
- super(ChangeField.TOPIC, topic);
+ @SuppressWarnings("deprecation")
+ static FieldDef<ChangeData, ?> topicField(Schema<ChangeData> schema) {
+ if (schema == null) {
+ return ChangeField.LEGACY_TOPIC;
+ }
+ FieldDef<ChangeData, ?> f = schema.getFields().get(TOPIC.getName());
+ if (f != null) {
+ return f;
+ }
+ return schema.getFields().get(ChangeField.LEGACY_TOPIC.getName());
+ }
+
+ TopicPredicate(Schema<ChangeData> schema, String topic) {
+ super(topicField(schema), topic);
}
@Override
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
index 2dcc3d4..9ad896e 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
@@ -425,7 +425,8 @@
assertQuery("topic:foo");
assertQuery("topic:feature1", change1);
assertQuery("topic:feature2", change2);
- assertQuery("topic:\"\"", change3);
+ assertQuery("topic:feature", change2, change1);
+ assertQuery("topic:\"\"", change3, change2, change1);
}
@Test
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesV14Test.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesV14Test.java
index f5dd603..0feb800 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesV14Test.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesV14Test.java
@@ -45,4 +45,11 @@
public void byFrom() {
// Ignore.
}
+
+ @Override
+ @Ignore
+ @Test
+ public void byTopic() {
+ // Ignore.
+ }
}