From ca28af7f81ffe7bc0d92c097df9d5953fe2f760c Mon Sep 17 00:00:00 2001 From: Sven Selberg Date: Thu, 12 May 2016 13:37:24 +0200 Subject: [PATCH] Make diff preferences defaults configurable Read diff preferences from All-Users refs/users/default and update the default values with those preferences. Change-Id: I813ad9976f7e73190fb68f373e77f596dcd6537c --- .../server/account/GetDiffPreferences.java | 37 ++++++++++++++++++- .../gerrit/server/config/ConfigUtil.java | 10 ++--- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDiffPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDiffPreferences.java index be87ae73da..2c4a840ff4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDiffPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDiffPreferences.java @@ -15,6 +15,7 @@ package com.google.gerrit.server.account; import static com.google.gerrit.server.config.ConfigUtil.loadSection; +import static com.google.gerrit.server.config.ConfigUtil.skipField; import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.extensions.restapi.AuthException; @@ -31,11 +32,17 @@ import com.google.inject.Singleton; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; +import java.lang.reflect.Field; @Singleton public class GetDiffPreferences implements RestReadView { + private static final Logger log = + LoggerFactory.getLogger(GetDiffPreferences.class); + private final Provider self; private final Provider allUsersName; private final GitRepositoryManager gitMgr; @@ -66,13 +73,41 @@ public class GetDiffPreferences implements RestReadView { DiffPreferencesInfo in) throws IOException, ConfigInvalidException, RepositoryNotFoundException { try (Repository git = gitMgr.openRepository(allUsersName)) { + // Load all users prefs. + VersionedAccountPreferences dp = + VersionedAccountPreferences.forDefault(); + dp.load(git); + DiffPreferencesInfo allUserPrefs = new DiffPreferencesInfo(); + loadSection(dp.getConfig(), UserConfigSections.DIFF, null, allUserPrefs, + DiffPreferencesInfo.defaults(), in); + + // Load user prefs VersionedAccountPreferences p = VersionedAccountPreferences.forUser(id); p.load(git); DiffPreferencesInfo prefs = new DiffPreferencesInfo(); loadSection(p.getConfig(), UserConfigSections.DIFF, null, prefs, - DiffPreferencesInfo.defaults(), in); + updateDefaults(allUserPrefs), in); return prefs; } } + + private static DiffPreferencesInfo updateDefaults(DiffPreferencesInfo input) { + DiffPreferencesInfo result = DiffPreferencesInfo.defaults(); + try { + for (Field field : input.getClass().getDeclaredFields()) { + if (skipField(field)) { + continue; + } + Object newVal = field.get(input); + if (newVal != null) { + field.set(result, newVal); + } + } + } catch (IllegalAccessException e) { + log.warn("Cannot get default diff preferences from All-Users", e); + return DiffPreferencesInfo.defaults(); + } + return result; + } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java index e124e486d0..eaeb850643 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java @@ -382,16 +382,16 @@ public class ConfigUtil { return s; } + public static boolean skipField(Field field) { + int modifiers = field.getModifiers(); + return Modifier.isFinal(modifiers) || Modifier.isTransient(modifiers); + } + private static boolean isCollectionOrMap(Class t) { return Collection.class.isAssignableFrom(t) || Map.class.isAssignableFrom(t); } - private static boolean skipField(Field field) { - int modifiers = field.getModifiers(); - return Modifier.isFinal(modifiers) || Modifier.isTransient(modifiers); - } - private static boolean isString(Class t) { return String.class == t; }