Remove TrackingIds table from SQL database
This table is not necessary with the secondary index enabled. Change-Id: I87820c638cf69e688f9aa95edf190a8c56138a0b
This commit is contained in:
parent
d4ae3a16d5
commit
9f4de526dd
@ -2868,10 +2868,7 @@ tracking systems, parsed out of the commit message and
|
||||
saved in Gerrit's database.
|
||||
|
||||
After making changes to this section, existing changes
|
||||
must be reindexed with link:pgm-reindex.html[reindex]
|
||||
if index.type is `LUCENE` or `SOLR`; or with
|
||||
link:pgm-ScanTrackingIds.html[ScanTrackingIds] if index.type
|
||||
is unset or `SQL`.
|
||||
must be reindexed with link:pgm-reindex.html[reindex].
|
||||
|
||||
The tracking ids are searchable using tr:<tracking id> or
|
||||
bug:<tracking id>.
|
||||
|
@ -1,63 +0,0 @@
|
||||
ScanTrackingIds
|
||||
===============
|
||||
|
||||
NAME
|
||||
----
|
||||
ScanTrackingIds - Rescan changes to index trackingids
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
--
|
||||
'java' -jar gerrit.war 'ScanTrackingIds' -d <SITE_PATH>
|
||||
--
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
Scans every known change and updates the indexed tracking
|
||||
ids associated with the change, after editing the trackingid
|
||||
configuration in gerrit.config.
|
||||
|
||||
This task can take quite some time, but can run in the background
|
||||
concurrently to the server if the database is MySQL or PostgreSQL.
|
||||
If the database is H2, this task must be run by itself.
|
||||
|
||||
STATUS
|
||||
------
|
||||
This command will be replaced by `reindex`.
|
||||
|
||||
If secondary indexing is enabled
|
||||
(link:config-gerrit.html#index.type[index.type] set to `LUCENE`
|
||||
or `SOLR`) use link:pgm-reindex.html[reindex].
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
|
||||
-d::
|
||||
\--site-path::
|
||||
Location of the gerrit.config file, and all other per-site
|
||||
configuration data, supporting libraries and log files.
|
||||
|
||||
\--threads::
|
||||
Number of threads to perform the scan work with. Defaults to
|
||||
twice the number of CPUs available.
|
||||
|
||||
CONTEXT
|
||||
-------
|
||||
This command can only be run on a server which has direct
|
||||
connectivity to the metadata database, and local access to the
|
||||
managed Git repositories.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
To rescan all known trackingids:
|
||||
|
||||
====
|
||||
$ java -jar gerrit.war ScanTrackingIds -d site_path --threads 16
|
||||
====
|
||||
|
||||
GERRIT
|
||||
------
|
||||
Part of link:index.html[Gerrit Code Review]
|
||||
|
||||
SEARCHBOX
|
||||
---------
|
@ -35,9 +35,6 @@ version::
|
||||
Transition Utilities
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
link:pgm-ScanTrackingIds.html[ScanTrackingIds]::
|
||||
Rescan all changes after configuring trackingids.
|
||||
|
||||
link:pgm-LocalUsernamesToLowerCase.html[LocalUsernamesToLowerCase]::
|
||||
Convert the local username of every account to lower case.
|
||||
|
||||
|
@ -1,177 +0,0 @@
|
||||
// Copyright (C) 2010 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.pgm;
|
||||
|
||||
import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
|
||||
|
||||
import com.google.gerrit.lifecycle.LifecycleManager;
|
||||
import com.google.gerrit.pgm.util.SiteProgram;
|
||||
import com.google.gerrit.reviewdb.client.Change;
|
||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||
import com.google.gerrit.reviewdb.client.Project;
|
||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||
import com.google.gerrit.server.ChangeUtil;
|
||||
import com.google.gerrit.server.config.TrackingFooters;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
import com.google.gerrit.server.schema.SchemaVersionCheck;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
import com.google.gwtorm.server.SchemaFactory;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Injector;
|
||||
|
||||
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
|
||||
import org.eclipse.jgit.errors.MissingObjectException;
|
||||
import org.eclipse.jgit.lib.ObjectId;
|
||||
import org.eclipse.jgit.lib.Repository;
|
||||
import org.eclipse.jgit.lib.TextProgressMonitor;
|
||||
import org.eclipse.jgit.revwalk.RevCommit;
|
||||
import org.eclipse.jgit.revwalk.RevWalk;
|
||||
import org.kohsuke.args4j.Option;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/** Scan changes and update the trackingid information for them. */
|
||||
public class ScanTrackingIds extends SiteProgram {
|
||||
@Option(name = "--threads", usage = "Number of concurrent threads to run")
|
||||
private int threads = 2 * Runtime.getRuntime().availableProcessors();
|
||||
|
||||
private final LifecycleManager manager = new LifecycleManager();
|
||||
private final TextProgressMonitor monitor = new TextProgressMonitor();
|
||||
private List<Change> todo;
|
||||
|
||||
private Injector dbInjector;
|
||||
|
||||
@Inject
|
||||
private TrackingFooters footers;
|
||||
|
||||
@Inject
|
||||
private GitRepositoryManager gitManager;
|
||||
|
||||
@Inject
|
||||
private SchemaFactory<ReviewDb> database;
|
||||
|
||||
@Override
|
||||
public int run() throws Exception {
|
||||
if (threads <= 0) {
|
||||
threads = 1;
|
||||
}
|
||||
|
||||
dbInjector = createDbInjector(MULTI_USER);
|
||||
manager.add(
|
||||
dbInjector,
|
||||
dbInjector.createChildInjector(SchemaVersionCheck.module()));
|
||||
manager.start();
|
||||
dbInjector.injectMembers(this);
|
||||
|
||||
final ReviewDb db = database.open();
|
||||
try {
|
||||
todo = db.changes().all().toList();
|
||||
synchronized (monitor) {
|
||||
monitor.beginTask("Scanning changes", todo.size());
|
||||
}
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
|
||||
final List<Worker> workers = new ArrayList<Worker>(threads);
|
||||
for (int tid = 0; tid < threads; tid++) {
|
||||
Worker t = new Worker();
|
||||
t.start();
|
||||
workers.add(t);
|
||||
}
|
||||
for (Worker t : workers) {
|
||||
t.join();
|
||||
}
|
||||
synchronized (monitor) {
|
||||
monitor.endTask();
|
||||
}
|
||||
manager.stop();
|
||||
return 0;
|
||||
}
|
||||
|
||||
private void scan(ReviewDb db, Change change) {
|
||||
final Project.NameKey project = change.getDest().getParentKey();
|
||||
final Repository git;
|
||||
try {
|
||||
git = gitManager.openRepository(project);
|
||||
} catch (IOException e) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
PatchSet ps = db.patchSets().get(change.currentPatchSetId());
|
||||
if (ps == null || ps.getRevision() == null
|
||||
|| ps.getRevision().get() == null) {
|
||||
return;
|
||||
}
|
||||
ChangeUtil.updateTrackingIds(db, change, footers, parse(git, ps)
|
||||
.getFooterLines());
|
||||
} catch (OrmException error) {
|
||||
System.err.println("ERR " + error.getMessage());
|
||||
} catch (IOException error) {
|
||||
System.err.println("ERR Cannot scan " + change.getId() + ": "
|
||||
+ error.getMessage());
|
||||
} finally {
|
||||
git.close();
|
||||
}
|
||||
}
|
||||
|
||||
private RevCommit parse(final Repository git, PatchSet ps)
|
||||
throws MissingObjectException, IncorrectObjectTypeException, IOException {
|
||||
RevWalk rw = new RevWalk(git);
|
||||
try {
|
||||
return rw.parseCommit(ObjectId.fromString(ps.getRevision().get()));
|
||||
} finally {
|
||||
rw.release();
|
||||
}
|
||||
}
|
||||
|
||||
private Change next() {
|
||||
synchronized (todo) {
|
||||
if (todo.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return todo.remove(todo.size() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
private class Worker extends Thread {
|
||||
@Override
|
||||
public void run() {
|
||||
ReviewDb db;
|
||||
try {
|
||||
db = database.open();
|
||||
} catch (OrmException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
try {
|
||||
for (;;) {
|
||||
Change change = next();
|
||||
if (change == null) {
|
||||
break;
|
||||
}
|
||||
scan(db, change);
|
||||
synchronized (monitor) {
|
||||
monitor.update(1);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -98,9 +98,6 @@ public interface ReviewDb extends Schema {
|
||||
@Relation(id = 26)
|
||||
PatchLineCommentAccess patchComments();
|
||||
|
||||
@Relation(id = 27)
|
||||
TrackingIdAccess trackingIds();
|
||||
|
||||
@Relation(id = 28)
|
||||
SubmoduleSubscriptionAccess submoduleSubscriptions();
|
||||
|
||||
|
@ -1,31 +0,0 @@
|
||||
// Copyright (C) 2010 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.reviewdb.server;
|
||||
|
||||
import com.google.gerrit.reviewdb.client.Change;
|
||||
import com.google.gerrit.reviewdb.client.TrackingId;
|
||||
import com.google.gwtorm.server.Access;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
import com.google.gwtorm.server.PrimaryKey;
|
||||
import com.google.gwtorm.server.Query;
|
||||
import com.google.gwtorm.server.ResultSet;
|
||||
|
||||
public interface TrackingIdAccess extends Access<TrackingId, TrackingId.Key> {
|
||||
@PrimaryKey("key")
|
||||
TrackingId get(TrackingId.Key key) throws OrmException;
|
||||
|
||||
@Query("WHERE key.changeId = ?")
|
||||
ResultSet<TrackingId> byChange(Change.Id change) throws OrmException;
|
||||
}
|
@ -108,18 +108,6 @@ CREATE INDEX patch_set_ancestors_desc
|
||||
ON patch_set_ancestors (ancestor_revision);
|
||||
|
||||
|
||||
-- *********************************************************************
|
||||
-- ProjectAccess
|
||||
-- @PrimaryKey covers: all, suggestByName
|
||||
|
||||
|
||||
-- *********************************************************************
|
||||
-- TrackingIdAccess
|
||||
--
|
||||
CREATE INDEX tracking_ids_byTrkKey
|
||||
ON tracking_ids (tracking_key);
|
||||
|
||||
|
||||
-- *********************************************************************
|
||||
-- StarredChangeAccess
|
||||
-- @PrimaryKey covers: byAccount
|
||||
|
@ -158,20 +158,6 @@ WHERE status = 'd';
|
||||
CREATE INDEX patch_set_ancestors_desc
|
||||
ON patch_set_ancestors (ancestor_revision);
|
||||
|
||||
|
||||
-- *********************************************************************
|
||||
-- ProjectAccess
|
||||
-- @PrimaryKey covers: all, suggestByName
|
||||
-- covers: ownedByGroup
|
||||
|
||||
|
||||
-- *********************************************************************
|
||||
-- TrackingIdAccess
|
||||
--
|
||||
CREATE INDEX tracking_ids_byTrkKey
|
||||
ON tracking_ids (tracking_key);
|
||||
|
||||
|
||||
-- *********************************************************************
|
||||
-- StarredChangeAccess
|
||||
-- @PrimaryKey covers: byAccount
|
||||
|
@ -28,13 +28,10 @@ import com.google.gerrit.reviewdb.client.ChangeMessage;
|
||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||
import com.google.gerrit.reviewdb.client.PatchSetAncestor;
|
||||
import com.google.gerrit.reviewdb.client.RevId;
|
||||
import com.google.gerrit.reviewdb.client.TrackingId;
|
||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||
import com.google.gerrit.server.change.ChangeInserter;
|
||||
import com.google.gerrit.server.change.ChangeMessages;
|
||||
import com.google.gerrit.server.change.PatchSetInserter;
|
||||
import com.google.gerrit.server.config.TrackingFooter;
|
||||
import com.google.gerrit.server.config.TrackingFooters;
|
||||
import com.google.gerrit.server.events.CommitReceivedEvent;
|
||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
@ -64,7 +61,6 @@ import org.eclipse.jgit.lib.Ref;
|
||||
import org.eclipse.jgit.lib.RefDatabase;
|
||||
import org.eclipse.jgit.lib.RefUpdate;
|
||||
import org.eclipse.jgit.lib.Repository;
|
||||
import org.eclipse.jgit.revwalk.FooterLine;
|
||||
import org.eclipse.jgit.revwalk.RevCommit;
|
||||
import org.eclipse.jgit.revwalk.RevWalk;
|
||||
import org.eclipse.jgit.transport.ReceiveCommand;
|
||||
@ -78,11 +74,8 @@ import java.text.MessageFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Matcher;
|
||||
|
||||
public class ChangeUtil {
|
||||
/**
|
||||
@ -149,59 +142,6 @@ public class ChangeUtil {
|
||||
computeSortKey(c);
|
||||
}
|
||||
|
||||
public static void updateTrackingIds(ReviewDb db, Change change,
|
||||
TrackingFooters trackingFooters, List<FooterLine> footerLines)
|
||||
throws OrmException {
|
||||
if (trackingFooters.getTrackingFooters().isEmpty() || footerLines.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
final Set<TrackingId> want = new HashSet<TrackingId>();
|
||||
final Set<TrackingId> have = new HashSet<TrackingId>( //
|
||||
db.trackingIds().byChange(change.getId()).toList());
|
||||
|
||||
for (final TrackingFooter footer : trackingFooters.getTrackingFooters()) {
|
||||
for (final FooterLine footerLine : footerLines) {
|
||||
if (footerLine.matches(footer.footerKey())) {
|
||||
// supporting multiple tracking-ids on a single line
|
||||
final Matcher m = footer.match().matcher(footerLine.getValue());
|
||||
while (m.find()) {
|
||||
if (m.group().isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String idstr;
|
||||
if (m.groupCount() > 0) {
|
||||
idstr = m.group(1);
|
||||
} else {
|
||||
idstr = m.group();
|
||||
}
|
||||
|
||||
if (idstr.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
if (idstr.length() > TrackingId.TRACKING_ID_MAX_CHAR) {
|
||||
continue;
|
||||
}
|
||||
|
||||
want.add(new TrackingId(change.getId(), idstr, footer.system()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Only insert the rows we don't have, and delete rows we don't match.
|
||||
//
|
||||
final Set<TrackingId> toInsert = new HashSet<TrackingId>(want);
|
||||
final Set<TrackingId> toDelete = new HashSet<TrackingId>(have);
|
||||
|
||||
toInsert.removeAll(have);
|
||||
toDelete.removeAll(want);
|
||||
|
||||
db.trackingIds().insert(toInsert);
|
||||
db.trackingIds().delete(toDelete);
|
||||
}
|
||||
|
||||
public static void insertAncestors(ReviewDb db, PatchSet.Id id, RevCommit src)
|
||||
throws OrmException {
|
||||
final int cnt = src.getParentCount();
|
||||
@ -433,7 +373,6 @@ public class ChangeUtil {
|
||||
|
||||
db.changeMessages().delete(db.changeMessages().byChange(changeId));
|
||||
db.starredChanges().delete(db.starredChanges().byChange(changeId));
|
||||
db.trackingIds().delete(db.trackingIds().byChange(changeId));
|
||||
db.changes().delete(Collections.singleton(change));
|
||||
indexer.delete(change);
|
||||
}
|
||||
|
@ -28,7 +28,6 @@ import com.google.gerrit.reviewdb.client.RevId;
|
||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||
import com.google.gerrit.server.ApprovalsUtil;
|
||||
import com.google.gerrit.server.ChangeUtil;
|
||||
import com.google.gerrit.server.config.TrackingFooters;
|
||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
|
||||
import com.google.gerrit.server.mail.CreateChangeSender;
|
||||
import com.google.gerrit.server.patch.PatchSetInfoFactory;
|
||||
@ -59,7 +58,6 @@ public class ChangeInserter {
|
||||
private final GitReferenceUpdated gitRefUpdated;
|
||||
private final ChangeHooks hooks;
|
||||
private final ApprovalsUtil approvalsUtil;
|
||||
private final TrackingFooters trackingFooters;
|
||||
private final MergeabilityChecker mergeabilityChecker;
|
||||
private final CreateChangeSender.Factory createChangeSenderFactory;
|
||||
|
||||
@ -81,7 +79,6 @@ public class ChangeInserter {
|
||||
GitReferenceUpdated gitRefUpdated,
|
||||
ChangeHooks hooks,
|
||||
ApprovalsUtil approvalsUtil,
|
||||
TrackingFooters trackingFooters,
|
||||
MergeabilityChecker mergeabilityChecker,
|
||||
CreateChangeSender.Factory createChangeSenderFactory,
|
||||
@Assisted RefControl refControl,
|
||||
@ -91,7 +88,6 @@ public class ChangeInserter {
|
||||
this.gitRefUpdated = gitRefUpdated;
|
||||
this.hooks = hooks;
|
||||
this.approvalsUtil = approvalsUtil;
|
||||
this.trackingFooters = trackingFooters;
|
||||
this.mergeabilityChecker = mergeabilityChecker;
|
||||
this.createChangeSenderFactory = createChangeSenderFactory;
|
||||
this.refControl = refControl;
|
||||
@ -162,7 +158,6 @@ public class ChangeInserter {
|
||||
ChangeUtil.insertAncestors(db, patchSet.getId(), commit);
|
||||
db.patchSets().insert(Collections.singleton(patchSet));
|
||||
db.changes().insert(Collections.singleton(change));
|
||||
ChangeUtil.updateTrackingIds(db, change, trackingFooters, commit.getFooterLines());
|
||||
LabelTypes labelTypes = refControl.getProjectControl().getLabelTypes();
|
||||
approvalsUtil.addReviewers(db, labelTypes, change, patchSet, patchSetInfo,
|
||||
reviewers, Collections.<Account.Id> emptySet());
|
||||
|
@ -31,7 +31,6 @@ import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||
import com.google.gerrit.server.ApprovalsUtil;
|
||||
import com.google.gerrit.server.ChangeUtil;
|
||||
import com.google.gerrit.server.IdentifiedUser;
|
||||
import com.google.gerrit.server.config.TrackingFooters;
|
||||
import com.google.gerrit.server.events.CommitReceivedEvent;
|
||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
|
||||
import com.google.gerrit.server.git.MergeUtil;
|
||||
@ -54,7 +53,6 @@ import org.eclipse.jgit.lib.ObjectId;
|
||||
import org.eclipse.jgit.lib.RefUpdate;
|
||||
import org.eclipse.jgit.lib.Repository;
|
||||
import org.eclipse.jgit.merge.ThreeWayMerger;
|
||||
import org.eclipse.jgit.revwalk.FooterLine;
|
||||
import org.eclipse.jgit.revwalk.RevCommit;
|
||||
import org.eclipse.jgit.revwalk.RevWalk;
|
||||
import org.eclipse.jgit.transport.ReceiveCommand;
|
||||
@ -89,7 +87,6 @@ public class PatchSetInserter {
|
||||
}
|
||||
|
||||
private final ChangeHooks hooks;
|
||||
private final TrackingFooters trackingFooters;
|
||||
private final PatchSetInfoFactory patchSetInfoFactory;
|
||||
private final ReviewDb db;
|
||||
private final IdentifiedUser user;
|
||||
@ -116,7 +113,6 @@ public class PatchSetInserter {
|
||||
|
||||
@Inject
|
||||
public PatchSetInserter(ChangeHooks hooks,
|
||||
TrackingFooters trackingFooters,
|
||||
ReviewDb db,
|
||||
PatchSetInfoFactory patchSetInfoFactory,
|
||||
GitReferenceUpdated gitRefUpdated,
|
||||
@ -131,7 +127,6 @@ public class PatchSetInserter {
|
||||
@Assisted Change change,
|
||||
@Assisted RevCommit commit) {
|
||||
this.hooks = hooks;
|
||||
this.trackingFooters = trackingFooters;
|
||||
this.db = db;
|
||||
this.patchSetInfoFactory = patchSetInfoFactory;
|
||||
this.user = user;
|
||||
@ -287,9 +282,6 @@ public class PatchSetInserter {
|
||||
ApprovalsUtil.copyLabels(db, refControl.getProjectControl()
|
||||
.getLabelTypes(), currentPatchSetId, patchSet, changeKind);
|
||||
}
|
||||
|
||||
final List<FooterLine> footerLines = commit.getFooterLines();
|
||||
ChangeUtil.updateTrackingIds(db, updatedChange, trackingFooters, footerLines);
|
||||
db.commit();
|
||||
|
||||
if (changeMessage != null) {
|
||||
|
@ -14,12 +14,12 @@
|
||||
|
||||
package com.google.gerrit.server.config;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
import org.eclipse.jgit.revwalk.FooterLine;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Matcher;
|
||||
|
||||
public class TrackingFooters {
|
||||
@ -33,8 +33,12 @@ public class TrackingFooters {
|
||||
return trackingFooters;
|
||||
}
|
||||
|
||||
public Set<String> extract(List<FooterLine> lines) {
|
||||
Set<String> r = Sets.newHashSet();
|
||||
public boolean isEmpty() {
|
||||
return trackingFooters.isEmpty();
|
||||
}
|
||||
|
||||
public Multimap<String, String> extract(List<FooterLine> lines) {
|
||||
Multimap<String, String> r = ArrayListMultimap.create();
|
||||
for (FooterLine footer : lines) {
|
||||
for (TrackingFooter config : trackingFooters) {
|
||||
if (footer.matches(config.footerKey())) {
|
||||
@ -44,7 +48,7 @@ public class TrackingFooters {
|
||||
? m.group(1)
|
||||
: m.group();
|
||||
if (!id.isEmpty()) {
|
||||
r.add(id);
|
||||
r.put(config.system(), id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,7 @@
|
||||
package com.google.gerrit.server.events;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Multimap;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.gerrit.common.Nullable;
|
||||
import com.google.gerrit.common.data.LabelType;
|
||||
@ -30,7 +31,6 @@ import com.google.gerrit.reviewdb.client.PatchSet;
|
||||
import com.google.gerrit.reviewdb.client.PatchSetAncestor;
|
||||
import com.google.gerrit.reviewdb.client.PatchSetApproval;
|
||||
import com.google.gerrit.reviewdb.client.RevId;
|
||||
import com.google.gerrit.reviewdb.client.TrackingId;
|
||||
import com.google.gerrit.reviewdb.client.UserIdentity;
|
||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||
import com.google.gerrit.server.GerritPersonIdent;
|
||||
@ -292,11 +292,16 @@ public class EventFactory {
|
||||
return d;
|
||||
}
|
||||
|
||||
public void addTrackingIds(ChangeAttribute a, Collection<TrackingId> ids) {
|
||||
if (!ids.isEmpty()) {
|
||||
a.trackingIds = new ArrayList<TrackingIdAttribute>(ids.size());
|
||||
for (TrackingId t : ids) {
|
||||
a.trackingIds.add(asTrackingIdAttribute(t));
|
||||
public void addTrackingIds(ChangeAttribute a, Multimap<String, String> set) {
|
||||
if (!set.isEmpty()) {
|
||||
a.trackingIds = new ArrayList<TrackingIdAttribute>(set.size());
|
||||
for (Map.Entry<String, Collection<String>> e : set.asMap().entrySet()) {
|
||||
for (String id : e.getValue()) {
|
||||
TrackingIdAttribute t = new TrackingIdAttribute();
|
||||
t.system = e.getKey();
|
||||
t.id = id;
|
||||
a.trackingIds.add(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -379,13 +384,6 @@ public class EventFactory {
|
||||
}
|
||||
}
|
||||
|
||||
public TrackingIdAttribute asTrackingIdAttribute(TrackingId id) {
|
||||
TrackingIdAttribute a = new TrackingIdAttribute();
|
||||
a.system = id.getSystem();
|
||||
a.id = id.getTrackingId();
|
||||
return a;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a PatchSetAttribute for the given patchset suitable for
|
||||
* serialization to JSON.
|
||||
|
@ -75,7 +75,6 @@ import com.google.gerrit.server.change.RevisionResource;
|
||||
import com.google.gerrit.server.change.Submit;
|
||||
import com.google.gerrit.server.config.AllProjectsName;
|
||||
import com.google.gerrit.server.config.CanonicalWebUrl;
|
||||
import com.google.gerrit.server.config.TrackingFooters;
|
||||
import com.google.gerrit.server.events.CommitReceivedEvent;
|
||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
|
||||
import com.google.gerrit.server.git.MultiProgressMonitor.Task;
|
||||
@ -127,9 +126,9 @@ import org.eclipse.jgit.transport.AdvertiseRefsHook;
|
||||
import org.eclipse.jgit.transport.AdvertiseRefsHookChain;
|
||||
import org.eclipse.jgit.transport.BaseReceivePack;
|
||||
import org.eclipse.jgit.transport.ReceiveCommand;
|
||||
import org.eclipse.jgit.transport.RefFilter;
|
||||
import org.eclipse.jgit.transport.ReceiveCommand.Result;
|
||||
import org.eclipse.jgit.transport.ReceivePack;
|
||||
import org.eclipse.jgit.transport.RefFilter;
|
||||
import org.eclipse.jgit.transport.ServiceMayNotContinueException;
|
||||
import org.eclipse.jgit.transport.UploadPack;
|
||||
import org.kohsuke.args4j.CmdLineException;
|
||||
@ -266,7 +265,6 @@ public class ReceiveCommits {
|
||||
private final ProjectCache projectCache;
|
||||
private final String canonicalWebUrl;
|
||||
private final CommitValidators.Factory commitValidatorsFactory;
|
||||
private final TrackingFooters trackingFooters;
|
||||
private final TagCache tagCache;
|
||||
private final AccountCache accountCache;
|
||||
private final ChangeInserter.Factory changeInserterFactory;
|
||||
@ -333,7 +331,6 @@ public class ReceiveCommits {
|
||||
final CommitValidators.Factory commitValidatorsFactory,
|
||||
@CanonicalWebUrl final String canonicalWebUrl,
|
||||
@GerritPersonIdent final PersonIdent gerritIdent,
|
||||
final TrackingFooters trackingFooters,
|
||||
final WorkQueue workQueue,
|
||||
@ChangeUpdateExecutor ListeningExecutorService changeUpdateExector,
|
||||
final RequestScopePropagator requestScopePropagator,
|
||||
@ -363,7 +360,6 @@ public class ReceiveCommits {
|
||||
this.projectCache = projectCache;
|
||||
this.repoManager = repoManager;
|
||||
this.canonicalWebUrl = canonicalWebUrl;
|
||||
this.trackingFooters = trackingFooters;
|
||||
this.tagCache = tagCache;
|
||||
this.accountCache = accountCache;
|
||||
this.changeInserterFactory = changeInserterFactory;
|
||||
@ -1871,9 +1867,6 @@ public class ReceiveCommits {
|
||||
.messageUUID(db)), me, newPatchSet.getCreatedOn(), newPatchSet.getId());
|
||||
msg.setMessage("Uploaded patch set " + newPatchSet.getPatchSetId() + ".");
|
||||
db.changeMessages().insert(Collections.singleton(msg));
|
||||
if (change.currentPatchSetId().equals(priorPatchSet)) {
|
||||
ChangeUtil.updateTrackingIds(db, change, trackingFooters, footerLines);
|
||||
}
|
||||
|
||||
if (mergedIntoRef == null) {
|
||||
// Change should be new, so it can go through review again.
|
||||
|
@ -222,8 +222,8 @@ public class ChangeField {
|
||||
public Iterable<String> get(ChangeData input, FillArgs args)
|
||||
throws OrmException {
|
||||
try {
|
||||
return args.trackingFooters.extract(
|
||||
input.commitFooters(args.repoManager, args.db));
|
||||
return Sets.newHashSet(args.trackingFooters.extract(
|
||||
input.commitFooters(args.repoManager, args.db)).values());
|
||||
} catch (IOException e) {
|
||||
throw new OrmException(e);
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ public class BasicChangeRewrites extends QueryRewriter<ChangeData> {
|
||||
new InvalidProvider<ReviewDb>(), //
|
||||
new InvalidProvider<ChangeQueryRewriter>(), //
|
||||
null, null, null, null, null, null, null, //
|
||||
null, null, null, null, null, null, null), null);
|
||||
null, null, null, null, null, null, null, null), null);
|
||||
|
||||
private static final QueryRewriter.Definition<ChangeData, BasicChangeRewrites> mydef =
|
||||
new QueryRewriter.Definition<ChangeData, BasicChangeRewrites>(
|
||||
|
@ -30,7 +30,6 @@ import com.google.gerrit.reviewdb.client.Patch;
|
||||
import com.google.gerrit.reviewdb.client.PatchLineComment;
|
||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||
import com.google.gerrit.reviewdb.client.PatchSetApproval;
|
||||
import com.google.gerrit.reviewdb.client.TrackingId;
|
||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||
import com.google.gerrit.server.CurrentUser;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
@ -148,7 +147,6 @@ public class ChangeData {
|
||||
private List<PatchSetApproval> currentApprovals;
|
||||
private List<String> currentFiles;
|
||||
private Collection<PatchLineComment> comments;
|
||||
private Collection<TrackingId> trackingIds;
|
||||
private CurrentUser visibleTo;
|
||||
private ChangeControl changeControl;
|
||||
private List<ChangeMessage> messages;
|
||||
@ -483,14 +481,6 @@ public class ChangeData {
|
||||
return comments;
|
||||
}
|
||||
|
||||
public Collection<TrackingId> trackingIds(Provider<ReviewDb> db)
|
||||
throws OrmException {
|
||||
if (trackingIds == null) {
|
||||
trackingIds = db.get().trackingIds().byChange(legacyId).toList();
|
||||
}
|
||||
return trackingIds;
|
||||
}
|
||||
|
||||
public List<ChangeMessage> messages(Provider<ReviewDb> db)
|
||||
throws OrmException {
|
||||
if (messages == null) {
|
||||
|
@ -31,6 +31,7 @@ import com.google.gerrit.server.account.CapabilityControl;
|
||||
import com.google.gerrit.server.account.GroupBackend;
|
||||
import com.google.gerrit.server.account.GroupBackends;
|
||||
import com.google.gerrit.server.config.AllProjectsName;
|
||||
import com.google.gerrit.server.config.TrackingFooters;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
import com.google.gerrit.server.git.SubmitStrategyFactory;
|
||||
import com.google.gerrit.server.index.ChangeIndex;
|
||||
@ -157,6 +158,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
|
||||
final IndexCollection indexes;
|
||||
final SubmitStrategyFactory submitStrategyFactory;
|
||||
final ConflictsCache conflictsCache;
|
||||
final TrackingFooters trackingFooters;
|
||||
|
||||
@Inject
|
||||
@VisibleForTesting
|
||||
@ -175,7 +177,8 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
|
||||
Provider<ListChildProjects> listChildProjects,
|
||||
IndexCollection indexes,
|
||||
SubmitStrategyFactory submitStrategyFactory,
|
||||
ConflictsCache conflictsCache) {
|
||||
ConflictsCache conflictsCache,
|
||||
TrackingFooters trackingFooters) {
|
||||
this.dbProvider = dbProvider;
|
||||
this.rewriter = rewriter;
|
||||
this.userFactory = userFactory;
|
||||
@ -192,6 +195,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
|
||||
this.indexes = indexes;
|
||||
this.submitStrategyFactory = submitStrategyFactory;
|
||||
this.conflictsCache = conflictsCache;
|
||||
this.trackingFooters = trackingFooters;
|
||||
}
|
||||
}
|
||||
|
||||
@ -586,7 +590,8 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
|
||||
|
||||
@Operator
|
||||
public Predicate<ChangeData> tr(String trackingId) {
|
||||
return new TrackingIdPredicate(args.dbProvider, trackingId);
|
||||
return new TrackingIdPredicate(args.dbProvider, args.trackingFooters,
|
||||
args.repoManager, trackingId);
|
||||
}
|
||||
|
||||
@Operator
|
||||
|
@ -22,6 +22,7 @@ import com.google.gerrit.common.data.SubmitRecord;
|
||||
import com.google.gerrit.reviewdb.client.PatchSet;
|
||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||
import com.google.gerrit.server.CurrentUser;
|
||||
import com.google.gerrit.server.config.TrackingFooters;
|
||||
import com.google.gerrit.server.data.ChangeAttribute;
|
||||
import com.google.gerrit.server.data.PatchSetAttribute;
|
||||
import com.google.gerrit.server.data.QueryStatsAttribute;
|
||||
@ -99,6 +100,7 @@ public class QueryProcessor {
|
||||
private final Provider<ReviewDb> db;
|
||||
private final GitRepositoryManager repoManager;
|
||||
private final ChangeControl.GenericFactory changeControlFactory;
|
||||
private final TrackingFooters trackingFooters;
|
||||
private final CurrentUser user;
|
||||
private final int maxLimit;
|
||||
|
||||
@ -125,12 +127,14 @@ public class QueryProcessor {
|
||||
ChangeQueryBuilder.Factory queryBuilder, CurrentUser currentUser,
|
||||
ChangeQueryRewriter queryRewriter, Provider<ReviewDb> db,
|
||||
GitRepositoryManager repoManager,
|
||||
TrackingFooters trackingFooters,
|
||||
ChangeControl.GenericFactory changeControlFactory) {
|
||||
this.eventFactory = eventFactory;
|
||||
this.queryBuilder = queryBuilder.create(currentUser);
|
||||
this.queryRewriter = queryRewriter;
|
||||
this.db = db;
|
||||
this.repoManager = repoManager;
|
||||
this.trackingFooters = trackingFooters;
|
||||
this.changeControlFactory = changeControlFactory;
|
||||
this.user = currentUser;
|
||||
this.maxLimit = currentUser.getCapabilities()
|
||||
@ -307,10 +311,15 @@ public class QueryProcessor {
|
||||
if (cc == null || cc.getCurrentUser() != user) {
|
||||
cc = changeControlFactory.controlFor(d.change(db), user);
|
||||
}
|
||||
|
||||
LabelTypes labelTypes = cc.getLabelTypes();
|
||||
c = eventFactory.asChangeAttribute(d.getChange());
|
||||
eventFactory.extend(c, d.getChange());
|
||||
eventFactory.addTrackingIds(c, d.trackingIds(db));
|
||||
|
||||
if (!trackingFooters.isEmpty()) {
|
||||
eventFactory.addTrackingIds(c,
|
||||
trackingFooters.extract(d.commitFooters(repoManager, db)));
|
||||
}
|
||||
|
||||
if (includeAllReviewers) {
|
||||
eventFactory.addAllReviewers(c, d.getChange());
|
||||
|
@ -14,26 +14,46 @@
|
||||
|
||||
package com.google.gerrit.server.query.change;
|
||||
|
||||
import com.google.gerrit.reviewdb.client.TrackingId;
|
||||
import com.google.gerrit.reviewdb.client.Change;
|
||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||
import com.google.gerrit.server.config.TrackingFooters;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
import com.google.gerrit.server.index.ChangeField;
|
||||
import com.google.gerrit.server.index.IndexPredicate;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
import com.google.inject.Provider;
|
||||
|
||||
class TrackingIdPredicate extends IndexPredicate<ChangeData> {
|
||||
private final Provider<ReviewDb> db;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
TrackingIdPredicate(Provider<ReviewDb> db, String trackingId) {
|
||||
import java.io.IOException;
|
||||
|
||||
class TrackingIdPredicate extends IndexPredicate<ChangeData> {
|
||||
private static final Logger log = LoggerFactory.getLogger(TrackingIdPredicate.class);
|
||||
|
||||
private final Provider<ReviewDb> db;
|
||||
private final TrackingFooters trackingFooters;
|
||||
private final GitRepositoryManager repositoryManager;
|
||||
|
||||
TrackingIdPredicate(Provider<ReviewDb> db,
|
||||
TrackingFooters trackingFooters,
|
||||
GitRepositoryManager repositoryManager,
|
||||
String trackingId) {
|
||||
super(ChangeField.TR, trackingId);
|
||||
this.db = db;
|
||||
this.trackingFooters = trackingFooters;
|
||||
this.repositoryManager = repositoryManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean match(final ChangeData object) throws OrmException {
|
||||
for (TrackingId c : object.trackingIds(db)) {
|
||||
if (getValue().equals(c.getTrackingId())) {
|
||||
return true;
|
||||
public boolean match(ChangeData object) throws OrmException {
|
||||
Change c = object.change(db);
|
||||
if (c != null) {
|
||||
try {
|
||||
return trackingFooters.extract(object.commitFooters(repositoryManager, db))
|
||||
.values().contains(getValue());
|
||||
} catch (IOException e) {
|
||||
log.warn("Cannot extract footers from " + c.getChangeId(), e);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
@ -26,7 +26,7 @@ public class FakeQueryBuilder extends ChangeQueryBuilder {
|
||||
new FakeQueryBuilder.Definition<ChangeData, FakeQueryBuilder>(
|
||||
FakeQueryBuilder.class),
|
||||
new ChangeQueryBuilder.Arguments(null, null, null, null, null, null,
|
||||
null, null, null, null, null, null, null, indexes, null, null),
|
||||
null, null, null, null, null, null, null, indexes, null, null, null),
|
||||
null);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user