Store and load edit preferences to/from All-Users repository
This change only handles edit screen user preferences, as discussed in this thread [1]. [1] https://groups.google.com/d/topic/repo-discuss/bX36w565m7c/discussion Change-Id: Icf87fcb6a9c8901d8f5d96a8ae81c78e24441e34
This commit is contained in:
@@ -1314,6 +1314,74 @@ link:#diff-preferences-info[DiffPreferencesInfo] entity.
|
||||
}
|
||||
----
|
||||
|
||||
[[get-edit-preferences]]
|
||||
=== Get Edit Preferences
|
||||
--
|
||||
'GET /accounts/link:#account-id[\{account-id\}]/preferences.edit'
|
||||
--
|
||||
|
||||
Retrieves the edit preferences of a user.
|
||||
|
||||
.Request
|
||||
----
|
||||
GET /a/accounts/self/preferences.edit HTTP/1.0
|
||||
----
|
||||
|
||||
As result the edit preferences of the user are returned as a
|
||||
link:#edit-preferences-info[EditPreferencesInfo] entity.
|
||||
|
||||
.Response
|
||||
----
|
||||
HTTP/1.1 200 OK
|
||||
Content-Disposition: attachment
|
||||
Content-Type: application/json;charset=UTF-8
|
||||
|
||||
)]}'
|
||||
{
|
||||
"theme": "ECLIPSE",
|
||||
"tab_size": 4,
|
||||
"line_length": 80,
|
||||
"hide_top_menu": true,
|
||||
"show_whitespace_errors": true,
|
||||
"hide_line_numbers": true
|
||||
}
|
||||
----
|
||||
|
||||
[[set-edit-preferences]]
|
||||
=== Set Edit Preferences
|
||||
--
|
||||
'PUT /accounts/link:#account-id[\{account-id\}]/preferences.edit'
|
||||
--
|
||||
|
||||
Sets the edit preferences of a user.
|
||||
|
||||
The new edit preferences must be provided in the request body as a
|
||||
link:#edit-preferences-info[EditPreferencesInfo] entity.
|
||||
|
||||
.Request
|
||||
----
|
||||
PUT /a/accounts/self/preferences.edit HTTP/1.0
|
||||
Content-Type: application/json;charset=UTF-8
|
||||
|
||||
{
|
||||
"theme": "ECLIPSE",
|
||||
"tab_size": 4,
|
||||
"line_length": 80,
|
||||
"hide_top_menu": true,
|
||||
"show_tabs": true,
|
||||
"show_whitespace_errors": true,
|
||||
"syntax_highlighting": true,
|
||||
"hide_line_numbers": true
|
||||
}
|
||||
----
|
||||
|
||||
The response is "`204 No Content`"
|
||||
|
||||
.Response
|
||||
----
|
||||
HTTP/1.1 204 No Content
|
||||
----
|
||||
|
||||
[[get-starred-changes]]
|
||||
=== Get Starred Changes
|
||||
--
|
||||
@@ -1611,7 +1679,7 @@ Whether uncommented files should be skipped on file switch.
|
||||
|`syntax_highlighting` |not set if `false`|
|
||||
Whether syntax highlighting should be enabled.
|
||||
|`hide_top_menu` |not set if `false`|
|
||||
If true the top menu header and site header is hidden.
|
||||
If true the top menu header and site header are hidden.
|
||||
|`auto_hide_diff_table_header` |not set if `false`|
|
||||
If true the diff table header is automatically hidden when
|
||||
scrolling down more than half of a page.
|
||||
@@ -1677,6 +1745,34 @@ True if the line numbers should be hidden.
|
||||
Number of spaces that should be used to display one tab.
|
||||
|===========================================
|
||||
|
||||
[[edit-preferences-info]]
|
||||
=== EditPreferencesInfo
|
||||
The `EditPreferencesInfo` entity contains information about the edit
|
||||
preferences of a user.
|
||||
|
||||
[options="header",cols="1,^1,5"]
|
||||
|===========================================
|
||||
|Field Name ||Description
|
||||
|`theme` ||
|
||||
The CodeMirror theme. Currently only a subset of light and dark
|
||||
CodeMirror themes are supported. Light themes `DEFAULT`, `ECLIPSE`,
|
||||
`ELEGANT`, `NEAT`. Dark themes `MIDNIGHT`, `NIGHT`, `TWILIGHT`.
|
||||
|`tab_size` ||
|
||||
Number of spaces that should be used to display one tab.
|
||||
|`line_length` ||
|
||||
Number of characters that should be displayed per line.
|
||||
|`hide_top_menu` |not set if `false`|
|
||||
If true the top menu header and site header is hidden.
|
||||
|`show_tabs` |not set if `false`|
|
||||
Whether tabs should be shown.
|
||||
|`show_whitespace_errors` |not set if `false`|
|
||||
Whether whitespace errors should be shown.
|
||||
|`syntax_highlighting` |not set if `false`|
|
||||
Whether syntax highlighting should be enabled.
|
||||
|`hide_line_numbers` |not set if `false`|
|
||||
Whether line numbers should be hidden.
|
||||
|===========================================
|
||||
|
||||
[[email-info]]
|
||||
=== EmailInfo
|
||||
The `EmailInfo` entity contains information about an email address of a
|
||||
|
||||
@@ -159,6 +159,9 @@ The inline editor uses settings decided from the user's diff preferences, but th
|
||||
preferences are only modifiable from the side-by-side diff screen. It should be possible
|
||||
to open the preferences also from within the editor.
|
||||
|
||||
* Support default configuration options for inline editor that an
|
||||
administrator has set in `refs/users/default:preferences.config` file.
|
||||
|
||||
* Allow to rename files that are already contained in the change (from the file table).
|
||||
The same rename file dialog can be used with preselected and disabled original file
|
||||
name.
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
// 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.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.extensions.client.EditPreferencesInfo;
|
||||
import com.google.gerrit.extensions.client.Theme;
|
||||
|
||||
import org.apache.http.HttpStatus;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class EditPreferencesIT extends AbstractDaemonTest {
|
||||
@Test
|
||||
public void getSetEditPreferences() throws Exception {
|
||||
String endPoint = "/accounts/" + admin.email + "/preferences.edit";
|
||||
RestResponse r = adminSession.get(endPoint);
|
||||
assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
|
||||
EditPreferencesInfo out = getEditPrefInfo(r);
|
||||
|
||||
assertThat(out.lineLength).isEqualTo(100);
|
||||
assertThat(out.tabSize).isEqualTo(8);
|
||||
assertThat(out.hideTopMenu).isNull();
|
||||
assertThat(out.showTabs).isTrue();
|
||||
assertThat(out.showWhitespaceErrors).isNull();
|
||||
assertThat(out.syntaxHighlighting).isTrue();
|
||||
assertThat(out.hideLineNumbers).isNull();
|
||||
assertThat(out.theme).isEqualTo(Theme.DEFAULT);
|
||||
|
||||
// change some default values
|
||||
out.lineLength = 80;
|
||||
out.tabSize = 4;
|
||||
out.hideTopMenu = true;
|
||||
out.showTabs = false;
|
||||
out.showWhitespaceErrors = true;
|
||||
out.syntaxHighlighting = false;
|
||||
out.hideLineNumbers = true;
|
||||
out.theme = Theme.TWILIGHT;
|
||||
|
||||
r = adminSession.put(endPoint, out);
|
||||
assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_NO_CONTENT);
|
||||
|
||||
r = adminSession.get(endPoint);
|
||||
assertThat(r.getStatusCode()).isEqualTo(HttpStatus.SC_OK);
|
||||
EditPreferencesInfo info = getEditPrefInfo(r);
|
||||
assertEditPreferences(info, out);
|
||||
}
|
||||
|
||||
private EditPreferencesInfo getEditPrefInfo(RestResponse r)
|
||||
throws IOException {
|
||||
return newGson().fromJson(r.getReader(),
|
||||
EditPreferencesInfo.class);
|
||||
}
|
||||
|
||||
private void assertEditPreferences(EditPreferencesInfo out,
|
||||
EditPreferencesInfo in) {
|
||||
assertThat(out.lineLength).isEqualTo(in.lineLength);
|
||||
assertThat(out.tabSize).isEqualTo(in.tabSize);
|
||||
assertThat(out.hideTopMenu).isEqualTo(in.hideTopMenu);
|
||||
assertThat(out.showTabs).isNull();
|
||||
assertThat(out.showWhitespaceErrors).isEqualTo(in.showWhitespaceErrors);
|
||||
assertThat(out.syntaxHighlighting).isNull();
|
||||
assertThat(out.hideLineNumbers).isEqualTo(in.hideLineNumbers);
|
||||
assertThat(out.theme).isEqualTo(in.theme);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
// 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;
|
||||
|
||||
/* This class is stored in Git config file. */
|
||||
public class EditPreferencesInfo {
|
||||
public Integer tabSize;
|
||||
public Integer lineLength;
|
||||
public Boolean hideTopMenu;
|
||||
public Boolean showTabs;
|
||||
public Boolean showWhitespaceErrors;
|
||||
public Boolean syntaxHighlighting;
|
||||
public Boolean hideLineNumbers;
|
||||
public Theme theme;
|
||||
|
||||
public static EditPreferencesInfo defaults() {
|
||||
EditPreferencesInfo i = new EditPreferencesInfo();
|
||||
i.tabSize = 8;
|
||||
i.lineLength = 100;
|
||||
i.hideTopMenu = false;
|
||||
i.showTabs = true;
|
||||
i.showWhitespaceErrors = false;
|
||||
i.syntaxHighlighting = true;
|
||||
i.hideLineNumbers = false;
|
||||
i.theme = Theme.DEFAULT;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
// 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.server.account;
|
||||
|
||||
import static com.google.gerrit.server.config.ConfigUtil.loadSection;
|
||||
|
||||
import com.google.gerrit.extensions.client.EditPreferencesInfo;
|
||||
import com.google.gerrit.extensions.restapi.AuthException;
|
||||
import com.google.gerrit.extensions.restapi.RestReadView;
|
||||
import com.google.gerrit.server.CurrentUser;
|
||||
import com.google.gerrit.server.config.AllUsersName;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
import com.google.gerrit.server.git.UserConfigSections;
|
||||
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.Repository;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@Singleton
|
||||
public class GetEditPreferences implements RestReadView<AccountResource> {
|
||||
private final Provider<CurrentUser> self;
|
||||
private final AllUsersName allUsersName;
|
||||
private final GitRepositoryManager gitMgr;
|
||||
|
||||
@Inject
|
||||
GetEditPreferences(Provider<CurrentUser> self,
|
||||
AllUsersName allUsersName,
|
||||
GitRepositoryManager gitMgr) {
|
||||
this.self = self;
|
||||
this.allUsersName = allUsersName;
|
||||
this.gitMgr = gitMgr;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EditPreferencesInfo apply(AccountResource rsrc) throws AuthException,
|
||||
IOException, ConfigInvalidException {
|
||||
if (self.get() != rsrc.getUser()
|
||||
&& !self.get().getCapabilities().canModifyAccount()) {
|
||||
throw new AuthException("restricted to members of Modify Accounts");
|
||||
}
|
||||
|
||||
try (Repository git = gitMgr.openRepository(allUsersName)) {
|
||||
VersionedAccountPreferences p =
|
||||
VersionedAccountPreferences.forUser(rsrc.getUser().getAccountId());
|
||||
p.load(git);
|
||||
|
||||
return loadSection(p.getConfig(), UserConfigSections.EDIT, null,
|
||||
new EditPreferencesInfo(), EditPreferencesInfo.defaults());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -30,6 +30,7 @@ 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.git.GitRepositoryManager;
|
||||
import com.google.gerrit.server.git.UserConfigSections;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Provider;
|
||||
@@ -51,7 +52,6 @@ import java.util.Map;
|
||||
public class GetPreferences implements RestReadView<AccountResource> {
|
||||
private static final Logger log = LoggerFactory.getLogger(GetPreferences.class);
|
||||
|
||||
public static final String MY = "my";
|
||||
public static final String KEY_URL = "url";
|
||||
public static final String KEY_TARGET = "target";
|
||||
public static final String KEY_ID = "id";
|
||||
@@ -165,7 +165,7 @@ public class GetPreferences implements RestReadView<AccountResource> {
|
||||
private List<TopMenu.MenuItem> my(VersionedAccountPreferences v) {
|
||||
List<TopMenu.MenuItem> my = new ArrayList<>();
|
||||
Config cfg = v.getConfig();
|
||||
for (String subsection : cfg.getSubsections(MY)) {
|
||||
for (String subsection : cfg.getSubsections(UserConfigSections.MY)) {
|
||||
String url = my(cfg, subsection, KEY_URL, "#/");
|
||||
String target = my(cfg, subsection, KEY_TARGET,
|
||||
url.startsWith("#") ? null : "_blank");
|
||||
@@ -178,7 +178,7 @@ public class GetPreferences implements RestReadView<AccountResource> {
|
||||
|
||||
private static String my(Config cfg, String subsection, String key,
|
||||
String defaultValue) {
|
||||
String val = cfg.getString(MY, subsection, key);
|
||||
String val = cfg.getString(UserConfigSections.MY, subsection, key);
|
||||
return !Strings.isNullOrEmpty(val) ? val : defaultValue;
|
||||
}
|
||||
|
||||
|
||||
@@ -70,6 +70,8 @@ public class Module extends RestApiModule {
|
||||
put(ACCOUNT_KIND, "preferences").to(SetPreferences.class);
|
||||
get(ACCOUNT_KIND, "preferences.diff").to(GetDiffPreferences.class);
|
||||
put(ACCOUNT_KIND, "preferences.diff").to(SetDiffPreferences.class);
|
||||
get(ACCOUNT_KIND, "preferences.edit").to(GetEditPreferences.class);
|
||||
put(ACCOUNT_KIND, "preferences.edit").to(SetEditPreferences.class);
|
||||
get(CAPABILITY_KIND).to(GetCapabilities.CheckOne.class);
|
||||
|
||||
child(ACCOUNT_KIND, "starred.changes").to(StarredChanges.class);
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
// 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.server.account;
|
||||
|
||||
import static com.google.gerrit.server.config.ConfigUtil.storeSection;
|
||||
|
||||
import com.google.gerrit.extensions.client.EditPreferencesInfo;
|
||||
import com.google.gerrit.extensions.restapi.AuthException;
|
||||
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||
import com.google.gerrit.extensions.restapi.Response;
|
||||
import com.google.gerrit.extensions.restapi.RestModifyView;
|
||||
import com.google.gerrit.reviewdb.client.Account;
|
||||
import com.google.gerrit.server.CurrentUser;
|
||||
import com.google.gerrit.server.config.AllUsersName;
|
||||
import com.google.gerrit.server.git.MetaDataUpdate;
|
||||
import com.google.gerrit.server.git.UserConfigSections;
|
||||
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 java.io.IOException;
|
||||
|
||||
@Singleton
|
||||
public class SetEditPreferences implements
|
||||
RestModifyView<AccountResource, EditPreferencesInfo> {
|
||||
|
||||
private final Provider<CurrentUser> self;
|
||||
private final Provider<MetaDataUpdate.User> metaDataUpdateFactory;
|
||||
private final AllUsersName allUsersName;
|
||||
|
||||
@Inject
|
||||
SetEditPreferences(Provider<CurrentUser> self,
|
||||
Provider<MetaDataUpdate.User> metaDataUpdateFactory,
|
||||
AllUsersName allUsersName) {
|
||||
this.self = self;
|
||||
this.metaDataUpdateFactory = metaDataUpdateFactory;
|
||||
this.allUsersName = allUsersName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Response<?> apply(AccountResource rsrc, EditPreferencesInfo in)
|
||||
throws AuthException, BadRequestException, RepositoryNotFoundException,
|
||||
IOException, ConfigInvalidException {
|
||||
if (self.get() != rsrc.getUser()
|
||||
&& !self.get().getCapabilities().canModifyAccount()) {
|
||||
throw new AuthException("restricted to members of Modify Accounts");
|
||||
}
|
||||
|
||||
if (in == null) {
|
||||
throw new BadRequestException("input must be provided");
|
||||
}
|
||||
|
||||
Account.Id accountId = rsrc.getUser().getAccountId();
|
||||
MetaDataUpdate md = metaDataUpdateFactory.get().create(allUsersName);
|
||||
|
||||
VersionedAccountPreferences prefs;
|
||||
try {
|
||||
prefs = VersionedAccountPreferences.forUser(accountId);
|
||||
prefs.load(md);
|
||||
storeSection(prefs.getConfig(), UserConfigSections.EDIT, null, in,
|
||||
EditPreferencesInfo.defaults());
|
||||
prefs.commit(md);
|
||||
} finally {
|
||||
md.close();
|
||||
}
|
||||
|
||||
return Response.none();
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,6 @@ import static com.google.gerrit.server.account.GetPreferences.KEY_MATCH;
|
||||
import static com.google.gerrit.server.account.GetPreferences.KEY_TARGET;
|
||||
import static com.google.gerrit.server.account.GetPreferences.KEY_TOKEN;
|
||||
import static com.google.gerrit.server.account.GetPreferences.KEY_URL;
|
||||
import static com.google.gerrit.server.account.GetPreferences.MY;
|
||||
import static com.google.gerrit.server.account.GetPreferences.URL_ALIAS;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
@@ -42,6 +41,7 @@ import com.google.gerrit.server.CurrentUser;
|
||||
import com.google.gerrit.server.account.SetPreferences.Input;
|
||||
import com.google.gerrit.server.config.AllUsersName;
|
||||
import com.google.gerrit.server.git.MetaDataUpdate;
|
||||
import com.google.gerrit.server.git.UserConfigSections;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Provider;
|
||||
@@ -192,7 +192,7 @@ public class SetPreferences implements RestModifyView<AccountResource, Input> {
|
||||
List<TopMenu.MenuItem> my) {
|
||||
Config cfg = prefs.getConfig();
|
||||
if (my != null) {
|
||||
unsetSection(cfg, MY);
|
||||
unsetSection(cfg, UserConfigSections.MY);
|
||||
for (TopMenu.MenuItem item : my) {
|
||||
set(cfg, item.name, KEY_URL, item.url);
|
||||
set(cfg, item.name, KEY_TARGET, item.target);
|
||||
@@ -203,9 +203,9 @@ public class SetPreferences implements RestModifyView<AccountResource, Input> {
|
||||
|
||||
private static void set(Config cfg, String section, String key, String val) {
|
||||
if (Strings.isNullOrEmpty(val)) {
|
||||
cfg.unset(MY, section, key);
|
||||
cfg.unset(UserConfigSections.MY, section, key);
|
||||
} else {
|
||||
cfg.setString(MY, section, key, val);
|
||||
cfg.setString(UserConfigSections.MY, section, key, val);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
// Copyright (C) 2015 The Android Open Source Project
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package com.google.gerrit.server.git;
|
||||
|
||||
public class UserConfigSections {
|
||||
|
||||
/** The my menu user preferences. */
|
||||
public static final String MY = "my";
|
||||
|
||||
/** The edit user preferences. */
|
||||
public static final String EDIT = "edit";
|
||||
|
||||
private UserConfigSections() {
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user