diff options
Diffstat (limited to 'gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/ExternalIdsOnInit.java')
-rw-r--r-- | gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/ExternalIdsOnInit.java | 78 |
1 files changed, 72 insertions, 6 deletions
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/ExternalIdsOnInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/ExternalIdsOnInit.java index 5f992bfba2..ab491f7cdf 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/ExternalIdsOnInit.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/ExternalIdsOnInit.java @@ -14,15 +14,81 @@ package com.google.gerrit.pgm.init; -import static com.google.gerrit.server.account.ExternalId.toAccountExternalIds; - -import com.google.gerrit.reviewdb.server.ReviewDb; -import com.google.gerrit.server.account.ExternalId; +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; +import java.io.IOException; +import java.nio.file.Path; import java.util.Collection; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.internal.storage.file.FileRepository; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.lib.RepositoryCache.FileKey; +import org.eclipse.jgit.notes.NoteMap; +import org.eclipse.jgit.revwalk.RevWalk; +import org.eclipse.jgit.util.FS; public class ExternalIdsOnInit { - public synchronized void insert(ReviewDb db, Collection<ExternalId> extIds) throws OrmException { - db.accountExternalIds().insert(toAccountExternalIds(extIds)); + private final InitFlags flags; + private final SitePaths site; + private final String allUsers; + + @Inject + public ExternalIdsOnInit(InitFlags flags, SitePaths site, AllUsersNameOnInitProvider allUsers) { + this.flags = flags; + this.site = site; + this.allUsers = allUsers.get(); + } + + public synchronized void insert(String commitMessage, Collection<ExternalId> extIds) + throws OrmException, IOException, ConfigInvalidException { + + File path = getPath(); + if (path != null) { + try (Repository repo = new FileRepository(path); + RevWalk rw = new RevWalk(repo); + ObjectInserter ins = repo.newObjectInserter()) { + ObjectId rev = ExternalIdReader.readRevision(repo); + + NoteMap noteMap = ExternalIdReader.readNoteMap(rw, rev); + for (ExternalId extId : extIds) { + ExternalIdsUpdate.insert(rw, ins, noteMap, extId); + } + + PersonIdent serverIdent = new GerritPersonIdentProvider(flags.cfg).get(); + ExternalIdsUpdate.commit( + new Project.NameKey(allUsers), + repo, + rw, + ins, + rev, + noteMap, + commitMessage, + serverIdent, + serverIdent, + null, + GitReferenceUpdated.DISABLED); + } + } + } + + private File getPath() { + Path basePath = site.resolve(flags.cfg.getString("gerrit", null, "basePath")); + if (basePath == null) { + throw new IllegalStateException("gerrit.basePath must be configured"); + } + return FileKey.resolve(basePath.resolve(allUsers).toFile(), FS.DETECTED); } } |