summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColby Ranger <cranger@google.com>2012-04-11 09:57:52 -0700
committerColby Ranger <cranger@google.com>2012-04-12 09:20:03 -0700
commit01967efeba3e9f440649a62e8692f05897954464 (patch)
tree55e8338ffd961eb4b6566d6a302229dd007f19d9
parent74d093d93dd03d0bbb3e51431456cc462ec68986 (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
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java2
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_64.java121
-rw-r--r--gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java3
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);
}