diff options
author | Colby Ranger <cranger@google.com> | 2012-04-11 09:57:52 -0700 |
---|---|---|
committer | Colby Ranger <cranger@google.com> | 2012-04-12 09:20:03 -0700 |
commit | 01967efeba3e9f440649a62e8692f05897954464 (patch) | |
tree | 55e8338ffd961eb4b6566d6a302229dd007f19d9 | |
parent | 74d093d93dd03d0bbb3e51431456cc462ec68986 (diff) |
Migrate account_groups.email_only_authors to capability
Added a new schema to migrate the account_groups.email_only_authors flag
to the emailReviewers global capability in All-Projects.
Change-Id: I15d330f9aa04460c7f93eb216bd7f4157cf2eb43
3 files changed, 125 insertions, 1 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java index 9caeed320e..f789300235 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java @@ -32,7 +32,7 @@ import java.util.List; /** A version of the database schema. */ public abstract class SchemaVersion { /** The current schema version. */ - public static final Class<Schema_63> C = Schema_63.class; + public static final Class<Schema_64> C = Schema_64.class; public static class Module extends AbstractModule { @Override diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_64.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_64.java new file mode 100644 index 0000000000..26890a3a6b --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_64.java @@ -0,0 +1,121 @@ +// Copyright (C) 2012 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.schema; + +import com.google.common.collect.Lists; +import com.google.gerrit.common.data.AccessSection; +import com.google.gerrit.common.data.GlobalCapability; +import com.google.gerrit.common.data.GroupReference; +import com.google.gerrit.common.data.Permission; +import com.google.gerrit.reviewdb.client.AccountGroup; +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.GerritPersonIdent; +import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.git.GitRepositoryManager; +import com.google.gerrit.server.git.MetaDataUpdate; +import com.google.gerrit.server.git.NoReplication; +import com.google.gerrit.server.git.ProjectConfig; +import com.google.gwtorm.jdbc.JdbcSchema; +import com.google.gwtorm.server.OrmException; +import com.google.inject.Inject; +import com.google.inject.Provider; + +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.PersonIdent; +import org.eclipse.jgit.lib.Repository; + +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.List; + +public class Schema_64 extends SchemaVersion { + private final AllProjectsName allProjects; + private final GitRepositoryManager mgr; + private final PersonIdent serverUser; + + @Inject + Schema_64(Provider<Schema_63> prior, + AllProjectsName allProjects, + GitRepositoryManager mgr, + @GerritPersonIdent PersonIdent serverUser) { + super(prior); + this.allProjects = allProjects; + this.mgr = mgr; + this.serverUser = serverUser; + } + + @Override + protected void migrateData(ReviewDb db, UpdateUI ui) + throws OrmException, SQLException { + List<GroupReference> groups = Lists.newArrayList(); + Statement stmt = ((JdbcSchema) db).getConnection().createStatement(); + try { + ResultSet rs = stmt.executeQuery( + "SELECT group_uuid, name FROM account_groups WHERE email_only_authors = 'Y'"); + try { + while (rs.next()) { + AccountGroup.UUID uuid = new AccountGroup.UUID(rs.getString(1)); + GroupReference group = new GroupReference(uuid, rs.getString(2)); + groups.add(group); + } + } finally { + rs.close(); + } + } finally { + stmt.close(); + } + + if (groups.isEmpty()) { + return; + } + ui.message("Moved account_groups.email_only_authors to 'Email Reviewers' capability"); + + Repository git; + try { + git = mgr.openRepository(allProjects); + } catch (RepositoryNotFoundException e) { + throw new OrmException(e); + } + try { + MetaDataUpdate md = + new MetaDataUpdate(new NoReplication(), allProjects, git); + md.getCommitBuilder().setAuthor(serverUser); + md.getCommitBuilder().setCommitter(serverUser); + + ProjectConfig config = ProjectConfig.read(md); + AccessSection section = + config.getAccessSection(AccessSection.GLOBAL_CAPABILITIES, true); + Permission capability = + section.getPermission(GlobalCapability.EMAIL_REVIEWERS, true); + for (GroupReference group : groups) { + capability.getRule(config.resolve(group), true).setDeny(); + } + + md.setMessage("Upgrade to Gerrit Code Review schema 64\n"); + if (!config.commit(md)) { + throw new OrmException("Cannot update " + allProjects); + } + } catch (IOException e) { + throw new OrmException(e); + } catch (ConfigInvalidException e) { + throw new OrmException(e); + } finally { + git.close(); + } + } +} diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java index 32868f02d4..a44f84f659 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java +++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java @@ -117,6 +117,9 @@ public class InMemoryDatabase implements SchemaFactory<ReviewDb> { .annotatedWith(GerritPersonIdent.class) // .toProvider(GerritPersonIdentProvider.class); + bind(AllProjectsName.class) + .toInstance(new AllProjectsName("All-Projects")); + bind(GitRepositoryManager.class) // .to(LocalDiskRepositoryManager.class); } |