Trigger GitReferenceUpdated event when external IDs are updated
When external IDs are updated the refs/meta/external-ids branch in the All-Users repository is updated. For this update we must trigger a GitReferenceUpdated event, so that e.g. this ref update gets replicated to Gerrit slaves. PostGpgKeys and GpgKeys are now injected as provider into GpgApiAdapterImpl to avoid a circular Guice dependency: GitReferenceUpdated needs EventUtil which needs ChangeJson.Factory. ChangeJson uses GpgApiAdapter to find out if push certificates are enabled and if yes to include the push certicates of the patch set uploaders into RevisionInfo. This doesn't require PostGpgKeys and GpgKeys. If PostGpgKeys would be injected without provider we would need ExternalIdsUpdate.User to instantiate it which now needs GitReferenceUpdated. Hence without injecting PostGpgKeys into GpgApiAdapterImpl as a provider we would have a dependency circle. Change-Id: Ia9c71d26669f24f20c659d82ae97ecfca6ab61c3 Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
parent
8dac226947
commit
02e281d9d3
|
@ -38,6 +38,7 @@ import static org.junit.Assert.fail;
|
|||
|
||||
import com.google.common.collect.FluentIterable;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.ImmutableSetMultimap;
|
||||
import com.google.common.collect.Iterables;
|
||||
|
@ -67,6 +68,7 @@ import com.google.gerrit.extensions.common.ChangeInfo;
|
|||
import com.google.gerrit.extensions.common.GpgKeyInfo;
|
||||
import com.google.gerrit.extensions.common.SshKeyInfo;
|
||||
import com.google.gerrit.extensions.events.AccountIndexedListener;
|
||||
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
|
||||
import com.google.gerrit.extensions.registration.DynamicSet;
|
||||
import com.google.gerrit.extensions.registration.RegistrationHandle;
|
||||
import com.google.gerrit.extensions.restapi.AuthException;
|
||||
|
@ -79,6 +81,7 @@ import com.google.gerrit.gpg.PublicKeyStore;
|
|||
import com.google.gerrit.gpg.testutil.TestKey;
|
||||
import com.google.gerrit.reviewdb.client.Account;
|
||||
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||
import com.google.gerrit.reviewdb.client.Project;
|
||||
import com.google.gerrit.reviewdb.client.RefNames;
|
||||
import com.google.gerrit.server.Sequences;
|
||||
import com.google.gerrit.server.account.AccountConfig;
|
||||
|
@ -106,6 +109,7 @@ import java.io.IOException;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
@ -155,6 +159,8 @@ public class AccountIT extends AbstractDaemonTest {
|
|||
|
||||
@Inject private DynamicSet<AccountIndexedListener> accountIndexedListeners;
|
||||
|
||||
@Inject private DynamicSet<GitReferenceUpdatedListener> refUpdateListeners;
|
||||
|
||||
@Inject private Sequences seq;
|
||||
|
||||
@Inject private Provider<InternalAccountQuery> accountQueryProvider;
|
||||
|
@ -163,6 +169,8 @@ public class AccountIT extends AbstractDaemonTest {
|
|||
|
||||
private AccountIndexedCounter accountIndexedCounter;
|
||||
private RegistrationHandle accountIndexEventCounterHandle;
|
||||
private RefUpdateCounter refUpdateCounter;
|
||||
private RegistrationHandle refUpdateCounterHandle;
|
||||
private ExternalIdsUpdate externalIdsUpdate;
|
||||
private List<ExternalId> savedExternalIds;
|
||||
|
||||
|
@ -179,6 +187,19 @@ public class AccountIT extends AbstractDaemonTest {
|
|||
}
|
||||
}
|
||||
|
||||
@Before
|
||||
public void addRefUpdateCounter() {
|
||||
refUpdateCounter = new RefUpdateCounter();
|
||||
refUpdateCounterHandle = refUpdateListeners.add(refUpdateCounter);
|
||||
}
|
||||
|
||||
@After
|
||||
public void removeRefUpdateCounter() {
|
||||
if (refUpdateCounterHandle != null) {
|
||||
refUpdateCounterHandle.remove();
|
||||
}
|
||||
}
|
||||
|
||||
@Before
|
||||
public void saveExternalIds() throws Exception {
|
||||
externalIdsUpdate = externalIdsUpdateFactory.create();
|
||||
|
@ -228,16 +249,25 @@ public class AccountIT extends AbstractDaemonTest {
|
|||
|
||||
@Test
|
||||
public void create() throws Exception {
|
||||
create(2); // account creation + external ID creation
|
||||
Account.Id accountId = create(2); // account creation + external ID creation
|
||||
refUpdateCounter.assertRefUpdateFor(
|
||||
RefUpdateCounter.projectRef(allUsers, RefNames.refsUsers(accountId)),
|
||||
RefUpdateCounter.projectRef(allUsers, RefNames.REFS_EXTERNAL_IDS));
|
||||
}
|
||||
|
||||
@Test
|
||||
@UseSsh
|
||||
public void createWithSshKeys() throws Exception {
|
||||
create(3); // account creation + external ID creation + adding SSH keys
|
||||
Account.Id accountId = create(3); // account creation + external ID creation + adding SSH keys
|
||||
refUpdateCounter.assertRefUpdateFor(
|
||||
ImmutableMap.of(
|
||||
RefUpdateCounter.projectRef(allUsers, RefNames.refsUsers(accountId)),
|
||||
2,
|
||||
RefUpdateCounter.projectRef(allUsers, RefNames.REFS_EXTERNAL_IDS),
|
||||
1));
|
||||
}
|
||||
|
||||
private void create(int expectedAccountReindexCalls) throws Exception {
|
||||
private Account.Id create(int expectedAccountReindexCalls) throws Exception {
|
||||
String name = "foo";
|
||||
TestAccount foo = accountCreator.create(name);
|
||||
AccountInfo info = gApi.accounts().id(foo.id.get()).get();
|
||||
|
@ -245,6 +275,7 @@ public class AccountIT extends AbstractDaemonTest {
|
|||
assertThat(info.name).isEqualTo(name);
|
||||
accountIndexedCounter.assertReindexOf(foo, expectedAccountReindexCalls);
|
||||
assertUserBranch(foo.getId(), name, null);
|
||||
return foo.getId();
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -1899,4 +1930,45 @@ public class AccountIT extends AbstractDaemonTest {
|
|||
assertThat(countsByAccount).isEmpty();
|
||||
}
|
||||
}
|
||||
|
||||
private static class RefUpdateCounter implements GitReferenceUpdatedListener {
|
||||
private final AtomicLongMap<String> countsByProjectRefs = AtomicLongMap.create();
|
||||
|
||||
static String projectRef(Project.NameKey project, String ref) {
|
||||
return projectRef(project.get(), ref);
|
||||
}
|
||||
|
||||
static String projectRef(String project, String ref) {
|
||||
return project + ":" + ref;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGitReferenceUpdated(Event event) {
|
||||
countsByProjectRefs.incrementAndGet(projectRef(event.getProjectName(), event.getRefName()));
|
||||
}
|
||||
|
||||
void clear() {
|
||||
countsByProjectRefs.clear();
|
||||
}
|
||||
|
||||
long getCount(String projectRef) {
|
||||
return countsByProjectRefs.get(projectRef);
|
||||
}
|
||||
|
||||
void assertRefUpdateFor(String... projectRefs) {
|
||||
Map<String, Integer> expectedRefUpdateCounts = new HashMap<>();
|
||||
for (String projectRef : projectRefs) {
|
||||
expectedRefUpdateCounts.put(projectRef, 1);
|
||||
}
|
||||
assertRefUpdateFor(expectedRefUpdateCounts);
|
||||
}
|
||||
|
||||
void assertRefUpdateFor(Map<String, Integer> expectedProjectRefUpdateCounts) {
|
||||
for (Map.Entry<String, Integer> e : expectedProjectRefUpdateCounts.entrySet()) {
|
||||
assertThat(getCount(e.getKey())).isEqualTo(e.getValue());
|
||||
}
|
||||
assertThat(countsByProjectRefs).hasSize(expectedProjectRefUpdateCounts.size());
|
||||
clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -55,6 +55,7 @@ import com.google.gerrit.server.account.externalids.ExternalIds;
|
|||
import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
|
||||
import com.google.gerrit.server.account.externalids.ExternalIdsUpdate.RefsMetaExternalIdsUpdate;
|
||||
import com.google.gerrit.server.config.AllUsersName;
|
||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
|
||||
import com.google.gerrit.server.git.LockFailureException;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import com.google.gwtorm.server.OrmDuplicateKeyException;
|
||||
|
@ -579,7 +580,17 @@ public class ExternalIdIT extends AbstractDaemonTest {
|
|||
noteMap.set(noteId, dataBlob);
|
||||
|
||||
ExternalIdsUpdate.commit(
|
||||
repo, rw, ins, rev, noteMap, "Add external ID", admin.getIdent(), admin.getIdent());
|
||||
allUsers,
|
||||
repo,
|
||||
rw,
|
||||
ins,
|
||||
rev,
|
||||
noteMap,
|
||||
"Add external ID",
|
||||
admin.getIdent(),
|
||||
admin.getIdent(),
|
||||
null,
|
||||
GitReferenceUpdated.DISABLED);
|
||||
return noteId.getName();
|
||||
}
|
||||
}
|
||||
|
@ -600,7 +611,17 @@ public class ExternalIdIT extends AbstractDaemonTest {
|
|||
noteMap.set(noteId, dataBlob);
|
||||
|
||||
ExternalIdsUpdate.commit(
|
||||
repo, rw, ins, rev, noteMap, "Add external ID", admin.getIdent(), admin.getIdent());
|
||||
allUsers,
|
||||
repo,
|
||||
rw,
|
||||
ins,
|
||||
rev,
|
||||
noteMap,
|
||||
"Add external ID",
|
||||
admin.getIdent(),
|
||||
admin.getIdent(),
|
||||
null,
|
||||
GitReferenceUpdated.DISABLED);
|
||||
return noteId.getName();
|
||||
}
|
||||
}
|
||||
|
@ -617,7 +638,17 @@ public class ExternalIdIT extends AbstractDaemonTest {
|
|||
noteMap.set(noteId, dataBlob);
|
||||
|
||||
ExternalIdsUpdate.commit(
|
||||
repo, rw, ins, rev, noteMap, "Add external ID", admin.getIdent(), admin.getIdent());
|
||||
allUsers,
|
||||
repo,
|
||||
rw,
|
||||
ins,
|
||||
rev,
|
||||
noteMap,
|
||||
"Add external ID",
|
||||
admin.getIdent(),
|
||||
admin.getIdent(),
|
||||
null,
|
||||
GitReferenceUpdated.DISABLED);
|
||||
return noteId.getName();
|
||||
}
|
||||
}
|
||||
|
@ -634,7 +665,17 @@ public class ExternalIdIT extends AbstractDaemonTest {
|
|||
noteMap.set(noteId, dataBlob);
|
||||
|
||||
ExternalIdsUpdate.commit(
|
||||
repo, rw, ins, rev, noteMap, "Add external ID", admin.getIdent(), admin.getIdent());
|
||||
allUsers,
|
||||
repo,
|
||||
rw,
|
||||
ins,
|
||||
rev,
|
||||
noteMap,
|
||||
"Add external ID",
|
||||
admin.getIdent(),
|
||||
admin.getIdent(),
|
||||
null,
|
||||
GitReferenceUpdated.DISABLED);
|
||||
return noteId.getName();
|
||||
}
|
||||
}
|
||||
|
@ -690,6 +731,8 @@ public class ExternalIdIT extends AbstractDaemonTest {
|
|||
new DisabledExternalIdCache(),
|
||||
serverIdent.get(),
|
||||
serverIdent.get(),
|
||||
null,
|
||||
GitReferenceUpdated.DISABLED,
|
||||
() -> {
|
||||
if (!doneBgUpdate.getAndSet(true)) {
|
||||
try {
|
||||
|
@ -726,6 +769,8 @@ public class ExternalIdIT extends AbstractDaemonTest {
|
|||
new DisabledExternalIdCache(),
|
||||
serverIdent.get(),
|
||||
serverIdent.get(),
|
||||
null,
|
||||
GitReferenceUpdated.DISABLED,
|
||||
() -> {
|
||||
try {
|
||||
extIdsUpdate
|
||||
|
@ -824,7 +869,17 @@ public class ExternalIdIT extends AbstractDaemonTest {
|
|||
NoteMap noteMap = ExternalIdReader.readNoteMap(rw, rev);
|
||||
ExternalIdsUpdate.insert(rw, ins, noteMap, extId);
|
||||
ExternalIdsUpdate.commit(
|
||||
repo, rw, ins, rev, noteMap, "insert new ID", serverIdent.get(), serverIdent.get());
|
||||
allUsers,
|
||||
repo,
|
||||
rw,
|
||||
ins,
|
||||
rev,
|
||||
noteMap,
|
||||
"insert new ID",
|
||||
serverIdent.get(),
|
||||
serverIdent.get(),
|
||||
null,
|
||||
GitReferenceUpdated.DISABLED);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -839,6 +894,7 @@ public class ExternalIdIT extends AbstractDaemonTest {
|
|||
}
|
||||
|
||||
ExternalIdsUpdate.commit(
|
||||
allUsers,
|
||||
testRepo.getRepository(),
|
||||
testRepo.getRevWalk(),
|
||||
ins,
|
||||
|
@ -846,7 +902,9 @@ public class ExternalIdIT extends AbstractDaemonTest {
|
|||
noteMap,
|
||||
"Add external ID",
|
||||
admin.getIdent(),
|
||||
admin.getIdent());
|
||||
admin.getIdent(),
|
||||
null,
|
||||
GitReferenceUpdated.DISABLED);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ import com.google.gerrit.server.account.AccountResource;
|
|||
import com.google.gerrit.server.api.accounts.GpgApiAdapter;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Provider;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
@ -38,15 +39,15 @@ import org.eclipse.jgit.transport.PushCertificate;
|
|||
import org.eclipse.jgit.transport.PushCertificateParser;
|
||||
|
||||
public class GpgApiAdapterImpl implements GpgApiAdapter {
|
||||
private final PostGpgKeys postGpgKeys;
|
||||
private final GpgKeys gpgKeys;
|
||||
private final Provider<PostGpgKeys> postGpgKeys;
|
||||
private final Provider<GpgKeys> gpgKeys;
|
||||
private final GpgKeyApiImpl.Factory gpgKeyApiFactory;
|
||||
private final GerritPushCertificateChecker.Factory pushCertCheckerFactory;
|
||||
|
||||
@Inject
|
||||
GpgApiAdapterImpl(
|
||||
PostGpgKeys postGpgKeys,
|
||||
GpgKeys gpgKeys,
|
||||
Provider<PostGpgKeys> postGpgKeys,
|
||||
Provider<GpgKeys> gpgKeys,
|
||||
GpgKeyApiImpl.Factory gpgKeyApiFactory,
|
||||
GerritPushCertificateChecker.Factory pushCertCheckerFactory) {
|
||||
this.postGpgKeys = postGpgKeys;
|
||||
|
@ -64,7 +65,7 @@ public class GpgApiAdapterImpl implements GpgApiAdapter {
|
|||
public Map<String, GpgKeyInfo> listGpgKeys(AccountResource account)
|
||||
throws RestApiException, GpgException {
|
||||
try {
|
||||
return gpgKeys.list().apply(account);
|
||||
return gpgKeys.get().list().apply(account);
|
||||
} catch (OrmException | PGPException | IOException e) {
|
||||
throw new GpgException(e);
|
||||
}
|
||||
|
@ -78,7 +79,7 @@ public class GpgApiAdapterImpl implements GpgApiAdapter {
|
|||
in.add = add;
|
||||
in.delete = delete;
|
||||
try {
|
||||
return postGpgKeys.apply(account, in);
|
||||
return postGpgKeys.get().apply(account, in);
|
||||
} catch (PGPException | OrmException | IOException | ConfigInvalidException e) {
|
||||
throw new GpgException(e);
|
||||
}
|
||||
|
@ -88,7 +89,7 @@ public class GpgApiAdapterImpl implements GpgApiAdapter {
|
|||
public GpgKeyApi gpgKey(AccountResource account, IdString idStr)
|
||||
throws RestApiException, GpgException {
|
||||
try {
|
||||
return gpgKeyApiFactory.create(gpgKeys.parse(account, idStr));
|
||||
return gpgKeyApiFactory.create(gpgKeys.get().parse(account, idStr));
|
||||
} catch (PGPException | OrmException | IOException e) {
|
||||
throw new GpgException(e);
|
||||
}
|
||||
|
|
|
@ -16,11 +16,13 @@ package com.google.gerrit.pgm.init;
|
|||
|
||||
import com.google.gerrit.pgm.init.api.AllUsersNameOnInitProvider;
|
||||
import com.google.gerrit.pgm.init.api.InitFlags;
|
||||
import com.google.gerrit.reviewdb.client.Project;
|
||||
import com.google.gerrit.server.GerritPersonIdentProvider;
|
||||
import com.google.gerrit.server.account.externalids.ExternalId;
|
||||
import com.google.gerrit.server.account.externalids.ExternalIdReader;
|
||||
import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
|
||||
import com.google.gerrit.server.config.SitePaths;
|
||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
import com.google.inject.Inject;
|
||||
import java.io.File;
|
||||
|
@ -67,7 +69,17 @@ public class ExternalIdsOnInit {
|
|||
|
||||
PersonIdent serverIdent = new GerritPersonIdentProvider(flags.cfg).get();
|
||||
ExternalIdsUpdate.commit(
|
||||
repo, rw, ins, rev, noteMap, commitMessage, serverIdent, serverIdent);
|
||||
new Project.NameKey(allUsers),
|
||||
repo,
|
||||
rw,
|
||||
ins,
|
||||
rev,
|
||||
noteMap,
|
||||
commitMessage,
|
||||
serverIdent,
|
||||
serverIdent,
|
||||
null,
|
||||
GitReferenceUpdated.DISABLED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ package com.google.gerrit.server.account.externalids;
|
|||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.gerrit.server.GerritPersonIdent;
|
||||
import com.google.gerrit.server.config.AllUsersName;
|
||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
import com.google.inject.Inject;
|
||||
|
@ -41,6 +42,7 @@ import org.eclipse.jgit.revwalk.RevWalk;
|
|||
*/
|
||||
public class ExternalIdsBatchUpdate {
|
||||
private final GitRepositoryManager repoManager;
|
||||
private final GitReferenceUpdated gitRefUpdated;
|
||||
private final AllUsersName allUsersName;
|
||||
private final PersonIdent serverIdent;
|
||||
private final ExternalIdCache externalIdCache;
|
||||
|
@ -50,10 +52,12 @@ public class ExternalIdsBatchUpdate {
|
|||
@Inject
|
||||
public ExternalIdsBatchUpdate(
|
||||
GitRepositoryManager repoManager,
|
||||
GitReferenceUpdated gitRefUpdated,
|
||||
AllUsersName allUsersName,
|
||||
@GerritPersonIdent PersonIdent serverIdent,
|
||||
ExternalIdCache externalIdCache) {
|
||||
this.repoManager = repoManager;
|
||||
this.gitRefUpdated = gitRefUpdated;
|
||||
this.allUsersName = allUsersName;
|
||||
this.serverIdent = serverIdent;
|
||||
this.externalIdCache = externalIdCache;
|
||||
|
@ -105,7 +109,17 @@ public class ExternalIdsBatchUpdate {
|
|||
|
||||
ObjectId newRev =
|
||||
ExternalIdsUpdate.commit(
|
||||
repo, rw, ins, rev, noteMap, commitMessage, serverIdent, serverIdent);
|
||||
allUsersName,
|
||||
repo,
|
||||
rw,
|
||||
ins,
|
||||
rev,
|
||||
noteMap,
|
||||
commitMessage,
|
||||
serverIdent,
|
||||
serverIdent,
|
||||
null,
|
||||
gitRefUpdated);
|
||||
externalIdCache.onReplace(rev, newRev, toDelete, toAdd);
|
||||
}
|
||||
|
||||
|
|
|
@ -41,11 +41,13 @@ import com.google.gerrit.metrics.Counter0;
|
|||
import com.google.gerrit.metrics.Description;
|
||||
import com.google.gerrit.metrics.MetricMaker;
|
||||
import com.google.gerrit.reviewdb.client.Account;
|
||||
import com.google.gerrit.reviewdb.client.Project;
|
||||
import com.google.gerrit.reviewdb.client.RefNames;
|
||||
import com.google.gerrit.server.GerritPersonIdent;
|
||||
import com.google.gerrit.server.IdentifiedUser;
|
||||
import com.google.gerrit.server.account.AccountCache;
|
||||
import com.google.gerrit.server.config.AllUsersName;
|
||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
import com.google.gerrit.server.git.LockFailureException;
|
||||
import com.google.gwtorm.server.OrmDuplicateKeyException;
|
||||
|
@ -111,6 +113,7 @@ public class ExternalIdsUpdate {
|
|||
private final ExternalIds externalIds;
|
||||
private final ExternalIdCache externalIdCache;
|
||||
private final Provider<PersonIdent> serverIdent;
|
||||
private final GitReferenceUpdated gitRefUpdated;
|
||||
|
||||
@Inject
|
||||
public Server(
|
||||
|
@ -120,7 +123,8 @@ public class ExternalIdsUpdate {
|
|||
MetricMaker metricMaker,
|
||||
ExternalIds externalIds,
|
||||
ExternalIdCache externalIdCache,
|
||||
@GerritPersonIdent Provider<PersonIdent> serverIdent) {
|
||||
@GerritPersonIdent Provider<PersonIdent> serverIdent,
|
||||
GitReferenceUpdated gitRefUpdated) {
|
||||
this.repoManager = repoManager;
|
||||
this.accountCache = accountCache;
|
||||
this.allUsersName = allUsersName;
|
||||
|
@ -128,12 +132,22 @@ public class ExternalIdsUpdate {
|
|||
this.externalIds = externalIds;
|
||||
this.externalIdCache = externalIdCache;
|
||||
this.serverIdent = serverIdent;
|
||||
this.gitRefUpdated = gitRefUpdated;
|
||||
}
|
||||
|
||||
public ExternalIdsUpdate create() {
|
||||
PersonIdent i = serverIdent.get();
|
||||
return new ExternalIdsUpdate(
|
||||
repoManager, accountCache, allUsersName, metricMaker, externalIds, externalIdCache, i, i);
|
||||
repoManager,
|
||||
accountCache,
|
||||
allUsersName,
|
||||
metricMaker,
|
||||
externalIds,
|
||||
externalIdCache,
|
||||
i,
|
||||
i,
|
||||
null,
|
||||
gitRefUpdated);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -154,6 +168,7 @@ public class ExternalIdsUpdate {
|
|||
private final ExternalIds externalIds;
|
||||
private final ExternalIdCache externalIdCache;
|
||||
private final Provider<PersonIdent> serverIdent;
|
||||
private final GitReferenceUpdated gitRefUpdated;
|
||||
|
||||
@Inject
|
||||
public ServerNoReindex(
|
||||
|
@ -162,19 +177,30 @@ public class ExternalIdsUpdate {
|
|||
MetricMaker metricMaker,
|
||||
ExternalIds externalIds,
|
||||
ExternalIdCache externalIdCache,
|
||||
@GerritPersonIdent Provider<PersonIdent> serverIdent) {
|
||||
@GerritPersonIdent Provider<PersonIdent> serverIdent,
|
||||
GitReferenceUpdated gitRefUpdated) {
|
||||
this.repoManager = repoManager;
|
||||
this.allUsersName = allUsersName;
|
||||
this.metricMaker = metricMaker;
|
||||
this.externalIds = externalIds;
|
||||
this.externalIdCache = externalIdCache;
|
||||
this.serverIdent = serverIdent;
|
||||
this.gitRefUpdated = gitRefUpdated;
|
||||
}
|
||||
|
||||
public ExternalIdsUpdate create() {
|
||||
PersonIdent i = serverIdent.get();
|
||||
return new ExternalIdsUpdate(
|
||||
repoManager, null, allUsersName, metricMaker, externalIds, externalIdCache, i, i);
|
||||
repoManager,
|
||||
null,
|
||||
allUsersName,
|
||||
metricMaker,
|
||||
externalIds,
|
||||
externalIdCache,
|
||||
i,
|
||||
i,
|
||||
null,
|
||||
gitRefUpdated);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -194,6 +220,7 @@ public class ExternalIdsUpdate {
|
|||
private final ExternalIdCache externalIdCache;
|
||||
private final Provider<PersonIdent> serverIdent;
|
||||
private final Provider<IdentifiedUser> identifiedUser;
|
||||
private final GitReferenceUpdated gitRefUpdated;
|
||||
|
||||
@Inject
|
||||
public User(
|
||||
|
@ -204,7 +231,8 @@ public class ExternalIdsUpdate {
|
|||
ExternalIds externalIds,
|
||||
ExternalIdCache externalIdCache,
|
||||
@GerritPersonIdent Provider<PersonIdent> serverIdent,
|
||||
Provider<IdentifiedUser> identifiedUser) {
|
||||
Provider<IdentifiedUser> identifiedUser,
|
||||
GitReferenceUpdated gitRefUpdated) {
|
||||
this.repoManager = repoManager;
|
||||
this.accountCache = accountCache;
|
||||
this.allUsersName = allUsersName;
|
||||
|
@ -213,9 +241,11 @@ public class ExternalIdsUpdate {
|
|||
this.externalIdCache = externalIdCache;
|
||||
this.serverIdent = serverIdent;
|
||||
this.identifiedUser = identifiedUser;
|
||||
this.gitRefUpdated = gitRefUpdated;
|
||||
}
|
||||
|
||||
public ExternalIdsUpdate create() {
|
||||
IdentifiedUser user = identifiedUser.get();
|
||||
PersonIdent i = serverIdent.get();
|
||||
return new ExternalIdsUpdate(
|
||||
repoManager,
|
||||
|
@ -224,8 +254,10 @@ public class ExternalIdsUpdate {
|
|||
metricMaker,
|
||||
externalIds,
|
||||
externalIdCache,
|
||||
createPersonIdent(i, identifiedUser.get()),
|
||||
i);
|
||||
createPersonIdent(i, user),
|
||||
i,
|
||||
user,
|
||||
gitRefUpdated);
|
||||
}
|
||||
|
||||
private PersonIdent createPersonIdent(PersonIdent ident, IdentifiedUser user) {
|
||||
|
@ -253,6 +285,8 @@ public class ExternalIdsUpdate {
|
|||
private final ExternalIdCache externalIdCache;
|
||||
private final PersonIdent committerIdent;
|
||||
private final PersonIdent authorIdent;
|
||||
@Nullable private final IdentifiedUser currentUser;
|
||||
private final GitReferenceUpdated gitRefUpdated;
|
||||
private final Runnable afterReadRevision;
|
||||
private final Retryer<RefsMetaExternalIdsUpdate> retryer;
|
||||
private final Counter0 updateCount;
|
||||
|
@ -265,7 +299,9 @@ public class ExternalIdsUpdate {
|
|||
ExternalIds externalIds,
|
||||
ExternalIdCache externalIdCache,
|
||||
PersonIdent committerIdent,
|
||||
PersonIdent authorIdent) {
|
||||
PersonIdent authorIdent,
|
||||
@Nullable IdentifiedUser currentUser,
|
||||
GitReferenceUpdated gitRefUpdated) {
|
||||
this(
|
||||
repoManager,
|
||||
accountCache,
|
||||
|
@ -275,6 +311,8 @@ public class ExternalIdsUpdate {
|
|||
externalIdCache,
|
||||
committerIdent,
|
||||
authorIdent,
|
||||
currentUser,
|
||||
gitRefUpdated,
|
||||
Runnables.doNothing(),
|
||||
RETRYER);
|
||||
}
|
||||
|
@ -289,6 +327,8 @@ public class ExternalIdsUpdate {
|
|||
ExternalIdCache externalIdCache,
|
||||
PersonIdent committerIdent,
|
||||
PersonIdent authorIdent,
|
||||
@Nullable IdentifiedUser currentUser,
|
||||
GitReferenceUpdated gitRefUpdated,
|
||||
Runnable afterReadRevision,
|
||||
Retryer<RefsMetaExternalIdsUpdate> retryer) {
|
||||
this.repoManager = checkNotNull(repoManager, "repoManager");
|
||||
|
@ -298,6 +338,8 @@ public class ExternalIdsUpdate {
|
|||
this.externalIds = checkNotNull(externalIds, "externalIds");
|
||||
this.externalIdCache = checkNotNull(externalIdCache, "externalIdCache");
|
||||
this.authorIdent = checkNotNull(authorIdent, "authorIdent");
|
||||
this.currentUser = currentUser;
|
||||
this.gitRefUpdated = checkNotNull(gitRefUpdated, "gitRefUpdated");
|
||||
this.afterReadRevision = checkNotNull(afterReadRevision, "afterReadRevision");
|
||||
this.retryer = checkNotNull(retryer, "retryer");
|
||||
this.updateCount =
|
||||
|
@ -732,13 +774,26 @@ public class ExternalIdsUpdate {
|
|||
NoteMap noteMap,
|
||||
UpdatedExternalIds updatedExtIds)
|
||||
throws IOException {
|
||||
ObjectId newRev = commit(repo, rw, ins, rev, noteMap, COMMIT_MSG, committerIdent, authorIdent);
|
||||
ObjectId newRev =
|
||||
commit(
|
||||
allUsersName,
|
||||
repo,
|
||||
rw,
|
||||
ins,
|
||||
rev,
|
||||
noteMap,
|
||||
COMMIT_MSG,
|
||||
committerIdent,
|
||||
authorIdent,
|
||||
currentUser,
|
||||
gitRefUpdated);
|
||||
updateCount.increment();
|
||||
return RefsMetaExternalIdsUpdate.create(rev, newRev, updatedExtIds);
|
||||
}
|
||||
|
||||
/** Commits updates to the external IDs. */
|
||||
public static ObjectId commit(
|
||||
Project.NameKey project,
|
||||
Repository repo,
|
||||
RevWalk rw,
|
||||
ObjectInserter ins,
|
||||
|
@ -746,7 +801,9 @@ public class ExternalIdsUpdate {
|
|||
NoteMap noteMap,
|
||||
String commitMessage,
|
||||
PersonIdent committerIdent,
|
||||
PersonIdent authorIdent)
|
||||
PersonIdent authorIdent,
|
||||
@Nullable IdentifiedUser user,
|
||||
GitReferenceUpdated gitRefUpdated)
|
||||
throws IOException {
|
||||
CommitBuilder cb = new CommitBuilder();
|
||||
cb.setMessage(commitMessage);
|
||||
|
@ -793,6 +850,7 @@ public class ExternalIdsUpdate {
|
|||
default:
|
||||
throw new IOException("Updating external IDs failed with " + res);
|
||||
}
|
||||
gitRefUpdated.fire(project, u, user != null ? user.getAccount() : null);
|
||||
return rw.parseCommit(commitId);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ import com.google.gerrit.server.account.externalids.ExternalId;
|
|||
import com.google.gerrit.server.account.externalids.ExternalIdReader;
|
||||
import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
|
||||
import com.google.gerrit.server.config.AllUsersName;
|
||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
import com.google.gwtorm.jdbc.JdbcSchema;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
|
@ -93,7 +94,18 @@ public class Schema_144 extends SchemaVersion {
|
|||
ExternalIdsUpdate.upsert(rw, ins, noteMap, extId);
|
||||
}
|
||||
|
||||
ExternalIdsUpdate.commit(repo, rw, ins, rev, noteMap, COMMIT_MSG, serverIdent, serverIdent);
|
||||
ExternalIdsUpdate.commit(
|
||||
allUsersName,
|
||||
repo,
|
||||
rw,
|
||||
ins,
|
||||
rev,
|
||||
noteMap,
|
||||
COMMIT_MSG,
|
||||
serverIdent,
|
||||
serverIdent,
|
||||
null,
|
||||
GitReferenceUpdated.DISABLED);
|
||||
}
|
||||
} catch (IOException | ConfigInvalidException e) {
|
||||
throw new OrmException("Failed to migrate external IDs to NoteDb", e);
|
||||
|
|
|
@ -23,6 +23,7 @@ import com.google.gerrit.server.account.externalids.ExternalId;
|
|||
import com.google.gerrit.server.account.externalids.ExternalIdReader;
|
||||
import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
|
||||
import com.google.gerrit.server.config.AllUsersName;
|
||||
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
import com.google.inject.Inject;
|
||||
|
@ -84,7 +85,18 @@ public class Schema_148 extends SchemaVersion {
|
|||
}
|
||||
}
|
||||
if (dirty) {
|
||||
ExternalIdsUpdate.commit(repo, rw, ins, rev, noteMap, COMMIT_MSG, serverUser, serverUser);
|
||||
ExternalIdsUpdate.commit(
|
||||
allUsersName,
|
||||
repo,
|
||||
rw,
|
||||
ins,
|
||||
rev,
|
||||
noteMap,
|
||||
COMMIT_MSG,
|
||||
serverUser,
|
||||
serverUser,
|
||||
null,
|
||||
GitReferenceUpdated.DISABLED);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new OrmException("Failed to update external IDs", e);
|
||||
|
|
Loading…
Reference in New Issue