blob: 920160b539cafc75201d648b642e2d1fb4eaef1c [file] [log] [blame]
// Copyright (C) 2015 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 static com.google.gerrit.server.config.ConfigUtil.storeSection;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.gerrit.extensions.client.DiffPreferencesInfo;
import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
import com.google.gerrit.extensions.client.Theme;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.account.VersionedAccountPreferences;
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.MetaDataUpdate;
import com.google.gerrit.server.git.UserConfigSections;
import com.google.gerrit.server.patch.PatchListKey;
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.lib.BatchRefUpdate;
import org.eclipse.jgit.lib.NullProgressMonitor;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevWalk;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
public class Schema_115 extends SchemaVersion {
private final GitRepositoryManager mgr;
private final AllUsersName allUsersName;
private final PersonIdent serverUser;
@Inject
Schema_115(Provider<Schema_114> prior,
GitRepositoryManager mgr,
AllUsersName allUsersName,
@GerritPersonIdent PersonIdent serverUser) {
super(prior);
this.mgr = mgr;
this.allUsersName = allUsersName;
this.serverUser = serverUser;
}
@Override
protected void migrateData(ReviewDb db, UpdateUI ui)
throws OrmException, SQLException {
Map<Account.Id, DiffPreferencesInfo> imports = new HashMap<>();
try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
ResultSet rs = stmt.executeQuery(
"SELECT "
+ "id, "
+ "context, "
+ "expand_all_comments, "
+ "hide_line_numbers, "
+ "hide_top_menu, "
+ "ignore_whitespace, "
+ "intraline_difference, "
+ "line_length, "
+ "manual_review, "
+ "render_entire_file, "
+ "retain_header, "
+ "show_line_endings, "
+ "show_tabs, "
+ "show_whitespace_errors, "
+ "skip_deleted, "
+ "skip_uncommented, "
+ "syntax_highlighting, "
+ "tab_size, "
+ "theme, "
+ "hide_empty_pane, "
+ "auto_hide_diff_table_header "
+ "FROM account_diff_preferences")) {
while (rs.next()) {
Account.Id accountId = new Account.Id(rs.getInt(1));
DiffPreferencesInfo prefs = new DiffPreferencesInfo();
prefs.context = (int)rs.getShort(2);
prefs.expandAllComments = toBoolean(rs.getString(3));
prefs.hideLineNumbers = toBoolean(rs.getString(4));
prefs.hideTopMenu = toBoolean(rs.getString(5));
// Enum with char as value
prefs.ignoreWhitespace = toWhitespace(rs.getString(6));
prefs.intralineDifference = toBoolean(rs.getString(7));
prefs.lineLength = rs.getInt(8);
prefs.manualReview = toBoolean(rs.getString(9));
prefs.renderEntireFile = toBoolean(rs.getString(10));
prefs.retainHeader = toBoolean(rs.getString(11));
prefs.showLineEndings = toBoolean(rs.getString(12));
prefs.showTabs = toBoolean(rs.getString(13));
prefs.showWhitespaceErrors = toBoolean(rs.getString(14));
prefs.skipDeleted = toBoolean(rs.getString(15));
prefs.skipUncommented = toBoolean(rs.getString(16));
prefs.syntaxHighlighting = toBoolean(rs.getString(17));
prefs.tabSize = rs.getInt(18);
// Enum with name as values; can be null
prefs.theme = toTheme(rs.getString(19));
prefs.hideEmptyPane = toBoolean(rs.getString(20));
prefs.autoHideDiffTableHeader = toBoolean(rs.getString(21));
imports.put(accountId, prefs);
}
}
if (imports.isEmpty()) {
return;
}
try (Repository git = mgr.openRepository(allUsersName);
RevWalk rw = new RevWalk(git)) {
BatchRefUpdate bru = git.getRefDatabase().newBatchUpdate();
MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED,
allUsersName, git, bru);
md.getCommitBuilder().setAuthor(serverUser);
md.getCommitBuilder().setCommitter(serverUser);
for (Map.Entry<Account.Id, DiffPreferencesInfo> e : imports.entrySet()) {
VersionedAccountPreferences p =
VersionedAccountPreferences.forUser(e.getKey());
p.load(md);
storeSection(p.getConfig(), UserConfigSections.DIFF, null,
e.getValue(), DiffPreferencesInfo.defaults());
p.commit(md);
}
bru.execute(rw, NullProgressMonitor.INSTANCE);
} catch (ConfigInvalidException | IOException ex) {
throw new OrmException(ex);
}
}
private static Theme toTheme(String v) {
if (v == null) {
return Theme.DEFAULT;
}
return Theme.valueOf(v);
}
private static Whitespace toWhitespace(String v) {
Preconditions.checkNotNull(v);
if (v.isEmpty()) {
return Whitespace.IGNORE_NONE;
}
Whitespace r = PatchListKey.WHITESPACE_TYPES.inverse().get(v.charAt(0));
if (r == null) {
throw new IllegalArgumentException("Cannot find Whitespace type for: "
+ v);
}
return r;
}
private static boolean toBoolean(String v) {
Preconditions.checkState(!Strings.isNullOrEmpty(v));
return v.equals("Y");
}
}