diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/DiffPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/DiffPreferencesIT.java new file mode 100644 index 0000000000..5550cb6598 --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/DiffPreferencesIT.java @@ -0,0 +1,160 @@ +// 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.acceptance.rest.account; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; + +import com.google.gerrit.acceptance.AbstractDaemonTest; +import com.google.gerrit.acceptance.RestResponse; +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.testutil.ConfigSuite; + +import org.apache.http.HttpStatus; +import org.eclipse.jgit.lib.Config; +import org.junit.Test; + +public class DiffPreferencesIT extends AbstractDaemonTest { + @ConfigSuite.Config + public static Config readFromGitConfig() { + Config cfg = new Config(); + cfg.setBoolean("user", null, "readPrefsFromGit", true); + return cfg; + } + + @Test + public void getDiffPreferencesOfNonExistingAccount_NotFound() + throws Exception { + assertEquals(HttpStatus.SC_NOT_FOUND, + adminSession.get("/accounts/non-existing/preferences.diff") + .getStatusCode()); + } + + @Test + public void getDiffPreferences() throws Exception { + RestResponse r = adminSession.get("/accounts/" + admin.email + + "/preferences.diff"); + assertEquals(HttpStatus.SC_OK, r.getStatusCode()); + DiffPreferencesInfo d = DiffPreferencesInfo.defaults(); + DiffPreferencesInfo o = + newGson().fromJson(r.getReader(), DiffPreferencesInfo.class); + + assertThat(o.context).isEqualTo(d.context); + assertThat(o.tabSize).isEqualTo(d.tabSize); + assertThat(o.lineLength).isEqualTo(d.lineLength); + assertThat(o.expandAllComments).isNull(); + assertThat(o.intralineDifference).isEqualTo(d.intralineDifference); + assertThat(o.manualReview).isNull(); + assertThat(o.retainHeader).isNull(); + assertThat(o.showLineEndings).isEqualTo(d.showLineEndings); + assertThat(o.showTabs).isEqualTo(d.showTabs); + assertThat(o.showWhitespaceErrors).isEqualTo(d.showWhitespaceErrors); + assertThat(o.skipDeleted).isNull(); + assertThat(o.skipUncommented).isNull(); + assertThat(o.syntaxHighlighting).isEqualTo(d.syntaxHighlighting); + assertThat(o.hideTopMenu).isNull(); + assertThat(o.autoHideDiffTableHeader).isEqualTo(d.autoHideDiffTableHeader); + assertThat(o.hideLineNumbers).isNull(); + assertThat(o.renderEntireFile).isNull(); + assertThat(o.hideEmptyPane).isNull(); + assertThat(o.ignoreWhitespace).isEqualTo(d.ignoreWhitespace); + assertThat(o.theme).isEqualTo(d.theme); + } + + @Test + public void setDiffPreferences() throws Exception { + DiffPreferencesInfo i = DiffPreferencesInfo.defaults(); + + // change all default values + i.context *= -1; + i.tabSize *= -1; + i.lineLength *= -1; + i.theme = Theme.MIDNIGHT; + i.ignoreWhitespace = Whitespace.IGNORE_ALL; + i.expandAllComments ^= true; + i.intralineDifference ^= true; + i.manualReview ^= true; + i.retainHeader ^= true; + i.showLineEndings ^= true; + i.showTabs ^= true; + i.showWhitespaceErrors ^= true; + i.skipDeleted ^= true; + i.skipUncommented ^= true; + i.syntaxHighlighting ^= true; + i.hideTopMenu ^= true; + i.autoHideDiffTableHeader ^= true; + i.hideLineNumbers ^= true; + i.renderEntireFile ^= true; + i.hideEmptyPane ^= true; + + RestResponse r = adminSession.put("/accounts/" + admin.email + + "/preferences.diff", i); + assertEquals(HttpStatus.SC_OK, r.getStatusCode()); + DiffPreferencesInfo o = newGson().fromJson(r.getReader(), + DiffPreferencesInfo.class); + + assertThat(o.context).isEqualTo(i.context); + assertThat(o.tabSize).isEqualTo(i.tabSize); + assertThat(o.lineLength).isEqualTo(i.lineLength); + assertThat(o.expandAllComments).isEqualTo(i.expandAllComments); + assertThat(o.intralineDifference).isNull(); + assertThat(o.manualReview).isEqualTo(i.manualReview); + assertThat(o.retainHeader).isEqualTo(i.retainHeader); + assertThat(o.showLineEndings).isNull(); + assertThat(o.showTabs).isNull(); + assertThat(o.showWhitespaceErrors).isNull(); + assertThat(o.skipDeleted).isEqualTo(i.skipDeleted); + assertThat(o.skipUncommented).isEqualTo(i.skipUncommented); + assertThat(o.syntaxHighlighting).isNull(); + assertThat(o.hideTopMenu).isEqualTo(i.hideTopMenu); + assertThat(o.autoHideDiffTableHeader).isNull(); + assertThat(o.hideLineNumbers).isEqualTo(i.hideLineNumbers); + assertThat(o.renderEntireFile).isEqualTo(i.renderEntireFile); + assertThat(o.hideEmptyPane).isEqualTo(i.hideEmptyPane); + assertThat(o.ignoreWhitespace).isEqualTo(i.ignoreWhitespace); + assertThat(o.theme).isEqualTo(i.theme); + + // Partially fill input record + i = new DiffPreferencesInfo(); + i.tabSize = 42; + r = adminSession.put("/accounts/" + admin.email + + "/preferences.diff", i); + DiffPreferencesInfo a = newGson().fromJson(r.getReader(), + DiffPreferencesInfo.class); + + assertThat(a.context).isEqualTo(o.context); + assertThat(a.tabSize).isEqualTo(42); + assertThat(a.lineLength).isEqualTo(o.lineLength); + assertThat(a.expandAllComments).isEqualTo(o.expandAllComments); + assertThat(a.intralineDifference).isNull(); + assertThat(a.manualReview).isEqualTo(o.manualReview); + assertThat(a.retainHeader).isEqualTo(o.retainHeader); + assertThat(a.showLineEndings).isNull(); + assertThat(a.showTabs).isNull(); + assertThat(a.showWhitespaceErrors).isNull(); + assertThat(a.skipDeleted).isEqualTo(o.skipDeleted); + assertThat(a.skipUncommented).isEqualTo(o.skipUncommented); + assertThat(a.syntaxHighlighting).isNull(); + assertThat(a.hideTopMenu).isEqualTo(o.hideTopMenu); + assertThat(a.autoHideDiffTableHeader).isNull(); + assertThat(a.hideLineNumbers).isEqualTo(o.hideLineNumbers); + assertThat(a.renderEntireFile).isEqualTo(o.renderEntireFile); + assertThat(a.hideEmptyPane).isEqualTo(o.hideEmptyPane); + assertThat(a.ignoreWhitespace).isEqualTo(o.ignoreWhitespace); + assertThat(a.theme).isEqualTo(o.theme); + } +} diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetDiffPreferencesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetDiffPreferencesIT.java deleted file mode 100644 index 02a94f8d72..0000000000 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/GetDiffPreferencesIT.java +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (C) 2013 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.acceptance.rest.account; - -import static com.google.common.truth.Truth.assertThat; - -import com.google.gerrit.acceptance.AbstractDaemonTest; -import com.google.gerrit.acceptance.RestResponse; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; -import com.google.gerrit.server.account.GetDiffPreferences.DiffPreferencesInfo; - -import org.apache.http.HttpStatus; -import org.junit.Test; - -public class GetDiffPreferencesIT extends AbstractDaemonTest { - @Test - public void getDiffPreferencesOfNonExistingAccount_NotFound() - throws Exception { - assertThat(adminSession.get("/accounts/non-existing/preferences.diff").getStatusCode()) - .isEqualTo(HttpStatus.SC_NOT_FOUND); - } - - @Test - public void getDiffPreferences() throws Exception { - RestResponse r = adminSession.get("/accounts/" + admin.email + "/preferences.diff"); - assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK); - DiffPreferencesInfo diffPreferences = - newGson().fromJson(r.getReader(), DiffPreferencesInfo.class); - assertDiffPreferences(new AccountDiffPreference(admin.id), diffPreferences); - } - - private static void assertDiffPreferences(AccountDiffPreference expected, DiffPreferencesInfo actual) { - assertThat(actual.context).isEqualTo(expected.getContext()); - assertThat(toBoolean(actual.expandAllComments)).isEqualTo(expected.isExpandAllComments()); - assertThat(actual.ignoreWhitespace).isEqualTo(expected.getIgnoreWhitespace()); - assertThat(toBoolean(actual.intralineDifference)).isEqualTo(expected.isIntralineDifference()); - assertThat(actual.lineLength).isEqualTo(expected.getLineLength()); - assertThat(toBoolean(actual.manualReview)).isEqualTo(expected.isManualReview()); - assertThat(toBoolean(actual.retainHeader)).isEqualTo(expected.isRetainHeader()); - assertThat(toBoolean(actual.showLineEndings)).isEqualTo(expected.isShowLineEndings()); - assertThat(toBoolean(actual.showTabs)).isEqualTo(expected.isShowTabs()); - assertThat(toBoolean(actual.showWhitespaceErrors)).isEqualTo(expected.isShowWhitespaceErrors()); - assertThat(toBoolean(actual.skipDeleted)).isEqualTo(expected.isSkipDeleted()); - assertThat(toBoolean(actual.skipUncommented)).isEqualTo(expected.isSkipUncommented()); - assertThat(toBoolean(actual.syntaxHighlighting)).isEqualTo(expected.isSyntaxHighlighting()); - assertThat(actual.tabSize).isEqualTo(expected.getTabSize()); - } - - private static boolean toBoolean(Boolean b) { - if (b == null) { - return false; - } - return b.booleanValue(); - } -} diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java index b80d6d9d46..c4a07f2071 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/PatchListCacheIT.java @@ -20,8 +20,8 @@ import static com.google.gerrit.acceptance.GitUtil.pushHead; import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.NoHttpd; +import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; import com.google.gerrit.extensions.restapi.RestApiException; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.Patch.ChangeType; import com.google.gerrit.server.patch.PatchListCache; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountService.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountService.java index 81bca202c3..533dfa26a2 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountService.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountService.java @@ -16,8 +16,8 @@ package com.google.gerrit.common.data; import com.google.gerrit.common.audit.Audit; import com.google.gerrit.common.auth.SignInRequired; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.reviewdb.client.Account; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; import com.google.gerrit.reviewdb.client.AccountProjectWatch; import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.gwtjsonrpc.common.RemoteJsonService; @@ -35,7 +35,7 @@ public interface AccountService extends RemoteJsonService { @Audit @SignInRequired - void changeDiffPreferences(AccountDiffPreference diffPref, + void changeDiffPreferences(DiffPreferencesInfo diffPref, AsyncCallback callback); @SignInRequired diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeDetailService.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeDetailService.java index 58244159f5..6d9c2cd40c 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeDetailService.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeDetailService.java @@ -15,7 +15,7 @@ package com.google.gerrit.common.data; import com.google.gerrit.common.audit.Audit; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.gwtjsonrpc.common.RemoteJsonService; @@ -29,5 +29,5 @@ public interface ChangeDetailService extends RemoteJsonService { @Audit void patchSetDetail2(PatchSet.Id baseId, PatchSet.Id key, - AccountDiffPreference diffPrefs, AsyncCallback callback); + DiffPreferencesInfo diffPrefs, AsyncCallback callback); } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java index aa86c47e91..2e991d9c13 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/HostPageData.java @@ -14,7 +14,7 @@ package com.google.gerrit.common.data; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import java.util.Date; import java.util.List; @@ -22,7 +22,7 @@ import java.util.List; /** Data sent as part of the host page, to bootstrap the UI. */ public class HostPageData { public String version; - public AccountDiffPreference accountDiffPref; + public DiffPreferencesInfo accountDiffPref; public String xGerritAuth; public Theme theme; public List plugins; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchDetailService.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchDetailService.java index 19fcbeb7b1..d9601f04a1 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchDetailService.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchDetailService.java @@ -15,7 +15,7 @@ package com.google.gerrit.common.data; import com.google.gerrit.common.audit.Audit; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gwtjsonrpc.common.AsyncCallback; @@ -27,5 +27,5 @@ import com.google.gwtjsonrpc.common.RpcImpl.Version; public interface PatchDetailService extends RemoteJsonService { @Audit void patchScript(Patch.Key key, PatchSet.Id a, PatchSet.Id b, - AccountDiffPreference diffPrefs, AsyncCallback callback); + DiffPreferencesInfo diffPrefs, AsyncCallback callback); } diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java index 7bab43ab96..f23afb1ccf 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/PatchScript.java @@ -14,10 +14,10 @@ package com.google.gerrit.common.data; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; +import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; import com.google.gerrit.prettify.common.EditList; import com.google.gerrit.prettify.common.SparseFileContent; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.Patch.ChangeType; @@ -42,7 +42,7 @@ public class PatchScript { protected FileMode oldMode; protected FileMode newMode; protected List header; - protected AccountDiffPreference diffPrefs; + protected DiffPreferencesInfo diffPrefs; protected SparseFileContent a; protected SparseFileContent b; protected List edits; @@ -62,7 +62,7 @@ public class PatchScript { public PatchScript(final Change.Key ck, final ChangeType ct, final String on, final String nn, final FileMode om, final FileMode nm, - final List h, final AccountDiffPreference dp, + final List h, final DiffPreferencesInfo dp, final SparseFileContent ca, final SparseFileContent cb, final List e, final DisplayMethod ma, final DisplayMethod mb, final String mta, final String mtb, final CommentDetail cd, @@ -142,11 +142,11 @@ public class PatchScript { return history; } - public AccountDiffPreference getDiffPrefs() { + public DiffPreferencesInfo getDiffPrefs() { return diffPrefs; } - public void setDiffPrefs(AccountDiffPreference dp) { + public void setDiffPrefs(DiffPreferencesInfo dp) { diffPrefs = dp; } @@ -155,7 +155,7 @@ public class PatchScript { } public boolean isIgnoreWhitespace() { - return diffPrefs.getIgnoreWhitespace() != Whitespace.IGNORE_NONE; + return diffPrefs.ignoreWhitespace != Whitespace.IGNORE_NONE; } public boolean hasIntralineDifference() { @@ -171,7 +171,7 @@ public class PatchScript { } public boolean isExpandAllComments() { - return diffPrefs.isExpandAllComments(); + return diffPrefs.expandAllComments; } public SparseFileContent getA() { @@ -195,8 +195,8 @@ public class PatchScript { } public Iterable getHunks() { - int ctx = diffPrefs.getContext(); - if (ctx == AccountDiffPreference.WHOLE_FILE_CONTEXT) { + int ctx = diffPrefs.context; + if (ctx == DiffPreferencesInfo.WHOLE_FILE_CONTEXT) { ctx = Math.max(a.size(), b.size()); } return new EditList(edits, ctx, a.size(), b.size()).getHunks(); diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java new file mode 100644 index 0000000000..c488bd769d --- /dev/null +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/DiffPreferencesInfo.java @@ -0,0 +1,87 @@ +// Copyright (C) 2014 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.extensions.client; + +public class DiffPreferencesInfo { + + /** Default number of lines of context. */ + public static final int DEFAULT_CONTEXT = 10; + + /** Default tab size. */ + public static final int DEFAULT_TAB_SIZE = 8; + + /** Default line length. */ + public static final int DEFAULT_LINE_LENGTH = 100; + + /** Context setting to display the entire file. */ + public static final short WHOLE_FILE_CONTEXT = -1; + + /** Typical valid choices for the default context setting. */ + public static final short[] CONTEXT_CHOICES = + {3, 10, 25, 50, 75, 100, WHOLE_FILE_CONTEXT}; + + public static enum Whitespace { + IGNORE_NONE, + IGNORE_TRAILING, + IGNORE_LEADING_AND_TRAILING, + IGNORE_ALL; + } + + public Integer context; + public Integer tabSize; + public Integer lineLength; + public Boolean expandAllComments; + public Boolean intralineDifference; + public Boolean manualReview; + public Boolean showLineEndings; + public Boolean showTabs; + public Boolean showWhitespaceErrors; + public Boolean syntaxHighlighting; + public Boolean hideTopMenu; + public Boolean autoHideDiffTableHeader; + public Boolean hideLineNumbers; + public Boolean renderEntireFile; + public Boolean hideEmptyPane; + public Theme theme; + public Whitespace ignoreWhitespace; + public Boolean retainHeader; + public Boolean skipDeleted; + public Boolean skipUncommented; + + public static DiffPreferencesInfo defaults() { + DiffPreferencesInfo i = new DiffPreferencesInfo(); + i.context = DEFAULT_CONTEXT; + i.tabSize = DEFAULT_TAB_SIZE; + i.lineLength = DEFAULT_LINE_LENGTH; + i.ignoreWhitespace = Whitespace.IGNORE_NONE; + i.theme = Theme.DEFAULT; + i.expandAllComments = false; + i.intralineDifference = true; + i.manualReview = false; + i.retainHeader = false; + i.showLineEndings = true; + i.showTabs = true; + i.showWhitespaceErrors = true; + i.skipDeleted = false; + i.skipUncommented = false; + i.syntaxHighlighting = true; + i.hideTopMenu = false; + i.autoHideDiffTableHeader = true; + i.hideLineNumbers = false; + i.renderEntireFile = false; + i.hideEmptyPane = false; + return i; + } +} \ No newline at end of file diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java index cd53b8e2fa..ee67116c17 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java @@ -47,9 +47,9 @@ import com.google.gerrit.client.ui.Screen; import com.google.gerrit.common.PageLinks; import com.google.gerrit.common.data.HostPageData; import com.google.gerrit.common.data.SystemInfoService; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.extensions.client.EditPreferencesInfo; import com.google.gerrit.extensions.client.GerritTopMenu; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; import com.google.gerrit.reviewdb.client.Project; import com.google.gwt.aria.client.Roles; import com.google.gwt.core.client.EntryPoint; @@ -119,7 +119,7 @@ public class Gerrit implements EntryPoint { private static String docUrl; private static HostPageData.Theme myTheme; private static String defaultScreenToken; - private static AccountDiffPreference myAccountDiffPref; + private static DiffPreferencesInfo myAccountDiffPref; private static EditPreferencesInfo editPrefs; private static String xGerritAuth; private static boolean isNoteDbEnabled; @@ -321,12 +321,12 @@ public class Gerrit implements EntryPoint { return myPrefs; } - /** @return the currently signed in users's diff preferences; null if no diff preferences defined for the account */ - public static AccountDiffPreference getAccountDiffPreference() { + /** @return the currently signed in users's diff preferences, or default values */ + public static DiffPreferencesInfo getDiffPreferences() { return myAccountDiffPref; } - public static void setAccountDiffPreference(AccountDiffPreference accountDiffPref) { + public static void setDiffPreferences(DiffPreferencesInfo accountDiffPref) { myAccountDiffPref = accountDiffPref; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/DiffPreferences.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/DiffPreferences.java index 54541e4266..07d45e9ab4 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/DiffPreferences.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/DiffPreferences.java @@ -14,55 +14,58 @@ package com.google.gerrit.client.account; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.extensions.client.Theme; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; +import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; import com.google.gwt.core.client.JavaScriptObject; public class DiffPreferences extends JavaScriptObject { - public static DiffPreferences create(AccountDiffPreference in) { + public static DiffPreferences create(DiffPreferencesInfo in) { DiffPreferences p = createObject().cast(); - if (in == null) { - in = AccountDiffPreference.createDefault(null); - } - p.ignoreWhitespace(in.getIgnoreWhitespace()); - p.tabSize(in.getTabSize()); - p.lineLength(in.getLineLength()); - p.context(in.getContext()); - p.intralineDifference(in.isIntralineDifference()); - p.showLineEndings(in.isShowLineEndings()); - p.showTabs(in.isShowTabs()); - p.showWhitespaceErrors(in.isShowWhitespaceErrors()); - p.syntaxHighlighting(in.isSyntaxHighlighting()); - p.hideTopMenu(in.isHideTopMenu()); - p.autoHideDiffTableHeader(in.isAutoHideDiffTableHeader()); - p.hideLineNumbers(in.isHideLineNumbers()); - p.expandAllComments(in.isExpandAllComments()); - p.manualReview(in.isManualReview()); - p.renderEntireFile(in.isRenderEntireFile()); - p.theme(in.getTheme()); - p.hideEmptyPane(in.isHideEmptyPane()); + p.ignoreWhitespace(in.ignoreWhitespace); + p.tabSize(in.tabSize); + p.lineLength(in.lineLength); + p.context(in.context); + p.intralineDifference(in.intralineDifference); + p.showLineEndings(in.showLineEndings); + p.showTabs(in.showTabs); + p.showWhitespaceErrors(in.showWhitespaceErrors); + p.syntaxHighlighting(in.syntaxHighlighting); + p.hideTopMenu(in.hideTopMenu); + p.autoHideDiffTableHeader(in.autoHideDiffTableHeader); + p.hideLineNumbers(in.hideLineNumbers); + p.expandAllComments(in.expandAllComments); + p.manualReview(in.manualReview); + p.renderEntireFile(in.renderEntireFile); + p.theme(in.theme); + p.hideEmptyPane(in.hideEmptyPane); + p.retainHeader(in.retainHeader); + p.skipUncommented(in.skipUncommented); + p.skipDeleted(in.skipDeleted); return p; } - public final void copyTo(AccountDiffPreference p) { - p.setIgnoreWhitespace(ignoreWhitespace()); - p.setTabSize(tabSize()); - p.setLineLength(lineLength()); - p.setContext((short)context()); - p.setIntralineDifference(intralineDifference()); - p.setShowLineEndings(showLineEndings()); - p.setShowTabs(showTabs()); - p.setShowWhitespaceErrors(showWhitespaceErrors()); - p.setSyntaxHighlighting(syntaxHighlighting()); - p.setHideTopMenu(hideTopMenu()); - p.setAutoHideDiffTableHeader(autoHideDiffTableHeader()); - p.setHideLineNumbers(hideLineNumbers()); - p.setExpandAllComments(expandAllComments()); - p.setManualReview(manualReview()); - p.setRenderEntireFile(renderEntireFile()); - p.setTheme(theme()); - p.setHideEmptyPane(hideEmptyPane()); + public final void copyTo(DiffPreferencesInfo p) { + p.context = context(); + p.tabSize = tabSize(); + p.lineLength = lineLength(); + p.expandAllComments = expandAllComments(); + p.intralineDifference = intralineDifference(); + p.manualReview = manualReview(); + p.retainHeader = retainHeader(); + p.showLineEndings = showLineEndings(); + p.showTabs = showTabs(); + p.showWhitespaceErrors = showWhitespaceErrors(); + p.skipDeleted = skipDeleted(); + p.skipUncommented = skipUncommented(); + p.syntaxHighlighting = syntaxHighlighting(); + p.hideTopMenu = hideTopMenu(); + p.autoHideDiffTableHeader = autoHideDiffTableHeader(); + p.hideLineNumbers = hideLineNumbers(); + p.renderEntireFile = renderEntireFile(); + p.hideEmptyPane = hideEmptyPane(); + p.theme = theme(); + p.ignoreWhitespace = ignoreWhitespace(); } public final void ignoreWhitespace(Whitespace i) { @@ -122,6 +125,9 @@ public class DiffPreferences extends JavaScriptObject { public final native void manualReview(boolean r) /*-{ this.manual_review = r }-*/; public final native void renderEntireFile(boolean r) /*-{ this.render_entire_file = r }-*/; public final native void hideEmptyPane(boolean s) /*-{ this.hide_empty_pane = s }-*/; + public final native void retainHeader(boolean r) /*-{ this.retain_header = r }-*/; + public final native void skipUncommented(boolean s) /*-{ this.skip_uncommented = s }-*/; + public final native void skipDeleted(boolean s) /*-{ this.skip_deleted = s }-*/; public final native boolean intralineDifference() /*-{ return this.intraline_difference || false }-*/; public final native boolean showLineEndings() /*-{ return this.show_line_endings || false }-*/; public final native boolean showTabs() /*-{ return this.show_tabs || false }-*/; @@ -134,6 +140,9 @@ public class DiffPreferences extends JavaScriptObject { public final native boolean manualReview() /*-{ return this.manual_review || false }-*/; public final native boolean renderEntireFile() /*-{ return this.render_entire_file || false }-*/; public final native boolean hideEmptyPane() /*-{ return this.hide_empty_pane || false }-*/; + public final native boolean retainHeader() /*-{ return this.retain_header || false }-*/; + public final native boolean skipUncommented() /*-{ return this.skip_uncommented || false }-*/; + public final native boolean skipDeleted() /*-{ return this.skip_deleted || false }-*/; private final native void setThemeRaw(String i) /*-{ this.theme = i }-*/; private final native void setIgnoreWhitespaceRaw(String i) /*-{ this.ignore_whitespace = i }-*/; diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyDiffPreferencesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyDiffPreferencesScreen.java index 73d4ca007b..a721441095 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyDiffPreferencesScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyDiffPreferencesScreen.java @@ -25,7 +25,7 @@ public class MyDiffPreferencesScreen extends SettingsScreen { super.onInitUI(); PreferencesBox pb = new PreferencesBox(null); - pb.set(DiffPreferences.create(Gerrit.getAccountDiffPreference())); + pb.set(DiffPreferences.create(Gerrit.getDiffPreferences())); FlowPanel p = new FlowPanel(); p.setStyleName(pb.getStyle().dialog()); p.add(pb); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java index 0d8e435cfd..6d795d30da 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java @@ -18,7 +18,7 @@ import com.google.gerrit.client.changes.ChangeApi; import com.google.gerrit.client.info.FileInfo; import com.google.gerrit.client.rpc.NativeMap; import com.google.gerrit.client.rpc.RestApi; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -69,7 +69,7 @@ public class DiffApi { return this; } - public DiffApi ignoreWhitespace(AccountDiffPreference.Whitespace w) { + public DiffApi ignoreWhitespace(DiffPreferencesInfo.Whitespace w) { switch (w) { default: case IGNORE_NONE: diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java index 4e1ad88a36..a50768db49 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java @@ -29,9 +29,9 @@ import com.google.gerrit.client.patches.PatchUtil; import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.rpc.Natives; import com.google.gerrit.client.ui.NpIntTextBox; +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.AccountDiffPreference; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.Patch.ChangeType; import com.google.gwt.core.client.GWT; @@ -503,12 +503,9 @@ public class PreferencesBox extends Composite { AccountApi.putDiffPreferences(prefs, new GerritCallback() { @Override public void onSuccess(DiffPreferences result) { - AccountDiffPreference p = Gerrit.getAccountDiffPreference(); - if (p == null) { - p = AccountDiffPreference.createDefault(Gerrit.getUserAccount().getId()); - } + DiffPreferencesInfo p = Gerrit.getDiffPreferences(); result.copyTo(p); - Gerrit.setAccountDiffPreference(p); + Gerrit.setDiffPreferences(p); } }); if (view != null) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java index 6ff93e4a34..7fc84f0d90 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide.java @@ -14,7 +14,8 @@ package com.google.gerrit.client.diff; -import static com.google.gerrit.reviewdb.client.AccountDiffPreference.WHOLE_FILE_CONTEXT; +import static com.google.gerrit.extensions.client.DiffPreferencesInfo.WHOLE_FILE_CONTEXT; + import static java.lang.Double.POSITIVE_INFINITY; import com.google.gerrit.client.Dispatcher; @@ -151,7 +152,7 @@ public class SideBySide extends Screen { this.startSide = startSide; this.startLine = startLine; - prefs = DiffPreferences.create(Gerrit.getAccountDiffPreference()); + prefs = DiffPreferences.create(Gerrit.getDiffPreferences()); handlers = new ArrayList<>(6); keysNavigation = new KeyCommandSet(Gerrit.C.sectionNavigation()); header = new Header(keysNavigation, base, revision, path); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipManager.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipManager.java index a344e6ba3c..5376588e71 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipManager.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SkipManager.java @@ -16,7 +16,7 @@ package com.google.gerrit.client.diff; import com.google.gerrit.client.diff.DiffInfo.Region; import com.google.gerrit.client.patches.SkippedLine; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gwt.core.client.JsArray; import net.codemirror.lib.CodeMirror; @@ -39,7 +39,7 @@ class SkipManager { } void render(int context, DiffInfo diff) { - if (context == AccountDiffPreference.WHOLE_FILE_CONTEXT) { + if (context == DiffPreferencesInfo.WHOLE_FILE_CONTEXT) { return; } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/AbstractPatchContentTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/AbstractPatchContentTable.java index 2420e7a2c4..5b9203a0b0 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/AbstractPatchContentTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/AbstractPatchContentTable.java @@ -28,11 +28,11 @@ import com.google.gerrit.common.data.AccountInfoCache; import com.google.gerrit.common.data.CommentDetail; import com.google.gerrit.common.data.PatchScript; import com.google.gerrit.common.data.PatchSetDetail; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.prettify.client.ClientSideFormatter; import com.google.gerrit.prettify.client.PrettyFormatter; import com.google.gerrit.prettify.client.SparseHtmlFile; import com.google.gerrit.prettify.common.SparseFileContent; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.PatchLineComment; import com.google.gerrit.reviewdb.client.PatchSet; @@ -286,8 +286,8 @@ abstract class AbstractPatchContentTable extends NavigationTable } protected SparseHtmlFile getSparseHtmlFileA(PatchScript s) { - AccountDiffPreference dp = new AccountDiffPreference(s.getDiffPrefs()); - dp.setShowWhitespaceErrors(false); + DiffPreferencesInfo dp = s.getDiffPrefs(); + dp.showWhitespaceErrors = false; PrettyFormatter f = ClientSideFormatter.FACTORY.get(); f.setDiffPrefs(dp); @@ -299,7 +299,7 @@ abstract class AbstractPatchContentTable extends NavigationTable } protected SparseHtmlFile getSparseHtmlFileB(PatchScript s) { - AccountDiffPreference dp = new AccountDiffPreference(s.getDiffPrefs()); + DiffPreferencesInfo dp = s.getDiffPrefs(); SparseFileContent b = s.getB(); PrettyFormatter f = ClientSideFormatter.FACTORY.get(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchScriptSettingsPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchScriptSettingsPanel.java index e71a2f30be..b7ba64b6e2 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchScriptSettingsPanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchScriptSettingsPanel.java @@ -20,8 +20,8 @@ import com.google.gerrit.client.account.Util; import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.ui.ListenableAccountDiffPreference; import com.google.gerrit.client.ui.NpIntTextBox; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; +import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.NodeList; import com.google.gwt.dom.client.OptionElement; @@ -156,7 +156,7 @@ public class PatchScriptSettingsPanel extends Composite { public void setEnableSmallFileFeatures(final boolean on) { enableSmallFileFeatures = on; if (enableSmallFileFeatures) { - syntaxHighlighting.setValue(getValue().isSyntaxHighlighting()); + syntaxHighlighting.setValue(getValue().syntaxHighlighting); } else { syntaxHighlighting.setValue(false); } @@ -181,7 +181,7 @@ public class PatchScriptSettingsPanel extends Composite { public void setEnableIntralineDifference(final boolean on) { enableIntralineDifference = on; if (enableIntralineDifference) { - intralineDifference.setValue(getValue().isIntralineDifference()); + intralineDifference.setValue(getValue().intralineDifference); } else { intralineDifference.setValue(false); } @@ -197,36 +197,36 @@ public class PatchScriptSettingsPanel extends Composite { syntaxHighlighting.setTitle(title); } - public AccountDiffPreference getValue() { + public DiffPreferencesInfo getValue() { return listenablePrefs.get(); } - public void setValue(final AccountDiffPreference dp) { + public void setValue(final DiffPreferencesInfo dp) { listenablePrefs.set(dp); display(); } protected void display() { - final AccountDiffPreference dp = getValue(); - setIgnoreWhitespace(dp.getIgnoreWhitespace()); + final DiffPreferencesInfo dp = getValue(); + setIgnoreWhitespace(dp.ignoreWhitespace); if (enableSmallFileFeatures) { - syntaxHighlighting.setValue(dp.isSyntaxHighlighting()); + syntaxHighlighting.setValue(dp.syntaxHighlighting); } else { syntaxHighlighting.setValue(false); } - setContext(dp.getContext()); + setContext(dp.context); - tabWidth.setIntValue(dp.getTabSize()); - colWidth.setIntValue(dp.getLineLength()); - intralineDifference.setValue(dp.isIntralineDifference()); - whitespaceErrors.setValue(dp.isShowWhitespaceErrors()); - showLineEndings.setValue(dp.isShowLineEndings()); - showTabs.setValue(dp.isShowTabs()); - skipDeleted.setValue(dp.isSkipDeleted()); - skipUncommented.setValue(dp.isSkipUncommented()); - expandAllComments.setValue(dp.isExpandAllComments()); - retainHeader.setValue(dp.isRetainHeader()); - manualReview.setValue(dp.isManualReview()); + tabWidth.setIntValue(dp.tabSize); + colWidth.setIntValue(dp.lineLength); + intralineDifference.setValue(dp.intralineDifference); + whitespaceErrors.setValue(dp.showWhitespaceErrors); + showLineEndings.setValue(dp.showLineEndings); + showTabs.setValue(dp.showTabs); + skipDeleted.setValue(dp.skipDeleted); + skipUncommented.setValue(dp.skipUncommented); + expandAllComments.setValue(dp.expandAllComments); + retainHeader.setValue(dp.retainHeader); + manualReview.setValue(dp.manualReview); } @UiHandler("update") @@ -244,22 +244,21 @@ public class PatchScriptSettingsPanel extends Composite { new ErrorDialog(PatchUtil.C.illegalNumberOfColumns()).center(); return; } - - AccountDiffPreference dp = new AccountDiffPreference(getValue()); - dp.setIgnoreWhitespace(getIgnoreWhitespace()); - dp.setContext(getContext()); - dp.setTabSize(tabWidth.getIntValue()); - dp.setLineLength(colWidth.getIntValue()); - dp.setSyntaxHighlighting(syntaxHighlighting.getValue()); - dp.setIntralineDifference(intralineDifference.getValue()); - dp.setShowWhitespaceErrors(whitespaceErrors.getValue()); - dp.setShowLineEndings(showLineEndings.getValue()); - dp.setShowTabs(showTabs.getValue()); - dp.setSkipDeleted(skipDeleted.getValue()); - dp.setSkipUncommented(skipUncommented.getValue()); - dp.setExpandAllComments(expandAllComments.getValue()); - dp.setRetainHeader(retainHeader.getValue()); - dp.setManualReview(manualReview.getValue()); + DiffPreferencesInfo dp = getValue(); + dp.ignoreWhitespace = getIgnoreWhitespace(); + dp.context = getContext(); + dp.tabSize = tabWidth.getIntValue(); + dp.lineLength = colWidth.getIntValue(); + dp.syntaxHighlighting = syntaxHighlighting.getValue(); + dp.intralineDifference = intralineDifference.getValue(); + dp.showWhitespaceErrors = whitespaceErrors.getValue(); + dp.showLineEndings = showLineEndings.getValue(); + dp.showTabs = showTabs.getValue(); + dp.skipDeleted = skipDeleted.getValue(); + dp.skipUncommented = skipUncommented.getValue(); + dp.expandAllComments = expandAllComments.getValue(); + dp.retainHeader = retainHeader.getValue(); + dp.manualReview = manualReview.getValue(); listenablePrefs.set(dp); } @@ -298,9 +297,9 @@ public class PatchScriptSettingsPanel extends Composite { } private void initContext(ListBox context) { - for (final short v : AccountDiffPreference.CONTEXT_CHOICES) { + for (final short v : DiffPreferencesInfo.CONTEXT_CHOICES) { final String label; - if (v == AccountDiffPreference.WHOLE_FILE_CONTEXT) { + if (v == DiffPreferencesInfo.WHOLE_FILE_CONTEXT) { label = Util.C.contextWholeFile(); } else { label = Util.M.lines(v); @@ -314,7 +313,7 @@ public class PatchScriptSettingsPanel extends Composite { if (0 <= sel) { return Whitespace.valueOf(ignoreWhitespace.getValue(sel)); } - return getValue().getIgnoreWhitespace(); + return getValue().ignoreWhitespace; } private void setIgnoreWhitespace(Whitespace s) { @@ -327,12 +326,12 @@ public class PatchScriptSettingsPanel extends Composite { ignoreWhitespace.setSelectedIndex(0); } - private short getContext() { + private int getContext() { final int sel = context.getSelectedIndex(); if (0 <= sel) { return Short.parseShort(context.getValue(sel)); } - return getValue().getContext(); + return getValue().context; } private void setContext(int ctx) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchTable.java index f3bc09203e..d84f79968a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchTable.java @@ -65,9 +65,9 @@ class PatchTable extends Composite { new PatchValidator() { @Override public boolean isValid(Patch patch) { - return !((listenablePrefs.get().isSkipDeleted() + return !((listenablePrefs.get().skipDeleted && patch.getChangeType().equals(ChangeType.DELETED)) - || (listenablePrefs.get().isSkipUncommented() + || (listenablePrefs.get().skipUncommented && patch.getCommentCount() == 0)); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java index 10c029f45f..b3617d55c4 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/UnifiedDiffTable.java @@ -294,7 +294,7 @@ public class UnifiedDiffTable extends AbstractPatchContentTable { private void appendImageDifferences(final PatchScript script, final SafeHtmlBuilder nc) { final boolean syntaxHighlighting = - script.getDiffPrefs().isSyntaxHighlighting(); + script.getDiffPrefs().syntaxHighlighting; if (script.getDisplayMethodA() == DisplayMethod.IMG) { final String url = getUrlA(); appendImageLine(nc, url, syntaxHighlighting, false); @@ -310,7 +310,7 @@ public class UnifiedDiffTable extends AbstractPatchContentTable { final SparseHtmlFile a = getSparseHtmlFileA(script); final SparseHtmlFile b = getSparseHtmlFileB(script); final boolean syntaxHighlighting = - script.getDiffPrefs().isSyntaxHighlighting(); + script.getDiffPrefs().syntaxHighlighting; for (final EditList.Hunk hunk : script.getHunks()) { appendHunkHeader(nc, hunk); while (hunk.next()) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/UnifiedPatchScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/UnifiedPatchScreen.java index bfa308aa86..e587aac1d0 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/UnifiedPatchScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/UnifiedPatchScreen.java @@ -31,9 +31,9 @@ import com.google.gerrit.client.ui.ListenableAccountDiffPreference; import com.google.gerrit.client.ui.Screen; import com.google.gerrit.common.data.PatchScript; import com.google.gerrit.common.data.PatchSetDetail; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.prettify.client.ClientSideFormatter; import com.google.gerrit.prettify.client.PrettyFactory; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gwt.core.client.Scheduler; @@ -125,10 +125,10 @@ public class UnifiedPatchScreen extends Screen implements lastScript = null; } - private void update(AccountDiffPreference dp) { + private void update(DiffPreferencesInfo dp) { // Did the user just turn on auto-review? - if (!reviewedPanels.getValue() && prefs.getOld().isManualReview() - && !dp.isManualReview()) { + if (!reviewedPanels.getValue() && prefs.getOld().manualReview + && !dp.manualReview) { reviewedPanels.setValue(true); reviewedPanels.setReviewedByCurrentUser(true); } @@ -152,25 +152,25 @@ public class UnifiedPatchScreen extends Screen implements } } - private boolean canReuse(AccountDiffPreference dp, PatchScript last) { - if (last.getDiffPrefs().getIgnoreWhitespace() != dp.getIgnoreWhitespace()) { + private boolean canReuse(DiffPreferencesInfo dp, PatchScript last) { + if (last.getDiffPrefs().ignoreWhitespace != dp.ignoreWhitespace) { // Whitespace ignore setting requires server computation. return false; } - final int ctx = dp.getContext(); - if (ctx == AccountDiffPreference.WHOLE_FILE_CONTEXT && !last.getA().isWholeFile()) { + final int ctx = dp.context; + if (ctx == DiffPreferencesInfo.WHOLE_FILE_CONTEXT + && !last.getA().isWholeFile()) { // We don't have the entire file here, so we can't render it. return false; } - if (last.getDiffPrefs().getContext() < ctx && !last.getA().isWholeFile()) { + if (last.getDiffPrefs().context < ctx && !last.getA().isWholeFile()) { // We don't have sufficient context. return false; } - if (dp.isSyntaxHighlighting() - && !last.getA().isWholeFile()) { + if (dp.syntaxHighlighting && !last.getA().isWholeFile()) { // We need the whole file to syntax highlight accurately. return false; } @@ -425,15 +425,15 @@ public class UnifiedPatchScreen extends Screen implements } if (script.isHugeFile()) { - AccountDiffPreference dp = script.getDiffPrefs(); - int context = dp.getContext(); - if (context == AccountDiffPreference.WHOLE_FILE_CONTEXT) { + DiffPreferencesInfo dp = script.getDiffPrefs(); + int context = dp.context; + if (context == DiffPreferencesInfo.WHOLE_FILE_CONTEXT) { context = Short.MAX_VALUE; } else if (context > Short.MAX_VALUE) { context = Short.MAX_VALUE; } - dp.setContext((short) Math.min(context, LARGE_FILE_CONTEXT)); - dp.setSyntaxHighlighting(false); + dp.context = Math.min(context, LARGE_FILE_CONTEXT); + dp.syntaxHighlighting = false; script.setDiffPrefs(dp); } @@ -453,7 +453,7 @@ public class UnifiedPatchScreen extends Screen implements if (Gerrit.isSignedIn()) { boolean isReviewed = false; - if (isFirst && !prefs.get().isManualReview()) { + if (isFirst && !prefs.get().manualReview) { isReviewed = true; reviewedPanels.setReviewedByCurrentUser(isReviewed); } else { @@ -476,9 +476,9 @@ public class UnifiedPatchScreen extends Screen implements super.onShowView(); if (prefsHandler == null) { prefsHandler = prefs.addValueChangeHandler( - new ValueChangeHandler() { + new ValueChangeHandler() { @Override - public void onValueChange(ValueChangeEvent event) { + public void onValueChange(ValueChangeEvent event) { update(event.getValue()); } }); @@ -491,7 +491,7 @@ public class UnifiedPatchScreen extends Screen implements new ErrorDialog(PatchUtil.C.intralineTimeout()).setText( Gerrit.C.warnTitle()).show(); } - if (topView != null && prefs.get().isRetainHeader()) { + if (topView != null && prefs.get().retainHeader) { setTopView(topView); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ListenableAccountDiffPreference.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ListenableAccountDiffPreference.java index 27bc107e4b..0c31f413b9 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ListenableAccountDiffPreference.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ListenableAccountDiffPreference.java @@ -17,11 +17,11 @@ package com.google.gerrit.client.ui; import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.account.Util; import com.google.gerrit.client.rpc.GerritCallback; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gwtjsonrpc.common.VoidResult; public class ListenableAccountDiffPreference - extends ListenableOldValue { + extends ListenableOldValue { public ListenableAccountDiffPreference() { reset(); @@ -33,7 +33,7 @@ public class ListenableAccountDiffPreference new GerritCallback() { @Override public void onSuccess(VoidResult result) { - Gerrit.setAccountDiffPreference(get()); + Gerrit.setDiffPreferences(get()); cb.onSuccess(result); } @@ -46,10 +46,10 @@ public class ListenableAccountDiffPreference } public void reset() { - if (Gerrit.isSignedIn() && Gerrit.getAccountDiffPreference() != null) { - set(Gerrit.getAccountDiffPreference()); + if (Gerrit.isSignedIn() && Gerrit.getDiffPreferences() != null) { + set(Gerrit.getDiffPreferences()); } else { - set(AccountDiffPreference.createDefault(null)); + set(DiffPreferencesInfo.defaults()); } } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java index c1a113fa2f..389dcc7687 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java @@ -24,13 +24,18 @@ import com.google.common.hash.Hashing; import com.google.common.primitives.Bytes; import com.google.gerrit.common.Version; import com.google.gerrit.common.data.HostPageData; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.extensions.registration.DynamicSet; +import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.systemstatus.MessageOfTheDay; import com.google.gerrit.extensions.webui.WebUiPlugin; import com.google.gerrit.httpd.HtmlDomUtil; import com.google.gerrit.httpd.WebSession; import com.google.gerrit.server.CurrentUser; +import com.google.gerrit.server.IdentifiedUser; +import com.google.gerrit.server.account.AccountResource; +import com.google.gerrit.server.account.GetDiffPreferences; import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.SitePaths; @@ -38,10 +43,12 @@ import com.google.gerrit.server.notedb.NotesMigration; import com.google.gwtexpui.server.CacheHeaders; import com.google.gwtjsonrpc.server.JsonServlet; import com.google.gwtjsonrpc.server.RPCServletUtils; +import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; +import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,6 +94,7 @@ public class HostPageServlet extends HttpServlet { private final StaticServlet staticServlet; private final boolean isNoteDbEnabled; private final Integer pluginsLoadTimeout; + private final GetDiffPreferences getDiff; private volatile Page page; @Inject @@ -100,7 +108,8 @@ public class HostPageServlet extends HttpServlet { DynamicSet motd, @GerritServerConfig Config cfg, StaticServlet ss, - NotesMigration migration) + NotesMigration migration, + GetDiffPreferences diffPref) throws IOException, ServletException { currentUser = cu; session = w; @@ -113,6 +122,7 @@ public class HostPageServlet extends HttpServlet { staticServlet = ss; isNoteDbEnabled = migration.enabled(); pluginsLoadTimeout = getPluginsLoadTimeout(cfg); + getDiff = diffPref; final String pageName = "HostPage.html"; template = HtmlDomUtil.parseFile(getClass(), pageName); @@ -187,7 +197,7 @@ public class HostPageServlet extends HttpServlet { w.write(";"); w.write(HPD_ID + ".accountDiffPref="); - json(user.asIdentifiedUser().getAccountDiffPreference(), w); + json(getDiffPreferences(user.asIdentifiedUser()), w); w.write(";"); w.write(HPD_ID + ".theme="); @@ -220,6 +230,16 @@ public class HostPageServlet extends HttpServlet { } } + private DiffPreferencesInfo getDiffPreferences(IdentifiedUser user) { + try { + return getDiff.apply(new AccountResource(user)); + } catch (AuthException | OrmException | ConfigInvalidException + | IOException e) { + log.warn("Cannot query account diff preferences", e); + } + return DiffPreferencesInfo.defaults(); + } + private void plugins(StringWriter w) { List urls = Lists.newArrayList(); for (WebUiPlugin u : plugins) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java index 968029c9ad..0da66bfe26 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java @@ -19,13 +19,17 @@ import com.google.gerrit.common.data.AccountService; import com.google.gerrit.common.data.AgreementInfo; import com.google.gerrit.common.errors.InvalidQueryException; import com.google.gerrit.common.errors.NoSuchEntityException; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; +import com.google.gerrit.extensions.restapi.AuthException; +import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.httpd.rpc.BaseServiceImplementation; import com.google.gerrit.reviewdb.client.Account; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; import com.google.gerrit.reviewdb.client.AccountProjectWatch; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.IdentifiedUser; +import com.google.gerrit.server.account.AccountResource; +import com.google.gerrit.server.account.SetDiffPreferences; import com.google.gerrit.server.project.NoSuchProjectException; import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.server.query.QueryParseException; @@ -37,6 +41,9 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; +import org.eclipse.jgit.errors.ConfigInvalidException; + +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -49,18 +56,21 @@ class AccountServiceImpl extends BaseServiceImplementation implements private final ProjectControl.Factory projectControlFactory; private final AgreementInfoFactory.Factory agreementInfoFactory; private final ChangeQueryBuilder queryBuilder; + private final SetDiffPreferences setDiff; @Inject AccountServiceImpl(final Provider schema, final Provider identifiedUser, final ProjectControl.Factory projectControlFactory, final AgreementInfoFactory.Factory agreementInfoFactory, - final ChangeQueryBuilder queryBuilder) { + final ChangeQueryBuilder queryBuilder, + SetDiffPreferences setDiff) { super(schema, identifiedUser); this.currentUser = identifiedUser; this.projectControlFactory = projectControlFactory; this.agreementInfoFactory = agreementInfoFactory; this.queryBuilder = queryBuilder; + this.setDiff = setDiff; } @Override @@ -74,17 +84,21 @@ class AccountServiceImpl extends BaseServiceImplementation implements } @Override - public void changeDiffPreferences(final AccountDiffPreference diffPref, + public void changeDiffPreferences(final DiffPreferencesInfo diffPref, AsyncCallback callback) { run(callback, new Action(){ @Override public VoidResult run(ReviewDb db) throws OrmException { - if (!diffPref.getAccountId().equals(getAccountId())) { - throw new IllegalArgumentException("diffPref.getAccountId() " - + diffPref.getAccountId() + " doesn't match" - + " the accountId of the signed in user " + getAccountId()); + if (!getUser().isIdentifiedUser()) { + throw new IllegalArgumentException("Not authenticated"); + } + IdentifiedUser me = getUser().asIdentifiedUser(); + try { + setDiff.apply(new AccountResource(me), diffPref); + } catch (AuthException | BadRequestException | ConfigInvalidException + | IOException e) { + throw new OrmException("Cannot save diff preferences", e); } - db.accountDiffPreferences().upsert(Collections.singleton(diffPref)); return VoidResult.INSTANCE; } }); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailServiceImpl.java index d0c042c1ca..37ca524b31 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailServiceImpl.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailServiceImpl.java @@ -16,7 +16,7 @@ package com.google.gerrit.httpd.rpc.changedetail; import com.google.gerrit.common.data.ChangeDetailService; import com.google.gerrit.common.data.PatchSetDetail; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.inject.Inject; @@ -38,7 +38,7 @@ class ChangeDetailServiceImpl implements ChangeDetailService { @Override public void patchSetDetail2(PatchSet.Id baseId, PatchSet.Id id, - AccountDiffPreference diffPrefs, AsyncCallback callback) { + DiffPreferencesInfo diffPrefs, AsyncCallback callback) { patchSetDetail.create(baseId, id, diffPrefs).to(callback); } } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PatchSetDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PatchSetDetailFactory.java index 2bf5fe431a..d2dc3840e2 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PatchSetDetailFactory.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PatchSetDetailFactory.java @@ -18,11 +18,11 @@ import com.google.common.base.Optional; import com.google.gerrit.common.Nullable; import com.google.gerrit.common.data.PatchSetDetail; import com.google.gerrit.common.errors.NoSuchEntityException; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; +import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.httpd.rpc.Handler; import com.google.gerrit.reviewdb.client.Account; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; import com.google.gerrit.reviewdb.client.AccountPatchReview; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Patch; @@ -67,7 +67,7 @@ class PatchSetDetailFactory extends Handler { PatchSetDetailFactory create( @Assisted("psIdBase") @Nullable PatchSet.Id psIdBase, @Assisted("psIdNew") PatchSet.Id psIdNew, - @Nullable AccountDiffPreference diffPrefs); + @Nullable DiffPreferencesInfo diffPrefs); } private final PatchSetInfoFactory infoFactory; @@ -81,7 +81,7 @@ class PatchSetDetailFactory extends Handler { private Project.NameKey project; private final PatchSet.Id psIdBase; private final PatchSet.Id psIdNew; - private final AccountDiffPreference diffPrefs; + private final DiffPreferencesInfo diffPrefs; private ObjectId oldId; private ObjectId newId; @@ -98,7 +98,7 @@ class PatchSetDetailFactory extends Handler { ChangeEditUtil editUtil, @Assisted("psIdBase") @Nullable final PatchSet.Id psIdBase, @Assisted("psIdNew") final PatchSet.Id psIdNew, - @Assisted @Nullable final AccountDiffPreference diffPrefs) { + @Assisted @Nullable final DiffPreferencesInfo diffPrefs) { this.infoFactory = psif; this.db = db; this.patchListCache = patchListCache; @@ -145,7 +145,7 @@ class PatchSetDetailFactory extends Handler { newId = toObjectId(psIdNew); } - list = listFor(keyFor(diffPrefs.getIgnoreWhitespace())); + list = listFor(keyFor(diffPrefs.ignoreWhitespace)); } else { // OK, means use base to compare list = patchListCache.get(control.getChange(), patchSet); } diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/patch/PatchDetailServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/patch/PatchDetailServiceImpl.java index 7ff37820bf..f9180f7ffa 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/patch/PatchDetailServiceImpl.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/patch/PatchDetailServiceImpl.java @@ -17,9 +17,9 @@ package com.google.gerrit.httpd.rpc.patch; import com.google.gerrit.common.data.PatchDetailService; import com.google.gerrit.common.data.PatchScript; import com.google.gerrit.common.errors.NoSuchEntityException; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.httpd.rpc.BaseServiceImplementation; import com.google.gerrit.httpd.rpc.Handler; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.server.ReviewDb; @@ -48,7 +48,7 @@ class PatchDetailServiceImpl extends BaseServiceImplementation implements @Override public void patchScript(final Patch.Key patchKey, final PatchSet.Id psa, - final PatchSet.Id psb, final AccountDiffPreference dp, + final PatchSet.Id psb, final DiffPreferencesInfo dp, final AsyncCallback callback) { if (psb == null) { callback.onFailure(new NoSuchEntityException()); diff --git a/gerrit-prettify/BUCK b/gerrit-prettify/BUCK index 6728ba6d42..9a0136ee3d 100644 --- a/gerrit-prettify/BUCK +++ b/gerrit-prettify/BUCK @@ -15,6 +15,7 @@ gwt_module( '//gerrit-gwtexpui:SafeHtml', ], exported_deps = [ + '//gerrit-extension-api:client', '//gerrit-patch-jgit:client', '//gerrit-reviewdb:client', '//lib:gwtjsonrpc', diff --git a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrettyFormatter.java b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrettyFormatter.java index cdf800c92a..49dc2fc909 100644 --- a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrettyFormatter.java +++ b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrettyFormatter.java @@ -14,8 +14,8 @@ package com.google.gerrit.prettify.client; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.prettify.common.SparseFileContent; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; import com.google.gwtexpui.safehtml.client.SafeHtml; import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder; @@ -73,7 +73,7 @@ public abstract class PrettyFormatter implements SparseHtmlFile { protected SparseFileContent content; protected EditFilter side; protected List edits; - protected AccountDiffPreference diffPrefs; + protected DiffPreferencesInfo diffPrefs; protected String fileName; protected Set trailingEdits; @@ -110,7 +110,7 @@ public abstract class PrettyFormatter implements SparseHtmlFile { edits = all; } - public void setDiffPrefs(AccountDiffPreference how) { + public void setDiffPrefs(DiffPreferencesInfo how) { diffPrefs = how; } @@ -132,7 +132,7 @@ public abstract class PrettyFormatter implements SparseHtmlFile { String html = toHTML(src); html = expandTabs(html); - if (diffPrefs.isSyntaxHighlighting() && getFileType() != null + if (diffPrefs.syntaxHighlighting && getFileType() != null && src.isWholeFile()) { // The prettify parsers don't like ' as an entity for the // single quote character. Replace them all out so we don't @@ -233,7 +233,7 @@ public abstract class PrettyFormatter implements SparseHtmlFile { cleanText(txt, pos, start); pos = txt.indexOf(';', start + 1) + 1; - if (diffPrefs.getLineLength() <= col) { + if (diffPrefs.lineLength <= col) { buf.append("
"); col = 0; } @@ -247,14 +247,14 @@ public abstract class PrettyFormatter implements SparseHtmlFile { private void cleanText(String txt, int pos, int end) { while (pos < end) { - int free = diffPrefs.getLineLength() - col; + int free = diffPrefs.lineLength - col; if (free <= 0) { // The current line is full. Throw an explicit line break // onto the end, and we'll continue on the next line. // buf.append("
"); col = 0; - free = diffPrefs.getLineLength(); + free = diffPrefs.lineLength; } int n = Math.min(end - pos, free); @@ -326,7 +326,7 @@ public abstract class PrettyFormatter implements SparseHtmlFile { private String toHTML(SparseFileContent src) { SafeHtml html; - if (diffPrefs.isIntralineDifference()) { + if (diffPrefs.intralineDifference) { html = colorLineEdits(src); } else { SafeHtmlBuilder b = new SafeHtmlBuilder(); @@ -342,7 +342,7 @@ public abstract class PrettyFormatter implements SparseHtmlFile { html = html.replaceAll("\r([^\n])", r); } - if (diffPrefs.isShowWhitespaceErrors()) { + if (diffPrefs.showWhitespaceErrors) { // We need to do whitespace errors before showing tabs, because // these patterns rely on \t as a literal, before it expands. // @@ -350,12 +350,12 @@ public abstract class PrettyFormatter implements SparseHtmlFile { html = showTrailingWhitespace(html); } - if (diffPrefs.isShowLineEndings()){ + if (diffPrefs.showLineEndings){ html = showLineEndings(html); } - if (diffPrefs.isShowTabs()) { - String t = 1 < diffPrefs.getTabSize() ? "\t" : ""; + if (diffPrefs.showTabs) { + String t = 1 < diffPrefs.tabSize ? "\t" : ""; html = html.replaceAll("\t", "\u00BB" + t); } @@ -528,10 +528,10 @@ public abstract class PrettyFormatter implements SparseHtmlFile { private String expandTabs(String html) { StringBuilder tmp = new StringBuilder(); int i = 0; - if (diffPrefs.isShowTabs()) { + if (diffPrefs.showTabs) { i = 1; } - for (; i < diffPrefs.getTabSize(); i++) { + for (; i < diffPrefs.tabSize; i++) { tmp.append(" "); } return html.replaceAll("\t", tmp.toString()); diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java index 3e18bc8819..295239f905 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java @@ -16,6 +16,7 @@ package com.google.gerrit.reviewdb.client; import static com.google.gerrit.reviewdb.client.RefNames.REFS_USERS; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.IntKey; @@ -51,7 +52,7 @@ import java.sql.Timestamp; * notifications of updates on that change, or just book-marking it for faster * future reference. One record per starred change. * - *
  • {@link AccountDiffPreference}: user's preferences for rendering side-to-side + *
  • {@link DiffPreferencesInfo}: user's preferences for rendering side-to-side * and unified diff
  • * * diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java index 961cc4595a..44c1f01c8f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java +++ b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValues.java @@ -17,8 +17,8 @@ package com.google.gerrit.rules; import static com.google.gerrit.rules.StoredValue.create; import com.google.common.collect.Maps; +import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; import com.google.gerrit.reviewdb.client.Account; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.PatchSetInfo; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java index df250425fe..9e5ff12d63 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java @@ -21,7 +21,6 @@ import com.google.common.collect.Sets; import com.google.gerrit.common.Nullable; import com.google.gerrit.common.data.AccountInfo; import com.google.gerrit.reviewdb.client.Account; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; import com.google.gerrit.reviewdb.client.AccountProjectWatch; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.StarredChange; @@ -110,14 +109,16 @@ public class IdentifiedUser extends CurrentUser { public IdentifiedUser create(SocketAddress remotePeer, Account.Id id) { return new IdentifiedUser(capabilityControlFactory, authConfig, realm, anonymousCowardName, canonicalUrl, accountCache, groupBackend, - disableReverseDnsLookup, Providers.of(remotePeer), null, id, null); + disableReverseDnsLookup, Providers.of(remotePeer), null, + id, null); } public CurrentUser runAs(SocketAddress remotePeer, Account.Id id, @Nullable CurrentUser caller) { return new IdentifiedUser(capabilityControlFactory, authConfig, realm, anonymousCowardName, canonicalUrl, accountCache, groupBackend, - disableReverseDnsLookup, Providers.of(remotePeer), null, id, caller); + disableReverseDnsLookup, Providers.of(remotePeer), null, + id, caller); } } @@ -151,7 +152,6 @@ public class IdentifiedUser extends CurrentUser { final AccountCache accountCache, final GroupBackend groupBackend, @DisableReverseDnsLookup final Boolean disableReverseDnsLookup, - @RemotePeer final Provider remotePeerProvider, final Provider dbProvider) { this.capabilityControlFactory = capabilityControlFactory; @@ -162,7 +162,6 @@ public class IdentifiedUser extends CurrentUser { this.accountCache = accountCache; this.groupBackend = groupBackend; this.disableReverseDnsLookup = disableReverseDnsLookup; - this.remotePeerProvider = remotePeerProvider; this.dbProvider = dbProvider; } @@ -170,13 +169,15 @@ public class IdentifiedUser extends CurrentUser { public IdentifiedUser create(Account.Id id) { return new IdentifiedUser(capabilityControlFactory, authConfig, realm, anonymousCowardName, canonicalUrl, accountCache, groupBackend, - disableReverseDnsLookup, remotePeerProvider, dbProvider, id, null); + disableReverseDnsLookup, remotePeerProvider, dbProvider, + id, null); } public IdentifiedUser runAs(Account.Id id, CurrentUser caller) { return new IdentifiedUser(capabilityControlFactory, authConfig, realm, anonymousCowardName, canonicalUrl, accountCache, groupBackend, - disableReverseDnsLookup, remotePeerProvider, dbProvider, id, caller); + disableReverseDnsLookup, remotePeerProvider, dbProvider, + id, caller); } } @@ -274,20 +275,6 @@ public class IdentifiedUser extends CurrentUser { return state().getAccount(); } - public AccountDiffPreference getAccountDiffPreference() { - AccountDiffPreference diffPref; - try { - diffPref = dbProvider.get().accountDiffPreferences().get(getAccountId()); - if (diffPref == null) { - diffPref = AccountDiffPreference.createDefault(getAccountId()); - } - } catch (OrmException e) { - log.warn("Cannot query account diff preferences", e); - diffPref = AccountDiffPreference.createDefault(getAccountId()); - } - return diffPref; - } - public boolean hasEmailAddress(String email) { if (validEmails.contains(email)) { return true; 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 19aeefcc93..d2d6bf285f 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 @@ -14,91 +14,140 @@ package com.google.gerrit.server.account; -import com.google.gerrit.extensions.client.Theme; +import static com.google.gerrit.server.config.ConfigUtil.loadSection; + +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountDiffPreference; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.CurrentUser; +import com.google.gerrit.server.config.AllUsersName; +import com.google.gerrit.server.config.GerritServerConfig; +import com.google.gerrit.server.git.GitRepositoryManager; +import com.google.gerrit.server.git.UserConfigSections; +import com.google.gerrit.server.patch.PatchListKey; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.Repository; + +import java.io.IOException; + @Singleton public class GetDiffPreferences implements RestReadView { private final Provider self; private final Provider db; + private final Provider allUsersName; + private final GitRepositoryManager gitMgr; + private final boolean readFromGit; @Inject - GetDiffPreferences(Provider self, Provider db) { + GetDiffPreferences(Provider self, + Provider db, + @GerritServerConfig Config cfg, + Provider allUsersName, + GitRepositoryManager gitMgr) { this.self = self; this.db = db; + this.allUsersName = allUsersName; + this.gitMgr = gitMgr; + readFromGit = cfg.getBoolean("user", null, "readPrefsFromGit", false); } @Override public DiffPreferencesInfo apply(AccountResource rsrc) - throws AuthException, OrmException { + throws AuthException, OrmException, ConfigInvalidException, IOException { if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("restricted to administrator"); } Account.Id userId = rsrc.getUser().getAccountId(); - AccountDiffPreference a = db.get().accountDiffPreferences().get(userId); - if (a == null) { - a = new AccountDiffPreference(userId); - } - return DiffPreferencesInfo.parse(a); + return readFromGit + ? readFromGit(userId, gitMgr, allUsersName.get(), null) + : readFromDb(userId); } - public static class DiffPreferencesInfo { - static DiffPreferencesInfo parse(AccountDiffPreference p) { - DiffPreferencesInfo info = new DiffPreferencesInfo(); - info.context = p.getContext(); - info.expandAllComments = p.isExpandAllComments() ? true : null; - info.ignoreWhitespace = p.getIgnoreWhitespace(); - info.intralineDifference = p.isIntralineDifference() ? true : null; - info.lineLength = p.getLineLength(); - info.manualReview = p.isManualReview() ? true : null; - info.retainHeader = p.isRetainHeader() ? true : null; - info.showLineEndings = p.isShowLineEndings() ? true : null; - info.showTabs = p.isShowTabs() ? true : null; - info.showWhitespaceErrors = p.isShowWhitespaceErrors() ? true : null; - info.skipDeleted = p.isSkipDeleted() ? true : null; - info.skipUncommented = p.isSkipUncommented() ? true : null; - info.hideTopMenu = p.isHideTopMenu() ? true : null; - info.autoHideDiffTableHeader = p.isAutoHideDiffTableHeader() ? true : null; - info.hideLineNumbers = p.isHideLineNumbers() ? true : null; - info.syntaxHighlighting = p.isSyntaxHighlighting() ? true : null; - info.tabSize = p.getTabSize(); - info.renderEntireFile = p.isRenderEntireFile() ? true : null; - info.hideEmptyPane = p.isHideEmptyPane() ? true : null; - info.theme = p.getTheme(); - return info; + static DiffPreferencesInfo readFromGit(Account.Id id, + GitRepositoryManager gitMgr, AllUsersName allUsersName, + DiffPreferencesInfo in) + throws IOException, ConfigInvalidException, RepositoryNotFoundException { + try (Repository git = gitMgr.openRepository(allUsersName)) { + VersionedAccountPreferences p = + VersionedAccountPreferences.forUser(id); + p.load(git); + DiffPreferencesInfo prefs = new DiffPreferencesInfo(); + loadSection(p.getConfig(), UserConfigSections.DIFF, null, prefs, + DiffPreferencesInfo.defaults(), in); + return prefs; + } + } + + private DiffPreferencesInfo readFromDb(Account.Id id) + throws OrmException { + AccountDiffPreference a = db.get().accountDiffPreferences().get(id); + return nullify(initFromDb(a)); + } + + static DiffPreferencesInfo initFromDb(AccountDiffPreference a) { + DiffPreferencesInfo prefs = DiffPreferencesInfo.defaults(); + if (a != null) { + prefs.context = (int)a.getContext(); + prefs.expandAllComments = a.isExpandAllComments(); + prefs.hideLineNumbers = a.isHideLineNumbers(); + prefs.hideTopMenu = a.isHideTopMenu(); + prefs.ignoreWhitespace = PatchListKey.WHITESPACE_TYPES.inverse().get( + a.getIgnoreWhitespace().getCode()); + prefs.intralineDifference = a.isIntralineDifference(); + prefs.lineLength = a.getLineLength(); + prefs.manualReview = a.isManualReview(); + prefs.renderEntireFile = a.isRenderEntireFile(); + prefs.retainHeader = a.isRetainHeader(); + prefs.showLineEndings = a.isShowLineEndings(); + prefs.showTabs = a.isShowTabs(); + prefs.showWhitespaceErrors = a.isShowWhitespaceErrors(); + prefs.skipDeleted = a.isSkipDeleted(); + prefs.skipUncommented = a.isSkipUncommented(); + prefs.syntaxHighlighting = a.isSyntaxHighlighting(); + prefs.tabSize = a.getTabSize(); + prefs.theme = a.getTheme(); + prefs.hideEmptyPane = a.isHideEmptyPane(); + prefs.autoHideDiffTableHeader = a.isAutoHideDiffTableHeader(); } - public short context; - public Boolean expandAllComments; - public Whitespace ignoreWhitespace; - public Boolean intralineDifference; - public int lineLength; - public Boolean manualReview; - public Boolean retainHeader; - public Boolean showLineEndings; - public Boolean showTabs; - public Boolean showWhitespaceErrors; - public Boolean skipDeleted; - public Boolean skipUncommented; - public Boolean syntaxHighlighting; - public Boolean hideTopMenu; - public Boolean autoHideDiffTableHeader; - public Boolean hideLineNumbers; - public Boolean renderEntireFile; - public Boolean hideEmptyPane; - public int tabSize; - public Theme theme; + return prefs; + } + + private static DiffPreferencesInfo nullify(DiffPreferencesInfo prefs) { + prefs.expandAllComments = b(prefs.expandAllComments); + prefs.hideLineNumbers = b(prefs.hideLineNumbers); + prefs.hideTopMenu = b(prefs.hideTopMenu); + prefs.intralineDifference = b(prefs.intralineDifference); + prefs.manualReview = b(prefs.manualReview); + prefs.renderEntireFile = b(prefs.renderEntireFile); + prefs.retainHeader = b(prefs.retainHeader); + prefs.showLineEndings = b(prefs.showLineEndings); + prefs.showTabs = b(prefs.showTabs); + prefs.showWhitespaceErrors = b(prefs.showWhitespaceErrors); + prefs.skipDeleted = b(prefs.skipDeleted); + prefs.skipUncommented = b(prefs.skipUncommented); + prefs.syntaxHighlighting = b(prefs.syntaxHighlighting); + prefs.hideEmptyPane = b(prefs.hideEmptyPane); + prefs.autoHideDiffTableHeader = b(prefs.autoHideDiffTableHeader); + return prefs; + } + + private static Boolean b(Boolean b) { + if (b == null) { + return null; + } + return b ? Boolean.TRUE : null; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetDiffPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetDiffPreferences.java index 4e08756e79..7b4d133e22 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetDiffPreferences.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetDiffPreferences.java @@ -14,144 +14,224 @@ package com.google.gerrit.server.account; -import com.google.gerrit.extensions.client.Theme; +import static com.google.gerrit.server.account.GetDiffPreferences.initFromDb; +import static com.google.gerrit.server.account.GetDiffPreferences.readFromGit; +import static com.google.gerrit.server.config.ConfigUtil.loadSection; +import static com.google.gerrit.server.config.ConfigUtil.storeSection; + +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.extensions.restapi.AuthException; +import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountDiffPreference; import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.CurrentUser; -import com.google.gerrit.server.account.GetDiffPreferences.DiffPreferencesInfo; -import com.google.gerrit.server.account.SetDiffPreferences.Input; +import com.google.gerrit.server.config.AllUsersName; +import com.google.gerrit.server.config.GerritServerConfig; +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.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; +import org.eclipse.jgit.lib.Config; + +import java.io.IOException; import java.util.Collections; @Singleton -public class SetDiffPreferences implements RestModifyView { - static class Input { - Short context; - Boolean expandAllComments; - Whitespace ignoreWhitespace; - Boolean intralineDifference; - Integer lineLength; - Boolean manualReview; - Boolean retainHeader; - Boolean showLineEndings; - Boolean showTabs; - Boolean showWhitespaceErrors; - Boolean skipDeleted; - Boolean skipUncommented; - Boolean syntaxHighlighting; - Boolean hideTopMenu; - Boolean autoHideDiffTableHeader; - Boolean hideLineNumbers; - Boolean renderEntireFile; - Integer tabSize; - Theme theme; - Boolean hideEmptyPane; - } - +public class SetDiffPreferences implements + RestModifyView { private final Provider self; private final Provider db; + private final Provider metaDataUpdateFactory; + private final AllUsersName allUsersName; + private final GitRepositoryManager gitMgr; + private final boolean readFromGit; @Inject - SetDiffPreferences(Provider self, Provider db) { + SetDiffPreferences(Provider self, + Provider db, + @GerritServerConfig Config cfg, + Provider metaDataUpdateFactory, + AllUsersName allUsersName, + GitRepositoryManager gitMgr) { this.self = self; this.db = db; + this.metaDataUpdateFactory = metaDataUpdateFactory; + this.allUsersName = allUsersName; + this.gitMgr = gitMgr; + readFromGit = cfg.getBoolean("user", null, "readPrefsFromGit", false); } @Override - public DiffPreferencesInfo apply(AccountResource rsrc, Input input) - throws AuthException, OrmException { + public DiffPreferencesInfo apply(AccountResource rsrc, DiffPreferencesInfo in) + throws AuthException, BadRequestException, ConfigInvalidException, + RepositoryNotFoundException, IOException, OrmException { if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canModifyAccount()) { throw new AuthException("restricted to members of Modify Accounts"); } - if (input == null) { - input = new Input(); + + if (in == null) { + throw new BadRequestException("input must be provided"); } - Account.Id accountId = rsrc.getUser().getAccountId(); - AccountDiffPreference p; + Account.Id userId = rsrc.getUser().getAccountId(); + DiffPreferencesInfo n = readFromGit + ? readFromGit(userId, gitMgr, allUsersName, in) + : merge(initFromDb(db.get().accountDiffPreferences().get(userId)), in); + DiffPreferencesInfo out = writeToGit(n, userId); + writeToDb(n, userId); + return out; + } - db.get().accounts().beginTransaction(accountId); + private void writeToDb(DiffPreferencesInfo in, Account.Id id) + throws OrmException { + db.get().accounts().beginTransaction(id); try { - p = db.get().accountDiffPreferences().get(accountId); - if (p == null) { - p = new AccountDiffPreference(accountId); - } - - if (input.context != null) { - p.setContext(input.context); - } - if (input.ignoreWhitespace != null) { - p.setIgnoreWhitespace(input.ignoreWhitespace); - } - if (input.expandAllComments != null) { - p.setExpandAllComments(input.expandAllComments); - } - if (input.intralineDifference != null) { - p.setIntralineDifference(input.intralineDifference); - } - if (input.lineLength != null) { - p.setLineLength(input.lineLength); - } - if (input.manualReview != null) { - p.setManualReview(input.manualReview); - } - if (input.retainHeader != null) { - p.setRetainHeader(input.retainHeader); - } - if (input.showLineEndings != null) { - p.setShowLineEndings(input.showLineEndings); - } - if (input.showTabs != null) { - p.setShowTabs(input.showTabs); - } - if (input.showWhitespaceErrors != null) { - p.setShowWhitespaceErrors(input.showWhitespaceErrors); - } - if (input.skipDeleted != null) { - p.setSkipDeleted(input.skipDeleted); - } - if (input.skipUncommented != null) { - p.setSkipUncommented(input.skipUncommented); - } - if (input.syntaxHighlighting != null) { - p.setSyntaxHighlighting(input.syntaxHighlighting); - } - if (input.hideTopMenu != null) { - p.setHideTopMenu(input.hideTopMenu); - } - if (input.autoHideDiffTableHeader != null) { - p.setAutoHideDiffTableHeader(input.autoHideDiffTableHeader); - } - if (input.hideLineNumbers != null) { - p.setHideLineNumbers(input.hideLineNumbers); - } - if (input.renderEntireFile != null) { - p.setRenderEntireFile(input.renderEntireFile); - } - if (input.tabSize != null) { - p.setTabSize(input.tabSize); - } - if (input.theme != null) { - p.setTheme(input.theme); - } - if (input.hideEmptyPane != null) { - p.setHideEmptyPane(input.hideEmptyPane); - } - + AccountDiffPreference p = db.get().accountDiffPreferences().get(id); + p = initAccountDiffPreferences(p, in, id); db.get().accountDiffPreferences().upsert(Collections.singleton(p)); db.get().commit(); } finally { db.get().rollback(); } - return DiffPreferencesInfo.parse(p); + } + + private DiffPreferencesInfo writeToGit(DiffPreferencesInfo in, + Account.Id useId) throws RepositoryNotFoundException, IOException, + ConfigInvalidException { + MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName); + + VersionedAccountPreferences prefs; + DiffPreferencesInfo out = new DiffPreferencesInfo(); + try { + prefs = VersionedAccountPreferences.forUser(useId); + prefs.load(md); + storeSection(prefs.getConfig(), UserConfigSections.DIFF, null, in, + DiffPreferencesInfo.defaults()); + prefs.commit(md); + loadSection(prefs.getConfig(), UserConfigSections.DIFF, null, out, + DiffPreferencesInfo.defaults(), null); + } finally { + md.close(); + } + return out; + } + + // TODO(davido): Remove manual merging in follow-up change + private DiffPreferencesInfo merge(DiffPreferencesInfo n, + DiffPreferencesInfo i) { + if (i.context != null) { + n.context = i.context; + } + if (i.expandAllComments != null) { + n.expandAllComments = i.expandAllComments; + } + if (i.hideLineNumbers != null) { + n.hideLineNumbers = i.hideLineNumbers; + } + if (i.hideTopMenu != null) { + n.hideTopMenu = i.hideTopMenu; + } + if (i.ignoreWhitespace != null) { + n.ignoreWhitespace = i.ignoreWhitespace; + } + if (i.intralineDifference != null) { + n.intralineDifference = i.intralineDifference; + } + if (i.lineLength != null) { + n.lineLength = i.lineLength; + } + if (i.manualReview != null) { + n.manualReview = i.manualReview; + } + if (i.renderEntireFile != null) { + n.renderEntireFile = i.renderEntireFile; + } + if (i.retainHeader != null) { + n.retainHeader = i.retainHeader; + } + if (i.showLineEndings != null) { + n.showLineEndings = i.showLineEndings; + } + if (i.showTabs != null) { + n.showTabs = i.showTabs; + } + if (i.showWhitespaceErrors != null) { + n.showWhitespaceErrors = i.showWhitespaceErrors; + } + if (i.skipDeleted != null) { + n.skipDeleted = i.skipDeleted; + } + if (i.skipUncommented != null) { + n.skipUncommented = i.skipUncommented; + } + if (i.syntaxHighlighting != null) { + n.syntaxHighlighting = i.syntaxHighlighting; + } + if (i.tabSize != null) { + n.tabSize = i.tabSize; + } + if (i.theme != null) { + n.theme = i.theme; + } + if (i.hideEmptyPane != null) { + n.hideEmptyPane = i.hideEmptyPane; + } + if (i.autoHideDiffTableHeader != null) { + n.autoHideDiffTableHeader = i.autoHideDiffTableHeader; + } + return n; + } + + private static AccountDiffPreference initAccountDiffPreferences( + AccountDiffPreference a, DiffPreferencesInfo i, Account.Id id) { + if (a == null) { + a = AccountDiffPreference.createDefault(id); + } + int context = i.context == null + ? DiffPreferencesInfo.DEFAULT_CONTEXT + : i.context; + a.setContext((short)context); + a.setExpandAllComments(b(i.expandAllComments)); + a.setHideLineNumbers(b(i.hideLineNumbers)); + a.setHideTopMenu(b(i.hideTopMenu)); + a.setIgnoreWhitespace(i.ignoreWhitespace == null + ? Whitespace.IGNORE_NONE + : Whitespace.forCode( + PatchListKey.WHITESPACE_TYPES.get(i.ignoreWhitespace))); + a.setIntralineDifference(b(i.intralineDifference)); + a.setLineLength(i.lineLength == null + ? DiffPreferencesInfo.DEFAULT_LINE_LENGTH + : i.lineLength); + a.setManualReview(b(i.manualReview)); + a.setRenderEntireFile(b(i.renderEntireFile)); + a.setRetainHeader(b(i.retainHeader)); + a.setShowLineEndings(b(i.showLineEndings)); + a.setShowTabs(b(i.showTabs)); + a.setShowWhitespaceErrors(b(i.showWhitespaceErrors)); + a.setSkipDeleted(b(i.skipDeleted)); + a.setSkipUncommented(b(i.skipUncommented)); + a.setSyntaxHighlighting(b(i.syntaxHighlighting)); + a.setTabSize(i.tabSize == null + ? DiffPreferencesInfo.DEFAULT_TAB_SIZE + : i.tabSize); + a.setTheme(i.theme); + a.setHideEmptyPane(b(i.hideEmptyPane)); + a.setAutoHideDiffTableHeader(b(i.autoHideDiffTableHeader)); + return a; + } + + private static boolean b(Boolean b) { + return b == null ? false : b; } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/FileInfoJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/FileInfoJson.java index 84f8a042e3..71974c4901 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/FileInfoJson.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/FileInfoJson.java @@ -16,8 +16,8 @@ package com.google.gerrit.server.change; import com.google.common.collect.Maps; import com.google.gerrit.common.Nullable; +import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; import com.google.gerrit.extensions.common.FileInfo; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.PatchSet; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java index bcc8cce613..3dcc44214d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java @@ -24,6 +24,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.gerrit.common.data.PatchScript; import com.google.gerrit.common.data.PatchScript.DisplayMethod; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.extensions.common.ChangeType; import com.google.gerrit.extensions.common.DiffInfo; import com.google.gerrit.extensions.common.DiffInfo.ContentEntry; @@ -39,8 +40,6 @@ import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.prettify.common.SparseFileContent; -import com.google.gerrit.reviewdb.client.Account; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.Project; @@ -52,7 +51,6 @@ import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectState; import com.google.gwtorm.server.OrmException; -import com.google.inject.Inject; import org.eclipse.jgit.diff.Edit; import org.eclipse.jgit.diff.ReplaceEdit; @@ -69,6 +67,8 @@ import java.io.IOException; import java.util.List; import java.util.concurrent.TimeUnit; +import javax.inject.Inject; + public class GetDiff implements RestReadView { private static final ImmutableMap CHANGE_TYPE = Maps.immutableEnumMap( @@ -93,7 +93,7 @@ public class GetDiff implements RestReadView { IgnoreWhitespace ignoreWhitespace = IgnoreWhitespace.NONE; @Option(name = "--context", handler = ContextOptionHandler.class) - short context = AccountDiffPreference.DEFAULT_CONTEXT; + int context = DiffPreferencesInfo.DEFAULT_CONTEXT; @Option(name = "--intraline") boolean intraline; @@ -122,10 +122,10 @@ public class GetDiff implements RestReadView { resource.getRevision().getChangeResource(), IdString.fromDecoded(base)); basePatchSet = baseResource.getPatchSet(); } - AccountDiffPreference prefs = new AccountDiffPreference(new Account.Id(0)); - prefs.setIgnoreWhitespace(ignoreWhitespace.whitespace); - prefs.setContext(context); - prefs.setIntralineDifference(intraline); + DiffPreferencesInfo prefs = new DiffPreferencesInfo(); + prefs.ignoreWhitespace = ignoreWhitespace.whitespace; + prefs.context = context; + prefs.intralineDifference = intraline; try { PatchScriptFactory psf = patchScriptFactoryFactory.create( @@ -135,7 +135,7 @@ public class GetDiff implements RestReadView { resource.getPatchKey().getParentKey(), prefs); psf.setLoadHistory(false); - psf.setLoadComments(context != AccountDiffPreference.WHOLE_FILE_CONTEXT); + psf.setLoadComments(context != DiffPreferencesInfo.WHOLE_FILE_CONTEXT); PatchScript ps = psf.call(); Content content = new Content(ps); for (Edit edit : ps.getEdits()) { @@ -369,14 +369,14 @@ public class GetDiff implements RestReadView { } enum IgnoreWhitespace { - NONE(AccountDiffPreference.Whitespace.IGNORE_NONE), - TRAILING(AccountDiffPreference.Whitespace.IGNORE_TRAILING), - CHANGED(AccountDiffPreference.Whitespace.IGNORE_LEADING_AND_TRAILING), - ALL(AccountDiffPreference.Whitespace.IGNORE_ALL); + NONE(DiffPreferencesInfo.Whitespace.IGNORE_NONE), + TRAILING(DiffPreferencesInfo.Whitespace.IGNORE_TRAILING), + CHANGED(DiffPreferencesInfo.Whitespace.IGNORE_LEADING_AND_TRAILING), + ALL(DiffPreferencesInfo.Whitespace.IGNORE_ALL); - private final AccountDiffPreference.Whitespace whitespace; + private final DiffPreferencesInfo.Whitespace whitespace; - private IgnoreWhitespace(AccountDiffPreference.Whitespace whitespace) { + private IgnoreWhitespace(DiffPreferencesInfo.Whitespace whitespace) { this.whitespace = whitespace; } } @@ -393,7 +393,7 @@ public class GetDiff implements RestReadView { final String value = params.getParameter(0); short context; if ("all".equalsIgnoreCase(value)) { - context = AccountDiffPreference.WHOLE_FILE_CONTEXT; + context = DiffPreferencesInfo.WHOLE_FILE_CONTEXT; } else { try { context = Short.parseShort(value, 10); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/UserConfigSections.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/UserConfigSections.java index 29b5373016..a1c5b8ab93 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/UserConfigSections.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/UserConfigSections.java @@ -22,6 +22,9 @@ public class UserConfigSections { /** The edit user preferences. */ public static final String EDIT = "edit"; + /** The diff user preferences. */ + public static final String DIFF = "diff"; + private UserConfigSections() { } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCacheImpl.java index 2c4f30cac3..da1e7b525e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCacheImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListCacheImpl.java @@ -16,7 +16,7 @@ package com.google.gerrit.server.patch; import com.google.common.cache.Cache; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; +import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.Project; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java index 6f957dafea..15277b25f3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java @@ -14,15 +14,16 @@ package com.google.gerrit.server.patch; -import static com.google.gerrit.server.ioutil.BasicSerialization.readEnum; -import static com.google.gerrit.server.ioutil.BasicSerialization.writeEnum; +import static com.google.common.base.Preconditions.checkState; import static org.eclipse.jgit.lib.ObjectIdSerialization.readCanBeNull; import static org.eclipse.jgit.lib.ObjectIdSerialization.readNotNull; import static org.eclipse.jgit.lib.ObjectIdSerialization.writeCanBeNull; import static org.eclipse.jgit.lib.ObjectIdSerialization.writeNotNull; +import com.google.common.collect.BiMap; +import com.google.common.collect.ImmutableBiMap; import com.google.gerrit.common.Nullable; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; +import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.ObjectId; @@ -35,6 +36,16 @@ import java.io.Serializable; public class PatchListKey implements Serializable { static final long serialVersionUID = 18L; + public static final BiMap WHITESPACE_TYPES = ImmutableBiMap.of( + Whitespace.IGNORE_NONE, 'N', + Whitespace.IGNORE_TRAILING, 'E', + Whitespace.IGNORE_LEADING_AND_TRAILING, 'S', + Whitespace.IGNORE_ALL, 'A'); + + static { + checkState(WHITESPACE_TYPES.size() == Whitespace.values().length); + } + private transient ObjectId oldId; private transient ObjectId newId; private transient Whitespace whitespace; @@ -108,12 +119,20 @@ public class PatchListKey implements Serializable { private void writeObject(final ObjectOutputStream out) throws IOException { writeCanBeNull(out, oldId); writeNotNull(out, newId); - writeEnum(out, whitespace); + Character c = WHITESPACE_TYPES.get(whitespace); + if (c == null) { + throw new IOException("Invalid whitespace type: " + whitespace); + } + out.writeChar(c); } private void readObject(final ObjectInputStream in) throws IOException { oldId = readCanBeNull(in); newId = readNotNull(in); - whitespace = readEnum(in, Whitespace.values()); + char t = in.readChar(); + whitespace = WHITESPACE_TYPES.inverse().get(t); + if (whitespace == null) { + throw new IOException("Invalid whitespace type code: " + t); + } } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java index 903bcc24f7..aa2a8a8429 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java @@ -21,7 +21,7 @@ import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; import com.google.common.base.Function; import com.google.common.base.Throwables; import com.google.common.collect.FluentIterable; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; +import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.RefNames; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java index ff4496f57c..d0c3d09795 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java @@ -17,10 +17,10 @@ package com.google.gerrit.server.patch; import com.google.gerrit.common.data.CommentDetail; import com.google.gerrit.common.data.PatchScript; import com.google.gerrit.common.data.PatchScript.DisplayMethod; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; +import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; import com.google.gerrit.prettify.common.EditList; import com.google.gerrit.prettify.common.SparseFileContent; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.PatchLineComment; @@ -65,7 +65,7 @@ class PatchScriptBuilder { private Project.NameKey projectKey; private ObjectReader reader; private Change change; - private AccountDiffPreference diffPrefs; + private DiffPreferencesInfo diffPrefs; private boolean againstParent; private ObjectId aId; private ObjectId bId; @@ -95,11 +95,11 @@ class PatchScriptBuilder { this.change = c; } - void setDiffPrefs(final AccountDiffPreference dp) { + void setDiffPrefs(final DiffPreferencesInfo dp) { diffPrefs = dp; - context = diffPrefs.getContext(); - if (context == AccountDiffPreference.WHOLE_FILE_CONTEXT) { + context = diffPrefs.context; + if (context == DiffPreferencesInfo.WHOLE_FILE_CONTEXT) { context = MAX_CONTEXT; } else if (context > MAX_CONTEXT) { context = MAX_CONTEXT; @@ -140,12 +140,12 @@ class PatchScriptBuilder { if (!isModify(content)) { intralineDifferenceIsPossible = false; - } else if (diffPrefs.isIntralineDifference()) { + } else if (diffPrefs.intralineDifference) { IntraLineDiff d = patchListCache.getIntraLineDiff( new IntraLineDiffKey( a.id, b.id, - diffPrefs.getIgnoreWhitespace() != Whitespace.IGNORE_NONE), + diffPrefs.ignoreWhitespace != Whitespace.IGNORE_NONE), IntraLineDiffArgs.create( a.src, b.src, edits, projectKey, bId, b.path)); if (d != null) { @@ -208,7 +208,7 @@ class PatchScriptBuilder { // context = MAX_CONTEXT; - packContent(diffPrefs.getIgnoreWhitespace() != Whitespace.IGNORE_NONE); + packContent(diffPrefs.ignoreWhitespace != Whitespace.IGNORE_NONE); } return new PatchScript(change.getKey(), content.getChangeType(), diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java index 2169671827..5836df5a7a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java @@ -18,10 +18,10 @@ import com.google.common.base.Optional; import com.google.gerrit.common.Nullable; import com.google.gerrit.common.data.CommentDetail; import com.google.gerrit.common.data.PatchScript; +import com.google.gerrit.extensions.client.DiffPreferencesInfo; +import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.reviewdb.client.Account; -import com.google.gerrit.reviewdb.client.AccountDiffPreference; -import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.Patch.ChangeType; @@ -66,7 +66,7 @@ public class PatchScriptFactory implements Callable { String fileName, @Assisted("patchSetA") PatchSet.Id patchSetA, @Assisted("patchSetB") PatchSet.Id patchSetB, - AccountDiffPreference diffPrefs); + DiffPreferencesInfo diffPrefs); } private static final Logger log = @@ -83,7 +83,7 @@ public class PatchScriptFactory implements Callable { @Nullable private final PatchSet.Id psa; private final PatchSet.Id psb; - private final AccountDiffPreference diffPrefs; + private final DiffPreferencesInfo diffPrefs; private final ChangeEditUtil editReader; private Optional edit; @@ -110,7 +110,7 @@ public class PatchScriptFactory implements Callable { @Assisted final String fileName, @Assisted("patchSetA") @Nullable final PatchSet.Id patchSetA, @Assisted("patchSetB") final PatchSet.Id patchSetB, - @Assisted final AccountDiffPreference diffPrefs) { + @Assisted DiffPreferencesInfo diffPrefs) { this.repoManager = grm; this.builderFactory = builderFactory; this.patchListCache = patchListCache; @@ -156,7 +156,7 @@ public class PatchScriptFactory implements Callable { try (Repository git = repoManager.openRepository(project)) { try { - final PatchList list = listFor(keyFor(diffPrefs.getIgnoreWhitespace())); + final PatchList list = listFor(keyFor(diffPrefs.ignoreWhitespace)); final PatchScriptBuilder b = newBuilder(list, git); final PatchListEntry content = list.get(fileName); @@ -192,11 +192,10 @@ public class PatchScriptFactory implements Callable { } private PatchScriptBuilder newBuilder(final PatchList list, Repository git) { - final AccountDiffPreference dp = new AccountDiffPreference(diffPrefs); final PatchScriptBuilder b = builderFactory.get(); b.setRepository(git, project); b.setChange(change); - b.setDiffPrefs(dp); + b.setDiffPrefs(diffPrefs); b.setTrees(list.isAgainstParent(), list.getOldId(), list.getNewId()); return b; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java index 8da9e2a861..148d1df2c0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaUpdater.java @@ -19,6 +19,7 @@ import com.google.gerrit.reviewdb.client.SystemConfig; 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.config.AllUsersName; import com.google.gerrit.server.config.AnonymousCowardName; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.git.GitRepositoryManager; @@ -76,6 +77,7 @@ public class SchemaUpdater { for (Class c : new Class[] { AllProjectsName.class, AllUsersCreator.class, + AllUsersName.class, GitRepositoryManager.class, SitePaths.class, }) {