Merge "Tidy up SubmoduleOp constructor"
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. + } }