Merge "Adds the Soy library and injects it via EmailArguments"
diff --git a/Documentation/gen_licenses.py b/Documentation/gen_licenses.py
index bc2d657..15f470c 100755
--- a/Documentation/gen_licenses.py
+++ b/Documentation/gen_licenses.py
@@ -95,16 +95,14 @@
if args.asciidoc:
print("""\
-Gerrit Code Review - Licenses
-=============================
+= Gerrit Code Review - Licenses
Gerrit open source software is licensed under the <<Apache2_0,Apache
License 2.0>>. Executable distributions also include other software
components that are provided under additional licenses.
[[cryptography]]
-Cryptography Notice
--------------------
+== Cryptography Notice
This distribution includes cryptographic software. The country
in which you currently reside may have restrictions on the import,
@@ -139,8 +137,7 @@
link:http://www.bouncycastle.org/java.html[Bouncy Castle Crypto API]
to be installed by the end-user.
-Licenses
---------
+== Licenses
""")
for n in used:
@@ -149,13 +146,13 @@
if args.asciidoc:
print()
print('[[%s]]' % name.replace('.', '_'))
- print(name)
- print('~' * len(name))
+ print("=== " + name)
print()
else:
print()
print(name)
- print('--')
+ print()
+ print('----')
for d in libs:
if d.startswith('//lib:') or d.startswith('//lib/'):
p = d[len('//lib:'):]
@@ -166,12 +163,12 @@
print('* ' + p)
if args.asciidoc:
print()
- print('[[license]]')
- print('[verse]')
- print('--')
+ print('[[%s_license]]' % name.replace('.', '_'))
+ print('----')
with open(n[2:].replace(':', '/')) as fd:
copyfileobj(fd, stdout)
- print('--')
+ print()
+ print('----')
if args.asciidoc:
print("""
diff --git a/Documentation/rest-api-config.txt b/Documentation/rest-api-config.txt
index a378462..5d08613 100644
--- a/Documentation/rest-api-config.txt
+++ b/Documentation/rest-api-config.txt
@@ -54,6 +54,14 @@
{
"auth": {
"auth_type": "LDAP",
+ "use_contributor_agreements": true,
+ "contributor_agreements": [
+ {
+ "name": "Individual",
+ "description": "If you are going to be contributing code on your own, this is the one you want. You can sign this one online.",
+ "url": "static/cla_individual.html"
+ }
+ ],
"editable_account_fields": [
"FULL_NAME",
"REGISTER_NEW_EMAIL"
@@ -1226,6 +1234,9 @@
|`use_contributor_agreements` |not set if `false`|
Whether link:config-gerrit.html#auth.contributorAgreements[contributor
agreements] are required.
+|`contributor_agreements` |not set if `use_contributor_agreements` is `false`|
+List of contributor agreements as link:rest-api-accounts.html#contributor-agreement-info[
+ContributorAgreementInfo] entities.
|`editable_account_fields` ||
List of account fields that are editable. Possible values are
`FULL_NAME`, `USER_NAME` and `REGISTER_NEW_EMAIL`.
diff --git a/WORKSPACE b/WORKSPACE
index d465b37..4911f44 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -82,27 +82,27 @@
sha1 = 'b6bd7f9d78f6fdaa3c37dae18a4bd298915f328e',
)
-JGIT_VERS = '4.4.1.201607150455-r.105-g81ba2be'
+JGIT_VERS = '4.4.1.201607150455-r.118-g1096652'
maven_jar(
name = 'jgit',
repository = 'http://gerrit-maven.storage.googleapis.com/',
artifact = 'org.eclipse.jgit:org.eclipse.jgit:' + JGIT_VERS,
- sha1 = 'c07c9c66da7983095a40945c0bfab211a473c4c5',
+ sha1 = 'cd142b9030910babd119702f1c4eeae13ee90018',
)
maven_jar(
name = 'jgit_servlet',
repository = 'http://gerrit-maven.storage.googleapis.com/',
artifact = 'org.eclipse.jgit:org.eclipse.jgit.http.server:' + JGIT_VERS,
- sha1 = 'bb01841b74a48abe506c2e44f238e107188e6c8f',
+ sha1 = 'fa67bf925001cfc663bf98772f37d5c5c1abd756',
)
# TODO(davido): Remove this hack when maven_jar supports pulling sources
# https://github.com/bazelbuild/bazel/issues/308
http_file(
name = 'jgit_src',
- sha256 = '881906cb1e6743cb78df6dd3788cab7e974308fbb98cab4915e6591a62aa9374',
+ sha256 = '1a0b2d637359b1b51eba4d094491ef39877a6fc192e2fc1da0422a9adf04f0b8',
url = 'http://gerrit-maven.storage.googleapis.com/org/eclipse/jgit/org.eclipse.jgit/' +
'%s/org.eclipse.jgit-%s-sources.jar' % (JGIT_VERS, JGIT_VERS),
)
@@ -117,14 +117,14 @@
name = 'jgit_archive',
repository = 'http://gerrit-maven.storage.googleapis.com/',
artifact = 'org.eclipse.jgit:org.eclipse.jgit.archive:' + JGIT_VERS,
- sha1 = 'fc3bc40e070c54198a046fcd3a1f7cac47163961',
+ sha1 = '3f45cd199e40a7c68ee07a1743c06d1c3d07308a',
)
maven_jar(
name = 'jgit_junit',
repository = 'http://gerrit-maven.storage.googleapis.com/',
artifact = 'org.eclipse.jgit:org.eclipse.jgit.junit:' + JGIT_VERS,
- sha1 = 'b4565ee84a6e1d0952010282b9fcf705ac6171a7',
+ sha1 = 'dc7edb9c3060655c7fb93ab9b9349e815bab266f',
)
maven_jar(
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java
index f676c0f39..e6049d5 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AgreementsIT.java
@@ -24,6 +24,7 @@
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.extensions.api.groups.GroupApi;
import com.google.gerrit.extensions.common.AgreementInfo;
+import com.google.gerrit.extensions.common.ServerInfo;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
@@ -76,6 +77,25 @@
}
@Test
+ public void getAvailableAgreements() throws Exception {
+ ServerInfo info = gApi.config().server().getInfo();
+ if (isContributorAgreementsEnabled()) {
+ assertThat(info.auth.useContributorAgreements).isTrue();
+ assertThat(info.auth.contributorAgreements).hasSize(2);
+ AgreementInfo agreementInfo = info.auth.contributorAgreements.get(0);
+ assertThat(agreementInfo.name).isEqualTo(ca.getName());
+ assertThat(agreementInfo.autoVerifyGroup.name)
+ .isEqualTo(ca.getAutoVerify().getName());
+ agreementInfo = info.auth.contributorAgreements.get(1);
+ assertThat(agreementInfo.name).isEqualTo(ca2.getName());
+ assertThat(agreementInfo.autoVerifyGroup).isNull();
+ } else {
+ assertThat(info.auth.useContributorAgreements).isNull();
+ assertThat(info.auth.contributorAgreements).isNull();
+ }
+ }
+
+ @Test
public void signNonExistingAgreement() throws Exception {
assume().that(isContributorAgreementsEnabled()).isTrue();
exception.expect(UnprocessableEntityException.class);
@@ -107,6 +127,8 @@
assertThat(info.name).isEqualTo(ca.getName());
assertThat(info.description).isEqualTo(ca.getDescription());
assertThat(info.url).isEqualTo(ca.getAgreementUrl());
+ assertThat(info.autoVerifyGroup.name)
+ .isEqualTo(ca.getAutoVerify().getName());
// Signing the same agreement again has no effect
gApi.accounts().self().signAgreement(ca.getName());
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
index 7bad261..db9bb09 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
@@ -905,7 +905,7 @@
.id(changeId)
.reviewer(user.getId().toString())
.remove();
- assertThat(gApi.changes().id(changeId).get().reviewers.isEmpty());
+ assertThat(gApi.changes().id(changeId).get().reviewers).isEmpty();
assertThat(sender.getMessages()).hasSize(1);
Message message = sender.getMessages().get(0);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java
index 54fa74c..2269c77 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/config/ServerInfoIT.java
@@ -21,12 +21,12 @@
import com.google.gerrit.acceptance.GerritConfig;
import com.google.gerrit.acceptance.GerritConfigs;
import com.google.gerrit.acceptance.RestResponse;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AuthType;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.client.AuthType;
+import com.google.gerrit.extensions.common.ServerInfo;
import com.google.gerrit.server.config.AllProjectsNameProvider;
import com.google.gerrit.server.config.AllUsersNameProvider;
import com.google.gerrit.server.config.AnonymousCowardNameProvider;
-import com.google.gerrit.server.config.GetServerInfo.ServerInfo;
import org.junit.Test;
@@ -79,7 +79,7 @@
// auth
assertThat(i.auth.authType).isEqualTo(AuthType.HTTP);
assertThat(i.auth.editableAccountFields).containsExactly(
- Account.FieldName.REGISTER_NEW_EMAIL, Account.FieldName.FULL_NAME);
+ AccountFieldName.REGISTER_NEW_EMAIL, AccountFieldName.FULL_NAME);
assertThat(i.auth.useContributorAgreements).isTrue();
assertThat(i.auth.loginUrl).isEqualTo("https://example.com/login");
assertThat(i.auth.loginText).isEqualTo("LOGIN");
@@ -147,8 +147,8 @@
// auth
assertThat(i.auth.authType).isEqualTo(AuthType.OPENID);
assertThat(i.auth.editableAccountFields).containsExactly(
- Account.FieldName.REGISTER_NEW_EMAIL, Account.FieldName.FULL_NAME,
- Account.FieldName.USER_NAME);
+ AccountFieldName.REGISTER_NEW_EMAIL, AccountFieldName.FULL_NAME,
+ AccountFieldName.USER_NAME);
assertThat(i.auth.useContributorAgreements).isNull();
assertThat(i.auth.loginUrl).isNull();
assertThat(i.auth.loginText).isNull();
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SystemInfoService.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/SystemInfoService.java
index 272801f..fb54ef1 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/SystemInfoService.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/SystemInfoService.java
@@ -14,7 +14,6 @@
package com.google.gerrit.common.data;
-import com.google.gerrit.common.auth.SignInRequired;
import com.google.gwtjsonrpc.common.AllowCrossSiteRequest;
import com.google.gwtjsonrpc.common.AsyncCallback;
import com.google.gwtjsonrpc.common.RemoteJsonService;
@@ -29,8 +28,5 @@
@AllowCrossSiteRequest
void daemonHostKeys(AsyncCallback<List<SshHostKey>> callback);
- @SignInRequired
- void contributorAgreements(AsyncCallback<List<ContributorAgreement>> callback);
-
void clientError(String message, AsyncCallback<VoidResult> callback);
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Server.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Server.java
index a43c29f..1e5c95e 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Server.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/config/Server.java
@@ -16,6 +16,7 @@
import com.google.gerrit.extensions.client.DiffPreferencesInfo;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.common.ServerInfo;
import com.google.gerrit.extensions.restapi.NotImplementedException;
import com.google.gerrit.extensions.restapi.RestApiException;
@@ -25,6 +26,8 @@
*/
String getVersion() throws RestApiException;
+ ServerInfo getInfo() throws RestApiException;
+
GeneralPreferencesInfo getDefaultPreferences() throws RestApiException;
GeneralPreferencesInfo setDefaultPreferences(GeneralPreferencesInfo in)
throws RestApiException;
@@ -43,6 +46,11 @@
}
@Override
+ public ServerInfo getInfo() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
public GeneralPreferencesInfo getDefaultPreferences()
throws RestApiException {
throw new NotImplementedException();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AccountFieldName.java
similarity index 60%
copy from gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AccountFieldName.java
index f038818..07d9f37 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AccountFieldName.java
@@ -12,15 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.account;
+package com.google.gerrit.extensions.client;
-import com.google.gwt.core.client.JavaScriptObject;
-
-public class AgreementInfo extends JavaScriptObject {
- public final native String name() /*-{ return this.name; }-*/;
- public final native String description() /*-{ return this.description; }-*/;
- public final native String url() /*-{ return this.url; }-*/;
-
- protected AgreementInfo() {
- }
-}
+public enum AccountFieldName {
+ FULL_NAME, USER_NAME, REGISTER_NEW_EMAIL
+}
\ No newline at end of file
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AuthType.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AuthType.java
similarity index 98%
rename from gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AuthType.java
rename to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AuthType.java
index 38a78ba..004ef1c 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AuthType.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AuthType.java
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.reviewdb.client;
+package com.google.gerrit.extensions.client;
public enum AuthType {
/** Login relies upon the OpenID standard: {@link "http://openid.net/"} */
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInfo.java
index 6ec5b1d..4242fcd 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AgreementInfo.java
@@ -18,4 +18,5 @@
public String name;
public String description;
public String url;
+ public GroupInfo autoVerifyGroup;
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AuthInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AuthInfo.java
new file mode 100644
index 0000000..1000e9c
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/AuthInfo.java
@@ -0,0 +1,35 @@
+// Copyright (C) 2016 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.common;
+
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.client.AuthType;
+
+import java.util.List;
+
+public class AuthInfo {
+ public AuthType authType;
+ public Boolean useContributorAgreements;
+ public List<AgreementInfo> contributorAgreements;
+ public List<AccountFieldName> editableAccountFields;
+ public String loginUrl;
+ public String loginText;
+ public String switchAccountUrl;
+ public String registerUrl;
+ public String registerText;
+ public String editFullNameUrl;
+ public String httpPasswordUrl;
+ public Boolean isGitBasicAuth;
+}
\ No newline at end of file
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java
similarity index 60%
copy from gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java
index f038818..206b2f0 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java
@@ -12,15 +12,14 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.account;
+package com.google.gerrit.extensions.common;
-import com.google.gwt.core.client.JavaScriptObject;
-
-public class AgreementInfo extends JavaScriptObject {
- public final native String name() /*-{ return this.name; }-*/;
- public final native String description() /*-{ return this.description; }-*/;
- public final native String url() /*-{ return this.url; }-*/;
-
- protected AgreementInfo() {
- }
-}
+public class ChangeConfigInfo {
+ public Boolean allowBlame;
+ public Boolean allowDrafts;
+ public int largeChange;
+ public String replyLabel;
+ public String replyTooltip;
+ public int updateDelay;
+ public Boolean submitWholeTopic;
+}
\ No newline at end of file
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadInfo.java
similarity index 60%
copy from gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadInfo.java
index f038818..180e2d2 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadInfo.java
@@ -12,15 +12,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.account;
+package com.google.gerrit.extensions.common;
-import com.google.gwt.core.client.JavaScriptObject;
+import java.util.List;
+import java.util.Map;
-public class AgreementInfo extends JavaScriptObject {
- public final native String name() /*-{ return this.name; }-*/;
- public final native String description() /*-{ return this.description; }-*/;
- public final native String url() /*-{ return this.url; }-*/;
-
- protected AgreementInfo() {
- }
-}
+public class DownloadInfo {
+ public Map<String, DownloadSchemeInfo> schemes;
+ public List<String> archives;
+}
\ No newline at end of file
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java
similarity index 60%
copy from gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java
index f038818..0e8ad65 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java
@@ -12,15 +12,14 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.account;
+package com.google.gerrit.extensions.common;
-import com.google.gwt.core.client.JavaScriptObject;
+import java.util.Map;
-public class AgreementInfo extends JavaScriptObject {
- public final native String name() /*-{ return this.name; }-*/;
- public final native String description() /*-{ return this.description; }-*/;
- public final native String url() /*-{ return this.url; }-*/;
-
- protected AgreementInfo() {
- }
-}
+public class DownloadSchemeInfo {
+ public String url;
+ public Boolean isAuthRequired;
+ public Boolean isAuthSupported;
+ public Map<String, String> commands;
+ public Map<String, String> cloneCommands;
+}
\ No newline at end of file
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java
similarity index 60%
copy from gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java
index f038818..72c474f 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java
@@ -12,15 +12,14 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.account;
+package com.google.gerrit.extensions.common;
-import com.google.gwt.core.client.JavaScriptObject;
-
-public class AgreementInfo extends JavaScriptObject {
- public final native String name() /*-{ return this.name; }-*/;
- public final native String description() /*-{ return this.description; }-*/;
- public final native String url() /*-{ return this.url; }-*/;
-
- protected AgreementInfo() {
- }
-}
+public class GerritInfo {
+ public String allProjects;
+ public String allUsers;
+ public Boolean docSearch;
+ public String docUrl;
+ public Boolean editGpgKeys;
+ public String reportBugUrl;
+ public String reportBugText;
+}
\ No newline at end of file
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginConfigInfo.java
similarity index 60%
copy from gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginConfigInfo.java
index f038818..845f7cb 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginConfigInfo.java
@@ -12,15 +12,11 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.account;
+package com.google.gerrit.extensions.common;
-import com.google.gwt.core.client.JavaScriptObject;
+import java.util.List;
-public class AgreementInfo extends JavaScriptObject {
- public final native String name() /*-{ return this.name; }-*/;
- public final native String description() /*-{ return this.description; }-*/;
- public final native String url() /*-{ return this.url; }-*/;
-
- protected AgreementInfo() {
- }
-}
+public class PluginConfigInfo {
+ public Boolean hasAvatars;
+ public List<String> jsResourcePaths;
+}
\ No newline at end of file
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReceiveInfo.java
similarity index 60%
copy from gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReceiveInfo.java
index f038818..e66c242 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReceiveInfo.java
@@ -12,15 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.account;
+package com.google.gerrit.extensions.common;
-import com.google.gwt.core.client.JavaScriptObject;
-
-public class AgreementInfo extends JavaScriptObject {
- public final native String name() /*-{ return this.name; }-*/;
- public final native String description() /*-{ return this.description; }-*/;
- public final native String url() /*-{ return this.url; }-*/;
-
- protected AgreementInfo() {
- }
-}
+public class ReceiveInfo {
+ public Boolean enableSignedPush;
+}
\ No newline at end of file
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ServerInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ServerInfo.java
new file mode 100644
index 0000000..3dd8368
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ServerInfo.java
@@ -0,0 +1,31 @@
+// Copyright (C) 2016 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.common;
+
+import java.util.Map;
+
+public class ServerInfo {
+ public AuthInfo auth;
+ public ChangeConfigInfo change;
+ public DownloadInfo download;
+ public GerritInfo gerrit;
+ public Boolean noteDbEnabled;
+ public PluginConfigInfo plugin;
+ public SshdInfo sshd;
+ public SuggestInfo suggest;
+ public Map<String, String> urlAliases;
+ public UserConfigInfo user;
+ public ReceiveInfo receive;
+}
\ No newline at end of file
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshdInfo.java
similarity index 60%
copy from gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshdInfo.java
index f038818..98d650c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshdInfo.java
@@ -12,15 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.account;
+package com.google.gerrit.extensions.common;
-import com.google.gwt.core.client.JavaScriptObject;
-
-public class AgreementInfo extends JavaScriptObject {
- public final native String name() /*-{ return this.name; }-*/;
- public final native String description() /*-{ return this.description; }-*/;
- public final native String url() /*-{ return this.url; }-*/;
-
- protected AgreementInfo() {
- }
-}
+public class SshdInfo {
+}
\ No newline at end of file
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestInfo.java
similarity index 60%
copy from gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestInfo.java
index f038818..5b0dcbe 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestInfo.java
@@ -12,15 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.account;
+package com.google.gerrit.extensions.common;
-import com.google.gwt.core.client.JavaScriptObject;
-
-public class AgreementInfo extends JavaScriptObject {
- public final native String name() /*-{ return this.name; }-*/;
- public final native String description() /*-{ return this.description; }-*/;
- public final native String url() /*-{ return this.url; }-*/;
-
- protected AgreementInfo() {
- }
-}
+public class SuggestInfo {
+ public int from;
+}
\ No newline at end of file
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/UserConfigInfo.java
similarity index 60%
copy from gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/UserConfigInfo.java
index f038818..5010689 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/UserConfigInfo.java
@@ -12,15 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.account;
+package com.google.gerrit.extensions.common;
-import com.google.gwt.core.client.JavaScriptObject;
-
-public class AgreementInfo extends JavaScriptObject {
- public final native String name() /*-{ return this.name; }-*/;
- public final native String description() /*-{ return this.description; }-*/;
- public final native String url() /*-{ return this.url; }-*/;
-
- protected AgreementInfo() {
- }
-}
+public class UserConfigInfo {
+ public String anonymousCowardName;
+}
\ No newline at end of file
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AgreementInfo.java
similarity index 87%
rename from gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
rename to gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AgreementInfo.java
index f038818..5fb2f48 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AgreementInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AgreementInfo.java
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.account;
+package com.google.gerrit.client.info;
import com.google.gwt.core.client.JavaScriptObject;
@@ -20,6 +20,7 @@
public final native String name() /*-{ return this.name; }-*/;
public final native String description() /*-{ return this.description; }-*/;
public final native String url() /*-{ return this.url; }-*/;
+ public final native GroupInfo autoVerifyGroup() /*-{ return this.auto_verify_group; }-*/;
protected AgreementInfo() {
}
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AuthInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AuthInfo.java
index 0e3c32b..8669dd5 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AuthInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AuthInfo.java
@@ -15,10 +15,10 @@
package com.google.gerrit.client.info;
import com.google.gerrit.client.rpc.Natives;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Account.FieldName;
-import com.google.gerrit.reviewdb.client.AuthType;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import java.util.ArrayList;
@@ -52,22 +52,30 @@
return authType() == AuthType.CUSTOM_EXTENSION;
}
- public final boolean canEdit(Account.FieldName f) {
+ public final boolean canEdit(AccountFieldName f) {
return editableAccountFields().contains(f);
}
- public final List<Account.FieldName> editableAccountFields() {
- List<Account.FieldName> fields = new ArrayList<>();
+ public final List<AccountFieldName> editableAccountFields() {
+ List<AccountFieldName> fields = new ArrayList<>();
for (String f : Natives.asList(_editableAccountFields())) {
- fields.add(Account.FieldName.valueOf(f));
+ fields.add(AccountFieldName.valueOf(f));
}
return fields;
}
+ public final List<AgreementInfo> contributorAgreements() {
+ List<AgreementInfo> agreements = new ArrayList<>();
+ for (AgreementInfo a : Natives.asList(_contributorAgreements())) {
+ agreements.add(a);
+ }
+ return agreements;
+ }
+
public final boolean siteHasUsernames() {
if (isCustomExtension()
&& httpPasswordUrl() != null
- && !canEdit(FieldName.USER_NAME)) {
+ && !canEdit(AccountFieldName.USER_NAME)) {
return false;
}
return true;
@@ -93,6 +101,8 @@
private native String authTypeRaw() /*-{ return this.auth_type; }-*/;
private native JsArrayString _editableAccountFields()
/*-{ return this.editable_account_fields; }-*/;
+ private native JsArray<AgreementInfo> _contributorAgreements()
+ /*-{ return this.contributor_agreements; }-*/;
protected AuthInfo() {
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupBaseInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupBaseInfo.java
similarity index 95%
rename from gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupBaseInfo.java
rename to gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupBaseInfo.java
index 4811e59..deed44d 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupBaseInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupBaseInfo.java
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.groups;
+package com.google.gerrit.client.info;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gwt.core.client.JavaScriptObject;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupInfo.java
similarity index 95%
rename from gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupInfo.java
rename to gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupInfo.java
index c3fd4ed..fa051a1 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GroupInfo.java
@@ -12,9 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.client.groups;
+package com.google.gerrit.client.info;
-import com.google.gerrit.client.info.AccountInfo;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
index b7405c7..539d53b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java
@@ -89,7 +89,7 @@
import com.google.gerrit.client.documentation.DocScreen;
import com.google.gerrit.client.editor.EditScreen;
import com.google.gerrit.client.groups.GroupApi;
-import com.google.gerrit.client.groups.GroupInfo;
+import com.google.gerrit.client.info.GroupInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gerrit.client.ui.Screen;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountApi.java
index 15668ca..9aca859 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountApi.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountApi.java
@@ -16,6 +16,7 @@
import com.google.gerrit.client.VoidResult;
import com.google.gerrit.client.info.AccountInfo;
+import com.google.gerrit.client.info.AgreementInfo;
import com.google.gerrit.client.info.GpgKeyInfo;
import com.google.gerrit.client.rpc.CallbackGroup;
import com.google.gerrit.client.rpc.NativeMap;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ContactPanelShort.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ContactPanelShort.java
index e078e60..f5f38fb 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ContactPanelShort.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ContactPanelShort.java
@@ -24,8 +24,7 @@
import com.google.gerrit.client.ui.OnEditEnabler;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.errors.EmailException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Account.FieldName;
+import com.google.gerrit.extensions.client.AccountFieldName;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
@@ -102,7 +101,7 @@
}
int row = 0;
- if (!Gerrit.info().auth().canEdit(FieldName.USER_NAME)
+ if (!Gerrit.info().auth().canEdit(AccountFieldName.USER_NAME)
&& Gerrit.info().auth().siteHasUsernames()) {
infoPlainText.resizeRows(infoPlainText.getRowCount() + 1);
row(infoPlainText, row++, Util.C.userName(), new UsernameField());
@@ -171,11 +170,11 @@
}
private boolean canEditFullName() {
- return Gerrit.info().auth().canEdit(Account.FieldName.FULL_NAME);
+ return Gerrit.info().auth().canEdit(AccountFieldName.FULL_NAME);
}
private boolean canRegisterNewEmail() {
- return Gerrit.info().auth().canEdit(Account.FieldName.REGISTER_NEW_EMAIL);
+ return Gerrit.info().auth().canEdit(AccountFieldName.REGISTER_NEW_EMAIL);
}
void hideSaveButton() {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyAgreementsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyAgreementsScreen.java
index 5396b4f..47aa1cd 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyAgreementsScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyAgreementsScreen.java
@@ -15,6 +15,7 @@
package com.google.gerrit.client.account;
import com.google.gerrit.client.Gerrit;
+import com.google.gerrit.client.info.AgreementInfo;
import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.ui.FancyFlexTable;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/NewAgreementScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/NewAgreementScreen.java
index 27a6cc7..a53ebea 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/NewAgreementScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/NewAgreementScreen.java
@@ -16,6 +16,7 @@
import com.google.gerrit.client.ErrorDialog;
import com.google.gerrit.client.Gerrit;
+import com.google.gerrit.client.info.AgreementInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.Natives;
@@ -23,7 +24,6 @@
import com.google.gerrit.client.ui.OnEditEnabler;
import com.google.gerrit.client.ui.SmallHeading;
import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.common.data.ContributorAgreement;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.event.dom.client.ClickEvent;
@@ -51,8 +51,8 @@
public class NewAgreementScreen extends AccountScreen {
private final String nextToken;
private Set<String> mySigned;
- private List<ContributorAgreement> available;
- private ContributorAgreement current;
+ private List<AgreementInfo> available;
+ private AgreementInfo current;
private VerticalPanel radios;
@@ -87,16 +87,8 @@
}
}});
- Gerrit.SYSTEM_SVC
- .contributorAgreements(new GerritCallback<List<ContributorAgreement>>() {
- @Override
- public void onSuccess(final List<ContributorAgreement> result) {
- if (isAttached()) {
- available = result;
- postRPC();
- }
- }
- });
+ available = Gerrit.info().auth().contributorAgreements();
+ postRPC();
}
@Override
@@ -163,12 +155,12 @@
}
radios.add(hdr);
- for (final ContributorAgreement cla : available) {
- final RadioButton r = new RadioButton("cla_id", cla.getName());
+ for (final AgreementInfo cla : available) {
+ final RadioButton r = new RadioButton("cla_id", cla.name());
r.addStyleName(Gerrit.RESOURCES.css().contributorAgreementButton());
radios.add(r);
- if (mySigned.contains(cla.getName())) {
+ if (mySigned.contains(cla.name())) {
r.setEnabled(false);
final Label l = new Label(Util.C.newAgreementAlreadySubmitted());
l.setStyleName(Gerrit.RESOURCES.css().contributorAgreementAlreadySubmitted());
@@ -182,8 +174,8 @@
});
}
- if (cla.getDescription() != null && !cla.getDescription().equals("")) {
- final Label l = new Label(cla.getDescription());
+ if (cla.description() != null && !cla.description().equals("")) {
+ final Label l = new Label(cla.description());
l.setStyleName(Gerrit.RESOURCES.css().contributorAgreementShortDescription());
radios.add(l);
}
@@ -204,7 +196,7 @@
}
private void doEnterAgreement() {
- AccountApi.enterAgreement("self", current.getName(),
+ AccountApi.enterAgreement("self", current.name(),
new GerritCallback<NativeString>() {
@Override
public void onSuccess(NativeString result) {
@@ -219,9 +211,9 @@
});
}
- private void showCLA(final ContributorAgreement cla) {
+ private void showCLA(AgreementInfo cla) {
current = cla;
- String url = cla.getAgreementUrl();
+ String url = cla.url();
if (url != null && url.length() > 0) {
agreementGroup.setVisible(true);
agreementHtml.setText(Gerrit.C.rpcStatusWorking());
@@ -255,7 +247,7 @@
agreementGroup.setVisible(false);
}
- finalGroup.setVisible(cla.getAutoVerify() != null);
+ finalGroup.setVisible(cla.autoVerifyGroup() != null);
yesIAgreeBox.setText("");
submit.setEnabled(false);
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/RegisterScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/RegisterScreen.java
index c32a846..73557aa 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/RegisterScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/RegisterScreen.java
@@ -20,7 +20,7 @@
import com.google.gerrit.client.ui.InlineHyperlink;
import com.google.gerrit.client.ui.SmallHeading;
import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.reviewdb.client.Account.FieldName;
+import com.google.gerrit.extensions.client.AccountFieldName;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FormPanel;
@@ -70,7 +70,7 @@
formBody.add(contactGroup);
if (Gerrit.getUserAccount().username() == null
- && Gerrit.info().auth().canEdit(FieldName.USER_NAME)) {
+ && Gerrit.info().auth().canEdit(AccountFieldName.USER_NAME)) {
final FlowPanel fp = new FlowPanel();
fp.setStyleName(Gerrit.RESOURCES.css().registerScreenSection());
fp.add(new SmallHeading(Util.C.welcomeUsernameHeading()));
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java
index f388436..d70121b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/UsernameField.java
@@ -22,6 +22,7 @@
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gerrit.client.ui.OnEditEnabler;
+import com.google.gerrit.extensions.client.AccountFieldName;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
@@ -86,7 +87,7 @@
}
private boolean canEditUserName() {
- return Gerrit.info().auth().canEdit(Account.FieldName.USER_NAME);
+ return Gerrit.info().auth().canEdit(AccountFieldName.USER_NAME);
}
private void confirmSetUserName() {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupAuditLogScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupAuditLogScreen.java
index 254d3e6..7a32f01 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupAuditLogScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupAuditLogScreen.java
@@ -21,8 +21,8 @@
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.groups.GroupApi;
import com.google.gerrit.client.groups.GroupAuditEventInfo;
-import com.google.gerrit.client.groups.GroupInfo;
import com.google.gerrit.client.info.AccountInfo;
+import com.google.gerrit.client.info.GroupInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.ui.FancyFlexTable;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupInfoScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupInfoScreen.java
index a71dffe..22a57a4 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupInfoScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupInfoScreen.java
@@ -17,7 +17,7 @@
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.VoidResult;
import com.google.gerrit.client.groups.GroupApi;
-import com.google.gerrit.client.groups.GroupInfo;
+import com.google.gerrit.client.info.GroupInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.AccountGroupSuggestOracle;
import com.google.gerrit.client.ui.OnEditEnabler;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java
index 7c0c8f6..053e7e0c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupMembersScreen.java
@@ -18,8 +18,8 @@
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.VoidResult;
import com.google.gerrit.client.groups.GroupApi;
-import com.google.gerrit.client.groups.GroupInfo;
import com.google.gerrit.client.info.AccountInfo;
+import com.google.gerrit.client.info.GroupInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.ui.AccountGroupSuggestOracle;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java
index 8c00ba7..cbe8a06 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AccountGroupScreen.java
@@ -17,7 +17,7 @@
import static com.google.gerrit.client.Dispatcher.toGroup;
import com.google.gerrit.client.groups.GroupApi;
-import com.google.gerrit.client.groups.GroupInfo;
+import com.google.gerrit.client.info.GroupInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.MenuScreen;
import com.google.gerrit.reviewdb.client.AccountGroup;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateGroupScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateGroupScreen.java
index a2ba5cd..4efaa61 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateGroupScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/CreateGroupScreen.java
@@ -21,7 +21,7 @@
import com.google.gerrit.client.NotFoundScreen;
import com.google.gerrit.client.account.AccountCapabilities;
import com.google.gerrit.client.groups.GroupApi;
-import com.google.gerrit.client.groups.GroupInfo;
+import com.google.gerrit.client.info.GroupInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.OnEditEnabler;
import com.google.gerrit.client.ui.Screen;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java
index 64fc0e5..94d15bd 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/GroupTable.java
@@ -18,9 +18,9 @@
import com.google.gerrit.client.Dispatcher;
import com.google.gerrit.client.Gerrit;
-import com.google.gerrit.client.groups.GroupInfo;
import com.google.gerrit.client.groups.GroupList;
import com.google.gerrit.client.groups.GroupMap;
+import com.google.gerrit.client.info.GroupInfo;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.ui.HighlightingInlineHyperlink;
import com.google.gerrit.client.ui.NavigationTable;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java
index 5d281d1..9b004f9 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.java
@@ -558,35 +558,40 @@
}
private void initEditMode(ChangeInfo info, String revision) {
- if (Gerrit.isSignedIn() && info.status().isOpen()) {
+ if (Gerrit.isSignedIn()) {
RevisionInfo rev = info.revision(revision);
- if (isEditModeEnabled(info, rev)) {
- editMode.setVisible(fileTableMode == FileTable.Mode.REVIEW);
- addFile.setVisible(!editMode.isVisible());
- deleteFile.setVisible(!editMode.isVisible());
- renameFile.setVisible(!editMode.isVisible());
- reviewMode.setVisible(!editMode.isVisible());
- addFileAction = new AddFileAction(
- changeId, info.revision(revision),
- style, addFile, files);
- deleteFileAction = new DeleteFileAction(
- changeId, info.revision(revision),
- style, addFile);
- renameFileAction = new RenameFileAction(
- changeId, info.revision(revision),
- style, addFile);
- } else {
- editMode.setVisible(false);
- addFile.setVisible(false);
- reviewMode.setVisible(false);
- }
-
- if (rev.isEdit()) {
- if (info.hasEditBasedOnCurrentPatchSet()) {
- publishEdit.setVisible(true);
+ if (info.status().isOpen()) {
+ if (isEditModeEnabled(info, rev)) {
+ editMode.setVisible(fileTableMode == FileTable.Mode.REVIEW);
+ addFile.setVisible(!editMode.isVisible());
+ deleteFile.setVisible(!editMode.isVisible());
+ renameFile.setVisible(!editMode.isVisible());
+ reviewMode.setVisible(!editMode.isVisible());
+ addFileAction = new AddFileAction(
+ changeId, info.revision(revision),
+ style, addFile, files);
+ deleteFileAction = new DeleteFileAction(
+ changeId, info.revision(revision),
+ style, addFile);
+ renameFileAction = new RenameFileAction(
+ changeId, info.revision(revision),
+ style, addFile);
} else {
- rebaseEdit.setVisible(true);
+ editMode.setVisible(false);
+ addFile.setVisible(false);
+ reviewMode.setVisible(false);
}
+
+ if (rev.isEdit()) {
+ if (info.hasEditBasedOnCurrentPatchSet()) {
+ publishEdit.setVisible(true);
+ } else {
+ rebaseEdit.setVisible(true);
+ }
+ deleteEdit.setVisible(true);
+ }
+ } else if (rev.isEdit()) {
+ deleteEdit.setStyleName(style.highlight());
deleteEdit.setVisible(true);
}
}
@@ -605,37 +610,39 @@
@UiHandler("publishEdit")
void onPublishEdit(@SuppressWarnings("unused") ClickEvent e) {
- EditActions.publishEdit(changeId);
+ EditActions.publishEdit(changeId, publishEdit, rebaseEdit, deleteEdit);
}
@UiHandler("rebaseEdit")
void onRebaseEdit(@SuppressWarnings("unused") ClickEvent e) {
- EditActions.rebaseEdit(changeId);
+ EditActions.rebaseEdit(changeId, publishEdit, rebaseEdit, deleteEdit);
}
@UiHandler("deleteEdit")
void onDeleteEdit(@SuppressWarnings("unused") ClickEvent e) {
if (Window.confirm(Resources.C.deleteChangeEdit())) {
- EditActions.deleteEdit(changeId);
+ EditActions.deleteEdit(changeId, publishEdit, rebaseEdit, deleteEdit);
}
}
@UiHandler("publish")
void onPublish(@SuppressWarnings("unused") ClickEvent e) {
- DraftActions.publish(changeId, revision);
+ DraftActions.publish(changeId, revision, publish, deleteRevision,
+ deleteChange);
}
@UiHandler("deleteRevision")
void onDeleteRevision(@SuppressWarnings("unused") ClickEvent e) {
if (Window.confirm(Resources.C.deleteDraftRevision())) {
- DraftActions.delete(changeId, revision);
+ DraftActions.delete(changeId, revision, publish, deleteRevision,
+ deleteChange);
}
}
@UiHandler("deleteChange")
void onDeleteChange(@SuppressWarnings("unused") ClickEvent e) {
if (Window.confirm(Resources.C.deleteDraftChange())) {
- DraftActions.delete(changeId);
+ DraftActions.delete(changeId, publish, deleteRevision, deleteChange);
}
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DraftActions.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DraftActions.java
index 634190a2..6787576 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DraftActions.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DraftActions.java
@@ -21,23 +21,25 @@
import com.google.gerrit.reviewdb.client.Change;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.Button;
public class DraftActions {
- static void publish(Change.Id id, String revision) {
- ChangeApi.publish(id.get(), revision, cs(id));
+ static void publish(Change.Id id, String revision, Button... draftButtons) {
+ ChangeApi.publish(id.get(), revision, cs(id, draftButtons));
}
- static void delete(Change.Id id, String revision) {
- ChangeApi.deleteRevision(id.get(), revision, cs(id));
+ static void delete(Change.Id id, String revision, Button... draftButtons) {
+ ChangeApi.deleteRevision(id.get(), revision, cs(id, draftButtons));
}
- static void delete(Change.Id id) {
- ChangeApi.deleteChange(id.get(), mine());
+ static void delete(Change.Id id, Button... draftButtons) {
+ ChangeApi.deleteChange(id.get(), mine(draftButtons));
}
public static GerritCallback<JavaScriptObject> cs(
- final Change.Id id) {
+ final Change.Id id, final Button... draftButtons) {
+ setEnabled(false, draftButtons);
return new GerritCallback<JavaScriptObject>() {
@Override
public void onSuccess(JavaScriptObject result) {
@@ -46,6 +48,7 @@
@Override
public void onFailure(Throwable err) {
+ setEnabled(true, draftButtons);
if (SubmitFailureDialog.isConflict(err)) {
new SubmitFailureDialog(err.getMessage()).center();
Gerrit.display(PageLinks.toChange(id));
@@ -56,7 +59,9 @@
};
}
- private static AsyncCallback<JavaScriptObject> mine() {
+ private static AsyncCallback<JavaScriptObject> mine(
+ final Button... draftButtons) {
+ setEnabled(false, draftButtons);
return new GerritCallback<JavaScriptObject>() {
@Override
public void onSuccess(JavaScriptObject result) {
@@ -65,6 +70,7 @@
@Override
public void onFailure(Throwable err) {
+ setEnabled(true, draftButtons);
if (SubmitFailureDialog.isConflict(err)) {
new SubmitFailureDialog(err.getMessage()).center();
Gerrit.display(PageLinks.MINE);
@@ -74,4 +80,12 @@
}
};
}
+
+ private static void setEnabled(boolean enabled, Button... draftButtons) {
+ if (draftButtons != null) {
+ for (Button b : draftButtons) {
+ b.setEnabled(enabled);
+ }
+ }
+ }
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/EditActions.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/EditActions.java
index d11cf7e..97abddb 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/EditActions.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/EditActions.java
@@ -20,23 +20,25 @@
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.user.client.ui.Button;
public class EditActions {
- static void deleteEdit(Change.Id id) {
- ChangeApi.deleteEdit(id.get(), cs(id));
+ static void deleteEdit(Change.Id id, Button... editButtons) {
+ ChangeApi.deleteEdit(id.get(), cs(id, editButtons));
}
- static void publishEdit(Change.Id id) {
- ChangeApi.publishEdit(id.get(), cs(id));
+ static void publishEdit(Change.Id id, Button... editButtons) {
+ ChangeApi.publishEdit(id.get(), cs(id, editButtons));
}
- static void rebaseEdit(Change.Id id) {
- ChangeApi.rebaseEdit(id.get(), cs(id));
+ static void rebaseEdit(Change.Id id, Button... editButtons) {
+ ChangeApi.rebaseEdit(id.get(), cs(id, editButtons));
}
public static GerritCallback<JavaScriptObject> cs(
- final Change.Id id) {
+ final Change.Id id, final Button... editButtons) {
+ setEnabled(false, editButtons);
return new GerritCallback<JavaScriptObject>() {
@Override
public void onSuccess(JavaScriptObject result) {
@@ -45,6 +47,7 @@
@Override
public void onFailure(Throwable err) {
+ setEnabled(true, editButtons);
if (SubmitFailureDialog.isConflict(err)) {
new SubmitFailureDialog(err.getMessage()).center();
Gerrit.display(PageLinks.toChange(id));
@@ -54,4 +57,12 @@
}
};
}
+
+ private static void setEnabled(boolean enabled, Button... editButtons) {
+ if (editButtons != null) {
+ for (Button b : editButtons) {
+ b.setEnabled(enabled);
+ }
+ }
+ }
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReviewerSuggestOracle.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReviewerSuggestOracle.java
index a852fa0..2188c03 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReviewerSuggestOracle.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReviewerSuggestOracle.java
@@ -16,8 +16,8 @@
import com.google.gerrit.client.admin.Util;
import com.google.gerrit.client.changes.ChangeApi;
-import com.google.gerrit.client.groups.GroupBaseInfo;
import com.google.gerrit.client.info.AccountInfo;
+import com.google.gerrit.client.info.GroupBaseInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.ui.AccountSuggestOracle;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupApi.java
index 93be87b..760f06d 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupApi.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupApi.java
@@ -16,6 +16,7 @@
import com.google.gerrit.client.VoidResult;
import com.google.gerrit.client.info.AccountInfo;
+import com.google.gerrit.client.info.GroupInfo;
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.rpc.RestApi;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupAuditEventInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupAuditEventInfo.java
index ed41b65..5bcdc6b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupAuditEventInfo.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupAuditEventInfo.java
@@ -15,6 +15,7 @@
package com.google.gerrit.client.groups;
import com.google.gerrit.client.info.AccountInfo;
+import com.google.gerrit.client.info.GroupInfo;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwtjsonrpc.client.impl.ser.JavaSqlTimestamp_JsonSerializer;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupList.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupList.java
index a24e1dc..f51ecb8 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupList.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupList.java
@@ -14,6 +14,7 @@
package com.google.gerrit.client.groups;
+import com.google.gerrit.client.info.GroupInfo;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gwt.core.client.JsArray;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupMap.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupMap.java
index 5532285..5e23049 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupMap.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/groups/GroupMap.java
@@ -14,6 +14,7 @@
package com.google.gerrit.client.groups;
+import com.google.gerrit.client.info.GroupInfo;
import com.google.gerrit.client.rpc.NativeMap;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gwt.user.client.rpc.AsyncCallback;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountGroupSuggestOracle.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountGroupSuggestOracle.java
index a96624a..983d48c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountGroupSuggestOracle.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/AccountGroupSuggestOracle.java
@@ -14,8 +14,8 @@
package com.google.gerrit.client.ui;
-import com.google.gerrit.client.groups.GroupInfo;
import com.google.gerrit.client.groups.GroupMap;
+import com.google.gerrit.client.info.GroupInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.reviewdb.client.AccountGroup;
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java
index 5146b31..7935bb6 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java
@@ -14,7 +14,7 @@
package com.google.gerrit.httpd;
-import static com.google.gerrit.reviewdb.client.AuthType.OAUTH;
+import static com.google.gerrit.extensions.client.AuthType.OAUTH;
import com.google.gerrit.reviewdb.client.CoreDownloadSchemes;
import com.google.gerrit.server.config.AuthConfig;
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java
index 2c67182..fff43d3 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java
@@ -18,6 +18,7 @@
import com.google.common.base.Strings;
import com.google.gerrit.common.PageLinks;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.httpd.raw.CatServlet;
import com.google.gerrit.httpd.raw.HostPageServlet;
import com.google.gerrit.httpd.raw.LegacyGerritServlet;
@@ -30,7 +31,6 @@
import com.google.gerrit.httpd.restapi.GroupsRestApiServlet;
import com.google.gerrit.httpd.restapi.ProjectsRestApiServlet;
import com.google.gerrit.httpd.rpc.doc.QueryDocumentationFilter;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AuthConfig;
@@ -64,6 +64,7 @@
if (options.enableDefaultUi()) {
filter("/").through(XsrfCookieFilter.class);
+ filter("/accounts/self/detail").through(XsrfCookieFilter.class);
serve("/").with(HostPageServlet.class);
serve("/Gerrit").with(LegacyGerritServlet.class);
serve("/Gerrit/*").with(legacyGerritScreen());
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
index 8594e30..27aff21 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
@@ -359,7 +359,6 @@
if (Strings.isNullOrEmpty(entryTitle)) {
entryTitle = rsrc.substring(nameOffset, rsrc.length() - 3).replace('-', ' ');
}
- rsrc = rsrc.substring(0, rsrc.length() - 3) + ".html";
} else {
entryTitle = rsrc.substring(nameOffset).replace('-', ' ');
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java
index c0fb86b..bda2d91 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java
@@ -14,11 +14,8 @@
package com.google.gerrit.httpd.rpc;
-import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.ContributorAgreement;
import com.google.gerrit.common.data.SshHostKey;
import com.google.gerrit.common.data.SystemInfoService;
-import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.ssh.SshInfo;
import com.google.gwtjsonrpc.common.AsyncCallback;
import com.google.gwtjsonrpc.common.VoidResult;
@@ -32,7 +29,6 @@
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
@@ -45,28 +41,12 @@
private final List<HostKey> hostKeys;
private final Provider<HttpServletRequest> httpRequest;
- private final ProjectCache projectCache;
@Inject
SystemInfoServiceImpl(SshInfo daemon,
- Provider<HttpServletRequest> hsr,
- ProjectCache pc) {
+ Provider<HttpServletRequest> hsr) {
hostKeys = daemon.getHostKeys();
httpRequest = hsr;
- projectCache = pc;
- }
-
- @Override
- public void contributorAgreements(
- final AsyncCallback<List<ContributorAgreement>> callback) {
- Collection<ContributorAgreement> agreements =
- projectCache.getAllProjects().getConfig().getContributorAgreements();
- List<ContributorAgreement> cas =
- Lists.newArrayListWithCapacity(agreements.size());
- for (ContributorAgreement ca : agreements) {
- cas.add(ca.forUi());
- }
- callback.onSuccess(cas);
}
@Override
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
index 77b364c..c137d1e 100644
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
+++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java
@@ -377,7 +377,7 @@
close();
throw new OrmRuntimeException(e);
} catch (ExecutionException e) {
- Throwables.propagateIfPossible(e.getCause());
+ Throwables.throwIfUnchecked(e.getCause());
throw new OrmRuntimeException(e.getCause());
}
}
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java
index 3a40252..791f9fd 100644
--- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java
+++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/LoginForm.java
@@ -24,12 +24,12 @@
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.auth.openid.OpenIdUrls;
import com.google.gerrit.extensions.auth.oauth.OAuthServiceProvider;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.httpd.HtmlDomUtil;
import com.google.gerrit.httpd.LoginUrlToken;
import com.google.gerrit.httpd.template.SiteHeaderFooter;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.config.AuthConfig;
import com.google.gerrit.server.config.CanonicalWebUrl;
diff --git a/gerrit-pgm/BUILD b/gerrit-pgm/BUILD
index 59b371a..ec86c9a 100644
--- a/gerrit-pgm/BUILD
+++ b/gerrit-pgm/BUILD
@@ -19,6 +19,7 @@
'//lib/guice:guice-assistedinject',
'//lib/guice:guice-servlet',
'//lib/jgit/org.eclipse.jgit:jgit',
+ '//lib/joda:joda-time',
'//lib/log:api',
'//lib/log:log4j',
]
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
index 7ee3cde..d98f999 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
@@ -20,6 +20,7 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
import com.google.gerrit.common.EventBroker;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.gpg.GpgModule;
import com.google.gerrit.httpd.AllRequestFilter;
import com.google.gerrit.httpd.GerritOptions;
@@ -46,7 +47,6 @@
import com.google.gerrit.pgm.util.LogFileCompressor;
import com.google.gerrit.pgm.util.RuntimeShutdown;
import com.google.gerrit.pgm.util.SiteProgram;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.server.account.InternalAccountDirectory;
import com.google.gerrit.server.cache.h2.DefaultCacheFactory;
import com.google.gerrit.server.change.ChangeCleanupRunner;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
index 9d27170..f5212ab 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
@@ -18,9 +18,9 @@
import static java.util.concurrent.TimeUnit.SECONDS;
import com.google.common.base.Strings;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.pgm.http.jetty.HttpLog.HttpLogFactory;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.config.ThreadSettingsConfig;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java
index 2de71cc..136ec5a 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAdminUser.java
@@ -18,6 +18,7 @@
import com.google.common.base.Strings;
import com.google.gerrit.common.TimeUtil;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.pgm.init.api.ConsoleUI;
import com.google.gerrit.pgm.init.api.InitFlags;
import com.google.gerrit.pgm.init.api.InitStep;
@@ -27,7 +28,6 @@
import com.google.gerrit.reviewdb.client.AccountGroupMember;
import com.google.gerrit.reviewdb.client.AccountGroupName;
import com.google.gerrit.reviewdb.client.AccountSshKey;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.Inject;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAuth.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAuth.java
index 6b30f80..a6471c7 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAuth.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitAuth.java
@@ -16,11 +16,11 @@
import static com.google.gerrit.pgm.init.api.InitUtil.dnOf;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.pgm.init.api.ConsoleUI;
import com.google.gerrit.pgm.init.api.InitFlags;
import com.google.gerrit.pgm.init.api.InitStep;
import com.google.gerrit.pgm.init.api.Section;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gwtjsonrpc.server.SignedToken;
import com.google.inject.Inject;
import com.google.inject.Singleton;
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 9e36fc1..de2134b 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
@@ -55,10 +55,6 @@
* </ul>
*/
public final class Account {
- public enum FieldName {
- FULL_NAME, USER_NAME, REGISTER_NEW_EMAIL
- }
-
public static final String USER_NAME_PATTERN_FIRST = "[a-zA-Z0-9]";
public static final String USER_NAME_PATTERN_REST = "[a-zA-Z0-9._-]";
public static final String USER_NAME_PATTERN_LAST = "[a-zA-Z0-9]";
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountExternalId.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountExternalId.java
index 41336791..5ae8847 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountExternalId.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountExternalId.java
@@ -14,6 +14,7 @@
package com.google.gerrit.reviewdb.client;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gwtorm.client.Column;
import com.google.gwtorm.client.StringKey;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AbstractRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AbstractRealm.java
index 30420e0..a0c6118 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AbstractRealm.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AbstractRealm.java
@@ -16,8 +16,7 @@
import com.google.common.base.Strings;
import com.google.common.collect.Sets;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Account.FieldName;
+import com.google.gerrit.extensions.client.AccountFieldName;
import com.google.gerrit.reviewdb.client.AccountExternalId;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.mail.EmailSender;
@@ -37,11 +36,11 @@
}
@Override
- public Set<FieldName> getEditableFields() {
- Set<Account.FieldName> fields = new HashSet<>();
- for (Account.FieldName n : Account.FieldName.values()) {
+ public Set<AccountFieldName> getEditableFields() {
+ Set<AccountFieldName> fields = new HashSet<>();
+ for (AccountFieldName n : AccountFieldName.values()) {
if (allowsEdit(n)) {
- if (n == Account.FieldName.REGISTER_NEW_EMAIL) {
+ if (n == AccountFieldName.REGISTER_NEW_EMAIL) {
if (emailSender != null && emailSender.isEnabled()) {
fields.add(n);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLoader.java
index f84d399..89e9419 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLoader.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountLoader.java
@@ -94,7 +94,7 @@
directory.fillAccountInfo(
Iterables.concat(created.values(), provided), options);
} catch (DirectoryException e) {
- Throwables.propagateIfPossible(e.getCause(), OrmException.class);
+ Throwables.throwIfInstanceOf(e.getCause(), OrmException.class);
throw new OrmException(e);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java
index 19f9fcf..178cc79 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java
@@ -21,6 +21,7 @@
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.errors.NameAlreadyUsedException;
+import com.google.gerrit.extensions.client.AccountFieldName;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountExternalId;
import com.google.gerrit.reviewdb.client.AccountGroup;
@@ -201,14 +202,14 @@
db.accountExternalIds().update(Collections.singleton(extId));
}
- if (!realm.allowsEdit(Account.FieldName.FULL_NAME)
+ if (!realm.allowsEdit(AccountFieldName.FULL_NAME)
&& !Strings.isNullOrEmpty(who.getDisplayName())
&& !eq(user.getAccount().getFullName(), who.getDisplayName())) {
toUpdate = load(toUpdate, user.getAccountId(), db);
toUpdate.setFullName(who.getDisplayName());
}
- if (!realm.allowsEdit(Account.FieldName.USER_NAME)
+ if (!realm.allowsEdit(AccountFieldName.USER_NAME)
&& who.getUserName() != null
&& !eq(user.getUserName(), who.getUserName())) {
log.warn(String.format("Not changing already set username %s to %s",
@@ -340,7 +341,7 @@
} else {
log.error(errorMessage);
}
- if (!realm.allowsEdit(Account.FieldName.USER_NAME)) {
+ if (!realm.allowsEdit(AccountFieldName.USER_NAME)) {
// setting the given user name has failed, but the realm does not
// allow the user to manually set a user name,
// this means we would end with an account without user name
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java
index 1110acd..578352b7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java
@@ -16,6 +16,8 @@
import com.google.gerrit.common.errors.EmailException;
import com.google.gerrit.extensions.api.accounts.EmailInput;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
@@ -23,8 +25,6 @@
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Account.FieldName;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.GetEmails.EmailInfo;
@@ -96,7 +96,7 @@
throw new AuthException("not allowed to use no_confirmation");
}
- if (!realm.allowsEdit(FieldName.REGISTER_NEW_EMAIL)) {
+ if (!realm.allowsEdit(AccountFieldName.REGISTER_NEW_EMAIL)) {
throw new MethodNotAllowedException("realm does not allow adding emails");
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DefaultRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DefaultRealm.java
index eb3c9a0..57af333 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DefaultRealm.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DefaultRealm.java
@@ -15,8 +15,9 @@
package com.google.gerrit.server.account;
import com.google.common.base.Strings;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.server.config.AuthConfig;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -39,7 +40,7 @@
}
@Override
- public boolean allowsEdit(final Account.FieldName field) {
+ public boolean allowsEdit(final AccountFieldName field) {
if (authConfig.getAuthType() == AuthType.HTTP) {
switch (field) {
case USER_NAME:
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java
index 76f63b7..1f073ae 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java
@@ -14,13 +14,13 @@
package com.google.gerrit.server.account;
+import com.google.gerrit.extensions.client.AccountFieldName;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.reviewdb.client.Account.FieldName;
import com.google.gerrit.reviewdb.client.AccountExternalId;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
@@ -67,7 +67,7 @@
public Response<?> apply(IdentifiedUser user, String email)
throws ResourceNotFoundException, ResourceConflictException,
MethodNotAllowedException, OrmException, IOException {
- if (!realm.allowsEdit(FieldName.REGISTER_NEW_EMAIL)) {
+ if (!realm.allowsEdit(AccountFieldName.REGISTER_NEW_EMAIL)) {
throw new MethodNotAllowedException("realm does not allow deleting emails");
}
AccountExternalId.Key key = new AccountExternalId.Key(
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/FakeRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/FakeRealm.java
index d3b938f..a53f64e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/FakeRealm.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/FakeRealm.java
@@ -14,13 +14,13 @@
package com.google.gerrit.server.account;
+import com.google.gerrit.extensions.client.AccountFieldName;
import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Account.FieldName;
/** Fake implementation of {@link Realm} that does not communicate. */
public class FakeRealm extends AbstractRealm {
@Override
- public boolean allowsEdit(FieldName field) {
+ public boolean allowsEdit(AccountFieldName field) {
return false;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAgreements.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAgreements.java
index f9e18c5..2924f97 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAgreements.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetAgreements.java
@@ -24,6 +24,7 @@
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.config.AgreementJson;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.project.ProjectCache;
import com.google.inject.Inject;
@@ -46,16 +47,19 @@
private final Provider<IdentifiedUser> self;
private final ProjectCache projectCache;
private final IdentifiedUser.GenericFactory identifiedUserFactory;
+ private final AgreementJson agreementJson;
private final boolean agreementsEnabled;
@Inject
GetAgreements(Provider<IdentifiedUser> self,
ProjectCache projectCache,
IdentifiedUser.GenericFactory identifiedUserFactory,
+ AgreementJson agreementJson,
@GerritServerConfig Config config) {
this.self = self;
this.projectCache = projectCache;
this.identifiedUserFactory = identifiedUserFactory;
+ this.agreementJson = agreementJson;
this.agreementsEnabled =
config.getBoolean("auth", "contributorAgreements", false);
}
@@ -85,17 +89,13 @@
groupIds.add(rule.getGroup().getUUID());
} else {
log.warn("group \"" + rule.getGroup().getName() + "\" does not " +
- " exist, referenced in CLA \"" + ca.getName() + "\"");
+ "exist, referenced in CLA \"" + ca.getName() + "\"");
}
}
}
if (user.getEffectiveGroups().containsAnyOf(groupIds)) {
- AgreementInfo info = new AgreementInfo();
- info.name = ca.getName();
- info.description = ca.getDescription();
- info.url = ca.getAgreementUrl();
- results.add(info);
+ results.add(agreementJson.format(ca));
}
}
return results;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDetail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDetail.java
index 81c860e..e47ceb3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDetail.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetDetail.java
@@ -47,7 +47,7 @@
directory.fillAccountInfo(Collections.singleton(info),
EnumSet.allOf(FillOptions.class));
} catch (DirectoryException e) {
- Throwables.propagateIfPossible(e.getCause(), OrmException.class);
+ Throwables.throwIfInstanceOf(e.getCause(), OrmException.class);
throw new OrmException(e);
}
return info;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutName.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutName.java
index e0b69a6..74c07e8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutName.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutName.java
@@ -15,6 +15,7 @@
package com.google.gerrit.server.account;
import com.google.common.base.Strings;
+import com.google.gerrit.extensions.client.AccountFieldName;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.DefaultInput;
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
@@ -22,7 +23,6 @@
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.reviewdb.client.Account.FieldName;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
@@ -74,7 +74,7 @@
input = new Input();
}
- if (!realm.allowsEdit(FieldName.FULL_NAME)) {
+ if (!realm.allowsEdit(AccountFieldName.FULL_NAME)) {
throw new MethodNotAllowedException("realm does not allow editing name");
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutUsername.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutUsername.java
index e9dc393..29168ed 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutUsername.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutUsername.java
@@ -15,13 +15,13 @@
package com.google.gerrit.server.account;
import com.google.gerrit.common.errors.NameAlreadyUsedException;
+import com.google.gerrit.extensions.client.AccountFieldName;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.DefaultInput;
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.account.PutUsername.Input;
@@ -64,7 +64,7 @@
throw new AuthException("not allowed to set username");
}
- if (!realm.allowsEdit(Account.FieldName.USER_NAME)) {
+ if (!realm.allowsEdit(AccountFieldName.USER_NAME)) {
throw new MethodNotAllowedException("realm does not allow editing username");
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/Realm.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/Realm.java
index 85fde4e..627f529 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/Realm.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/Realm.java
@@ -14,6 +14,7 @@
package com.google.gerrit.server.account;
+import com.google.gerrit.extensions.client.AccountFieldName;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.server.IdentifiedUser;
@@ -21,10 +22,10 @@
public interface Realm {
/** Can the end-user modify this field of their own account? */
- boolean allowsEdit(Account.FieldName field);
+ boolean allowsEdit(AccountFieldName field);
/** Returns the account fields that the end-user can modify. */
- Set<Account.FieldName> getEditableFields();
+ Set<AccountFieldName> getEditableFields();
AuthRequest authenticate(AuthRequest who) throws AccountException;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/config/ServerImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/config/ServerImpl.java
index 8339ecf..f433d2b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/config/ServerImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/config/ServerImpl.java
@@ -18,10 +18,12 @@
import com.google.gerrit.extensions.api.config.Server;
import com.google.gerrit.extensions.client.DiffPreferencesInfo;
import com.google.gerrit.extensions.client.GeneralPreferencesInfo;
+import com.google.gerrit.extensions.common.ServerInfo;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.server.config.ConfigResource;
import com.google.gerrit.server.config.GetDiffPreferences;
import com.google.gerrit.server.config.GetPreferences;
+import com.google.gerrit.server.config.GetServerInfo;
import com.google.gerrit.server.config.SetDiffPreferences;
import com.google.gerrit.server.config.SetPreferences;
import com.google.inject.Inject;
@@ -37,16 +39,19 @@
private final SetPreferences setPreferences;
private final GetDiffPreferences getDiffPreferences;
private final SetDiffPreferences setDiffPreferences;
+ private final GetServerInfo getServerInfo;
@Inject
ServerImpl(GetPreferences getPreferences,
SetPreferences setPreferences,
GetDiffPreferences getDiffPreferences,
- SetDiffPreferences setDiffPreferences) {
+ SetDiffPreferences setDiffPreferences,
+ GetServerInfo getServerInfo) {
this.getPreferences = getPreferences;
this.setPreferences = setPreferences;
this.getDiffPreferences = getDiffPreferences;
this.setDiffPreferences = setDiffPreferences;
+ this.getServerInfo = getServerInfo;
}
@Override
@@ -55,6 +60,15 @@
}
@Override
+ public ServerInfo getInfo() throws RestApiException {
+ try {
+ return getServerInfo.apply(new ConfigResource());
+ } catch (IOException e) {
+ throw new RestApiException("Cannot get server info", e);
+ }
+ }
+
+ @Override
public GeneralPreferencesInfo getDefaultPreferences()
throws RestApiException {
try {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java
index 7f5f2d2..4cb96b3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java
@@ -14,8 +14,8 @@
package com.google.gerrit.server.args4j;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.account.AccountException;
import com.google.gerrit.server.account.AccountManager;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java
index 3567811..354dc62 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java
@@ -154,8 +154,8 @@
}
});
} catch (PrivilegedActionException e) {
- Throwables.propagateIfPossible(e.getException(), NamingException.class);
- Throwables.propagateIfPossible(e.getException(), RuntimeException.class);
+ Throwables.throwIfInstanceOf(e.getException(), NamingException.class);
+ Throwables.throwIfInstanceOf(e.getException(), RuntimeException.class);
LdapRealm.log.warn("Internal error", e.getException());
return null;
} finally {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java
index 8dc7177..3dddf4d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapAuthBackend.java
@@ -14,7 +14,7 @@
package com.google.gerrit.server.auth.ldap;
-import com.google.gerrit.reviewdb.client.AuthType;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.server.account.AccountException;
import com.google.gerrit.server.auth.AuthBackend;
import com.google.gerrit.server.auth.AuthException;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
index 30b08a6..603efe0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
@@ -21,10 +21,11 @@
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.gerrit.common.data.ParameterizedString;
+import com.google.gerrit.extensions.client.AccountFieldName;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountExternalId;
import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.account.AbstractRealm;
import com.google.gerrit.server.account.AccountException;
@@ -67,7 +68,7 @@
private final AuthConfig authConfig;
private final EmailExpander emailExpander;
private final LoadingCache<String, Optional<Account.Id>> usernameCache;
- private final Set<Account.FieldName> readOnlyAccountFields;
+ private final Set<AccountFieldName> readOnlyAccountFields;
private final boolean fetchMemberOfEagerly;
private final Config config;
@@ -91,13 +92,13 @@
this.readOnlyAccountFields = new HashSet<>();
if (optdef(config, "accountFullName", "DEFAULT") != null) {
- readOnlyAccountFields.add(Account.FieldName.FULL_NAME);
+ readOnlyAccountFields.add(AccountFieldName.FULL_NAME);
}
if (optdef(config, "accountSshUserName", "DEFAULT") != null) {
- readOnlyAccountFields.add(Account.FieldName.USER_NAME);
+ readOnlyAccountFields.add(AccountFieldName.USER_NAME);
}
if (!authConfig.isAllowRegisterNewEmail()) {
- readOnlyAccountFields.add(Account.FieldName.REGISTER_NEW_EMAIL);
+ readOnlyAccountFields.add(AccountFieldName.REGISTER_NEW_EMAIL);
}
fetchMemberOfEagerly = optional(config, "fetchMemberOfEagerly", true);
@@ -196,7 +197,7 @@
}
@Override
- public boolean allowsEdit(final Account.FieldName field) {
+ public boolean allowsEdit(final AccountFieldName field) {
return !readOnlyAccountFields.contains(field);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java
index cf9000d..94a3ac2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/oauth/OAuthRealm.java
@@ -17,9 +17,9 @@
import com.google.common.base.Strings;
import com.google.gerrit.extensions.auth.oauth.OAuthLoginProvider;
import com.google.gerrit.extensions.auth.oauth.OAuthUserInfo;
+import com.google.gerrit.extensions.client.AccountFieldName;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Account.FieldName;
import com.google.gerrit.server.account.AbstractRealm;
import com.google.gerrit.server.account.AccountException;
import com.google.gerrit.server.account.AccountManager;
@@ -37,7 +37,7 @@
@Singleton
public class OAuthRealm extends AbstractRealm {
private final DynamicMap<OAuthLoginProvider> loginProviders;
- private final Set<FieldName> editableAccountFields;
+ private final Set<AccountFieldName> editableAccountFields;
@Inject
OAuthRealm(DynamicMap<OAuthLoginProvider> loginProviders,
@@ -45,15 +45,15 @@
this.loginProviders = loginProviders;
this.editableAccountFields = new HashSet<>();
if (config.getBoolean("oauth", null, "allowEditFullName", false)) {
- editableAccountFields.add(FieldName.FULL_NAME);
+ editableAccountFields.add(AccountFieldName.FULL_NAME);
}
if (config.getBoolean("oauth", null, "allowRegisterNewEmail", false)) {
- editableAccountFields.add(FieldName.REGISTER_NEW_EMAIL);
+ editableAccountFields.add(AccountFieldName.REGISTER_NEW_EMAIL);
}
}
@Override
- public boolean allowsEdit(FieldName field) {
+ public boolean allowsEdit(AccountFieldName field) {
return editableAccountFields.contains(field);
}
@@ -105,12 +105,12 @@
}
if (!Strings.isNullOrEmpty(userInfo.getEmailAddress())
&& (Strings.isNullOrEmpty(who.getUserName())
- || !allowsEdit(FieldName.REGISTER_NEW_EMAIL))) {
+ || !allowsEdit(AccountFieldName.REGISTER_NEW_EMAIL))) {
who.setEmailAddress(userInfo.getEmailAddress());
}
if (!Strings.isNullOrEmpty(userInfo.getDisplayName())
&& (Strings.isNullOrEmpty(who.getDisplayName())
- || !allowsEdit(FieldName.FULL_NAME))) {
+ || !allowsEdit(AccountFieldName.FULL_NAME))) {
who.setDisplayName(userInfo.getDisplayName());
}
return who;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
index a6c2edf..ab92a97 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeJson.java
@@ -267,7 +267,7 @@
} catch (PatchListNotAvailableException | GpgException | OrmException
| IOException | RuntimeException e) {
if (!has(CHECK)) {
- Throwables.propagateIfPossible(e, OrmException.class);
+ Throwables.throwIfInstanceOf(e, OrmException.class);
throw new OrmException(e);
}
return checkOnly(cd);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java
index 508d380..e805ad0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java
@@ -47,7 +47,6 @@
import com.google.gerrit.server.patch.PatchSetInfoFactory;
import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.ssh.NoSshInfo;
-import com.google.gerrit.server.ssh.SshInfo;
import com.google.gwtorm.server.OrmException;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
@@ -91,7 +90,6 @@
private final ChangeControl origCtl;
// Fields exposed as setters.
- private SshInfo sshInfo;
private String message;
private CommitValidators.Policy validatePolicy =
CommitValidators.Policy.GERRIT;
@@ -144,11 +142,6 @@
return this;
}
- public PatchSetInserter setSshInfo(SshInfo sshInfo) {
- this.sshInfo = sshInfo;
- return this;
- }
-
public PatchSetInserter setValidatePolicy(CommitValidators.Policy validate) {
this.validatePolicy = checkNotNull(validate);
return this;
@@ -198,7 +191,6 @@
@Override
public void updateRepo(RepoContext ctx)
throws AuthException, ResourceConflictException, IOException, OrmException {
- init();
validate(ctx);
ctx.addRefUpdate(new ReceiveCommand(ObjectId.zeroId(),
commit, getPatchSetId().toRefName(), ReceiveCommand.Type.CREATE));
@@ -282,17 +274,11 @@
}
}
- private void init() {
- if (sshInfo == null) {
- sshInfo = new NoSshInfo();
- }
- }
-
private void validate(RepoContext ctx)
throws AuthException, ResourceConflictException, IOException,
OrmException {
CommitValidators cv = commitValidatorsFactory.create(
- origCtl.getRefControl(), sshInfo, ctx.getRepository());
+ origCtl.getRefControl(), new NoSshInfo(), ctx.getRepository());
if (!origCtl.canAddPatchSet(ctx.getDb())) {
throw new AuthException("cannot add patch set");
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AgreementJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AgreementJson.java
new file mode 100644
index 0000000..be5cdd4
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AgreementJson.java
@@ -0,0 +1,73 @@
+// Copyright (C) 2016 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.config;
+
+import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.AgreementInfo;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.GroupControl;
+import com.google.gerrit.server.group.GroupJson;
+import com.google.gerrit.server.group.GroupResource;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AgreementJson {
+ private static final Logger log =
+ LoggerFactory.getLogger(AgreementJson.class);
+
+ private final Provider<IdentifiedUser> self;
+ private final IdentifiedUser.GenericFactory identifiedUserFactory;
+ private final GroupControl.GenericFactory genericGroupControlFactory;
+ private final GroupJson groupJson;
+
+ @Inject
+ AgreementJson(Provider<IdentifiedUser> self,
+ IdentifiedUser.GenericFactory identifiedUserFactory,
+ GroupControl.GenericFactory genericGroupControlFactory,
+ GroupJson groupJson) {
+ this.self = self;
+ this.identifiedUserFactory = identifiedUserFactory;
+ this.genericGroupControlFactory = genericGroupControlFactory;
+ this.groupJson = groupJson;
+ }
+
+ public AgreementInfo format(ContributorAgreement ca) {
+ IdentifiedUser user =
+ identifiedUserFactory.create(self.get().getAccountId());
+ AgreementInfo info = new AgreementInfo();
+ info.name = ca.getName();
+ info.description = ca.getDescription();
+ info.url = ca.getAgreementUrl();
+ GroupReference autoVerifyGroup = ca.getAutoVerify();
+ if (autoVerifyGroup != null) {
+ try {
+ GroupControl gc = genericGroupControlFactory.controlFor(
+ user, autoVerifyGroup.getUUID());
+ GroupResource group = new GroupResource(gc);
+ info.autoVerifyGroup = groupJson.format(group);
+ } catch (NoSuchGroupException | OrmException e) {
+ log.warn("autoverify group \"" + autoVerifyGroup.getName() +
+ "\" does not exist, referenced in CLA \"" + ca.getName() + "\"");
+ }
+ }
+ return info;
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java
index f2fc94e..5a40a31 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java
@@ -14,8 +14,8 @@
package com.google.gerrit.server.config;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.reviewdb.client.AccountExternalId;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.server.auth.openid.OpenIdProviderPattern;
import com.google.gwtjsonrpc.server.SignedToken;
import com.google.gwtjsonrpc.server.XsrfException;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthModule.java
index 8e181a9..5b0f73d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthModule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthModule.java
@@ -14,8 +14,8 @@
package com.google.gerrit.server.config;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.server.account.DefaultRealm;
import com.google.gerrit.server.account.Realm;
import com.google.gerrit.server.auth.AuthBackend;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java
index 1dc910c..9e2ad77 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetServerInfo.java
@@ -20,6 +20,18 @@
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
+import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gerrit.extensions.common.AuthInfo;
+import com.google.gerrit.extensions.common.ChangeConfigInfo;
+import com.google.gerrit.extensions.common.DownloadInfo;
+import com.google.gerrit.extensions.common.DownloadSchemeInfo;
+import com.google.gerrit.extensions.common.GerritInfo;
+import com.google.gerrit.extensions.common.PluginConfigInfo;
+import com.google.gerrit.extensions.common.ReceiveInfo;
+import com.google.gerrit.extensions.common.ServerInfo;
+import com.google.gerrit.extensions.common.SshdInfo;
+import com.google.gerrit.extensions.common.SuggestInfo;
+import com.google.gerrit.extensions.common.UserConfigInfo;
import com.google.gerrit.extensions.config.CloneCommand;
import com.google.gerrit.extensions.config.DownloadCommand;
import com.google.gerrit.extensions.config.DownloadScheme;
@@ -28,8 +40,6 @@
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.extensions.webui.WebUiPlugin;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.server.EnableSignedPush;
import com.google.gerrit.server.account.Realm;
import com.google.gerrit.server.avatar.AvatarProvider;
@@ -38,14 +48,15 @@
import com.google.gerrit.server.change.Submit;
import com.google.gerrit.server.documentation.QueryDocumentationExecutor;
import com.google.gerrit.server.notedb.NotesMigration;
+import com.google.gerrit.server.project.ProjectCache;
import com.google.inject.Inject;
import org.eclipse.jgit.lib.Config;
import java.net.MalformedURLException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@@ -69,6 +80,8 @@
private final boolean enableSignedPush;
private final QueryDocumentationExecutor docSearcher;
private final NotesMigration migration;
+ private final ProjectCache projectCache;
+ private final AgreementJson agreementJson;
@Inject
public GetServerInfo(
@@ -86,7 +99,9 @@
DynamicItem<AvatarProvider> avatar,
@EnableSignedPush boolean enableSignedPush,
QueryDocumentationExecutor docSearcher,
- NotesMigration migration) {
+ NotesMigration migration,
+ ProjectCache projectCache,
+ AgreementJson agreementJson) {
this.config = config;
this.authConfig = authConfig;
this.realm = realm;
@@ -102,6 +117,8 @@
this.enableSignedPush = enableSignedPush;
this.docSearcher = docSearcher;
this.migration = migration;
+ this.projectCache = projectCache;
+ this.agreementJson = agreementJson;
}
@Override
@@ -134,6 +151,18 @@
info.switchAccountUrl = cfg.getSwitchAccountUrl();
info.isGitBasicAuth = toBoolean(cfg.isGitBasicAuth());
+ if (info.useContributorAgreements != null) {
+ Collection<ContributorAgreement> agreements =
+ projectCache.getAllProjects().getConfig().getContributorAgreements();
+ if (!agreements.isEmpty()) {
+ info.contributorAgreements =
+ Lists.newArrayListWithCapacity(agreements.size());
+ for (ContributorAgreement agreement: agreements) {
+ info.contributorAgreements.add(agreementJson.format(agreement));
+ }
+ }
+ }
+
switch (info.authType) {
case LDAP:
case LDAP_BIND:
@@ -322,85 +351,4 @@
private static Boolean toBoolean(boolean v) {
return v ? v : null;
}
-
- public static class ServerInfo {
- public AuthInfo auth;
- public ChangeConfigInfo change;
- public DownloadInfo download;
- public GerritInfo gerrit;
- public Boolean noteDbEnabled;
- public PluginConfigInfo plugin;
- public SshdInfo sshd;
- public SuggestInfo suggest;
- public Map<String, String> urlAliases;
- public UserConfigInfo user;
- public ReceiveInfo receive;
- }
-
- public static class AuthInfo {
- public AuthType authType;
- public Boolean useContributorAgreements;
- public List<Account.FieldName> editableAccountFields;
- public String loginUrl;
- public String loginText;
- public String switchAccountUrl;
- public String registerUrl;
- public String registerText;
- public String editFullNameUrl;
- public String httpPasswordUrl;
- public Boolean isGitBasicAuth;
- }
-
- public static class ChangeConfigInfo {
- public Boolean allowBlame;
- public Boolean allowDrafts;
- public int largeChange;
- public String replyLabel;
- public String replyTooltip;
- public int updateDelay;
- public Boolean submitWholeTopic;
- }
-
- public static class DownloadInfo {
- public Map<String, DownloadSchemeInfo> schemes;
- public List<String> archives;
- }
-
- public static class DownloadSchemeInfo {
- public String url;
- public Boolean isAuthRequired;
- public Boolean isAuthSupported;
- public Map<String, String> commands;
- public Map<String, String> cloneCommands;
- }
-
- public static class GerritInfo {
- public String allProjects;
- public String allUsers;
- public Boolean docSearch;
- public String docUrl;
- public Boolean editGpgKeys;
- public String reportBugUrl;
- public String reportBugText;
- }
-
- public static class PluginConfigInfo {
- public Boolean hasAvatars;
- public List<String> jsResourcePaths;
- }
-
- public static class SshdInfo {
- }
-
- public static class SuggestInfo {
- public int from;
- }
-
- public static class UserConfigInfo {
- public String anonymousCowardName;
- }
-
- public static class ReceiveInfo {
- public Boolean enableSignedPush;
- }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
index 6811056..297a2cf 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
@@ -34,6 +34,7 @@
import com.google.gerrit.server.change.ChangeKindCache;
import com.google.gerrit.server.change.PatchSetInserter;
import com.google.gerrit.server.git.BatchUpdate;
+import com.google.gerrit.server.git.BatchUpdate.RepoContext;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.UpdateException;
import com.google.gerrit.server.index.change.ChangeIndexer;
@@ -168,24 +169,67 @@
* @throws UpdateException
* @throws RestApiException
*/
- public void publish(ChangeEdit edit) throws NoSuchChangeException,
+ public void publish(final ChangeEdit edit) throws NoSuchChangeException,
IOException, OrmException, RestApiException, UpdateException {
Change change = edit.getChange();
try (Repository repo = gitManager.openRepository(change.getProject());
RevWalk rw = new RevWalk(repo);
- ObjectInserter inserter = repo.newObjectInserter()) {
+ ObjectInserter oi = repo.newObjectInserter()) {
PatchSet basePatchSet = edit.getBasePatchSet();
if (!basePatchSet.getId().equals(change.currentPatchSetId())) {
throw new ResourceConflictException(
"only edit for current patch set can be published");
}
- Change updatedChange =
- insertPatchSet(edit, change, repo, rw, inserter, basePatchSet,
- squashEdit(rw, inserter, edit.getEditCommit(), basePatchSet));
- // TODO(davido): This should happen in the same BatchRefUpdate.
- deleteRef(repo, edit);
- indexer.index(db.get(), updatedChange);
+ RevCommit squashed = squashEdit(rw, oi, edit.getEditCommit(), basePatchSet);
+ ChangeControl ctl =
+ changeControlFactory.controlFor(db.get(), change, edit.getUser());
+ PatchSet.Id psId =
+ ChangeUtil.nextPatchSetId(repo, change.currentPatchSetId());
+ PatchSetInserter inserter =
+ patchSetInserterFactory.create(ctl, psId, squashed);
+
+ StringBuilder message = new StringBuilder("Patch Set ")
+ .append(inserter.getPatchSetId().get())
+ .append(": ");
+
+ ProjectState project = projectCache.get(change.getDest().getParentKey());
+ // Previously checked that the base patch set is the current patch set.
+ ObjectId prior = ObjectId.fromString(basePatchSet.getRevision().get());
+ ChangeKind kind = changeKindCache.getChangeKind(project, repo, prior, squashed);
+ if (kind == ChangeKind.NO_CODE_CHANGE) {
+ message.append("Commit message was updated.");
+ } else {
+ message.append("Published edit on patch set ")
+ .append(basePatchSet.getPatchSetId())
+ .append(".");
+ }
+
+ try (BatchUpdate bu = updateFactory.create(
+ db.get(), change.getProject(), ctl.getUser(),
+ TimeUtil.nowTs())) {
+ bu.setRepository(repo, rw, oi);
+ bu.addOp(change.getId(), inserter
+ .setDraft(change.getStatus() == Status.DRAFT ||
+ basePatchSet.isDraft())
+ .setMessage(message.toString()));
+ bu.addOp(change.getId(), new BatchUpdate.Op() {
+ @Override
+ public void updateRepo(RepoContext ctx) throws Exception {
+ deleteRef(ctx.getRepository(), edit);
+ }
+ });
+ bu.execute();
+ } catch (UpdateException e) {
+ if (e.getCause() instanceof IOException && e.getMessage()
+ .equals(String.format("%s: Failed to delete ref %s: %s",
+ IOException.class.getName(), edit.getRefName(),
+ RefUpdate.Result.LOCK_FAILURE.name()))) {
+ throw new ResourceConflictException("edit ref was updated");
+ }
+ }
+
+ indexer.index(db.get(), inserter.getChange());
}
}
@@ -230,47 +274,6 @@
return writeSquashedCommit(rw, inserter, parent, edit);
}
- private Change insertPatchSet(ChangeEdit edit, Change change,
- Repository repo, RevWalk rw, ObjectInserter oi, PatchSet basePatchSet,
- RevCommit squashed) throws NoSuchChangeException, RestApiException,
- UpdateException, OrmException, IOException {
- ChangeControl ctl =
- changeControlFactory.controlFor(db.get(), change, edit.getUser());
- PatchSet.Id psId =
- ChangeUtil.nextPatchSetId(repo, change.currentPatchSetId());
- PatchSetInserter inserter =
- patchSetInserterFactory.create(ctl, psId, squashed);
-
- StringBuilder message = new StringBuilder("Patch Set ")
- .append(inserter.getPatchSetId().get())
- .append(": ");
-
- ProjectState project = projectCache.get(change.getDest().getParentKey());
- // Previously checked that the base patch set is the current patch set.
- ObjectId prior = ObjectId.fromString(basePatchSet.getRevision().get());
- ChangeKind kind = changeKindCache.getChangeKind(project, repo, prior, squashed);
- if (kind == ChangeKind.NO_CODE_CHANGE) {
- message.append("Commit message was updated.");
- } else {
- message.append("Published edit on patch set ")
- .append(basePatchSet.getPatchSetId())
- .append(".");
- }
-
- try (BatchUpdate bu = updateFactory.create(
- db.get(), change.getProject(), ctl.getUser(),
- TimeUtil.nowTs())) {
- bu.setRepository(repo, rw, oi);
- bu.addOp(change.getId(), inserter
- .setDraft(change.getStatus() == Status.DRAFT ||
- basePatchSet.isDraft())
- .setMessage(message.toString()));
- bu.execute();
- }
-
- return inserter.getChange();
- }
-
private static void deleteRef(Repository repo, ChangeEdit edit)
throws IOException {
String refName = edit.getRefName();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdate.java
index 090d99d..eb01de3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/BatchUpdate.java
@@ -464,7 +464,7 @@
throw new ResourceNotFoundException(e.getMessage(), e);
} catch (Exception e) {
- Throwables.propagateIfPossible(e);
+ Throwables.throwIfUnchecked(e);
throw new UpdateException(e);
}
}
@@ -669,7 +669,7 @@
logDebug("No objects to flush");
}
} catch (Exception e) {
- Throwables.propagateIfPossible(e, RestApiException.class);
+ Throwables.throwIfInstanceOf(e, RestApiException.class);
throw new UpdateException(e);
}
}
@@ -744,8 +744,8 @@
maybeLogSlowUpdate(startNanos, "NoteDb");
}
} catch (ExecutionException | InterruptedException e) {
- Throwables.propagateIfInstanceOf(e.getCause(), UpdateException.class);
- Throwables.propagateIfInstanceOf(e.getCause(), RestApiException.class);
+ Throwables.throwIfInstanceOf(e.getCause(), UpdateException.class);
+ Throwables.throwIfInstanceOf(e.getCause(), RestApiException.class);
throw new UpdateException(e);
} catch (OrmException | IOException e) {
throw new UpdateException(e);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java
index bd74fff..c10b279 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java
@@ -17,6 +17,7 @@
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.gerrit.audit.AuditService;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.DefaultInput;
@@ -27,7 +28,6 @@
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.AccountGroupMember;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountCache;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RepoSequence.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RepoSequence.java
index 071e12c..c47fd4f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RepoSequence.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RepoSequence.java
@@ -197,7 +197,7 @@
limit = counter + count;
acquireCount++;
} catch (ExecutionException | RetryException e) {
- Throwables.propagateIfInstanceOf(e.getCause(), OrmException.class);
+ Throwables.throwIfInstanceOf(e.getCause(), OrmException.class);
throw new OrmException(e);
} catch (IOException e) {
throw new OrmException(e);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java
index dd15cfc..ae37c01 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java
@@ -93,7 +93,7 @@
} catch (ExecutionException e) {
// If there was an error computing the result, carry it
// up to the caller so the cache knows this key is invalid.
- Throwables.propagateIfInstanceOf(e.getCause(), Exception.class);
+ Throwables.throwIfInstanceOf(e.getCause(), Exception.class);
throw new Exception(e.getMessage(), e.getCause());
}
}
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 faeaaf2..1156b91 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
@@ -260,7 +260,7 @@
} catch (ExecutionException e) {
// If there was an error computing the result, carry it
// up to the caller so the cache knows this key is invalid.
- Throwables.propagateIfInstanceOf(e.getCause(), IOException.class);
+ Throwables.throwIfInstanceOf(e.getCause(), IOException.class);
throw new IOException(e.getMessage(), e.getCause());
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
index d27d4f9..2097ebd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
@@ -148,7 +148,7 @@
} catch (ExecutionException e) {
if (!(e.getCause() instanceof RepositoryNotFoundException)) {
log.warn(String.format("Cannot read project %s", projectName.get()), e);
- Throwables.propagateIfInstanceOf(e.getCause(), IOException.class);
+ Throwables.throwIfInstanceOf(e.getCause(), IOException.class);
throw new IOException(e);
}
return null;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPattern.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPattern.java
index ed50a54..8c850fb 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPattern.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefPattern.java
@@ -49,7 +49,7 @@
try {
return exampleCache.get(refPattern);
} catch (ExecutionException e) {
- Throwables.propagateIfPossible(e.getCause());
+ Throwables.throwIfUnchecked(e.getCause());
throw new RuntimeException(e);
}
} else if (refPattern.endsWith("/*")) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/AndSource.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/AndSource.java
index 168be5d..c2b8b03 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/AndSource.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/AndSource.java
@@ -84,7 +84,7 @@
try {
return readImpl();
} catch (OrmRuntimeException err) {
- Throwables.propagateIfInstanceOf(err.getCause(), OrmException.class);
+ Throwables.throwIfInstanceOf(err.getCause(), OrmException.class);
throw new OrmException(err);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryProcessor.java
index d08f05c..70bdffb 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryProcessor.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryProcessor.java
@@ -140,7 +140,7 @@
} catch (OrmRuntimeException e) {
throw new OrmException(e.getMessage(), e);
} catch (OrmException e) {
- Throwables.propagateIfInstanceOf(e.getCause(), QueryParseException.class);
+ Throwables.throwIfInstanceOf(e.getCause(), QueryParseException.class);
throw e;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestScopePropagator.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestScopePropagator.java
index 382485e..bdbb938 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestScopePropagator.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/RequestScopePropagator.java
@@ -129,7 +129,7 @@
try {
wrapped.call();
} catch (Exception e) {
- Throwables.propagateIfPossible(e);
+ Throwables.throwIfUnchecked(e);
throw new RuntimeException(e); // Not possible.
}
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java
index 9e5b776..5fb930c 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryModule.java
@@ -18,11 +18,11 @@
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.extensions.config.FactoryModule;
import com.google.gerrit.gpg.GpgModule;
import com.google.gerrit.metrics.DisabledMetricMaker;
import com.google.gerrit.metrics.MetricMaker;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.GerritPersonIdentProvider;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommand.java
index fde3a66..4ddca0c 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/AliasCommand.java
@@ -97,7 +97,7 @@
try {
cmd.destroy();
} catch (Exception e) {
- Throwables.propagateIfPossible(e);
+ Throwables.throwIfUnchecked(e);
throw new RuntimeException(e);
}
}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java
index f2911dc..f3243c6 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java
@@ -136,7 +136,7 @@
try {
cmd.destroy();
} catch (Exception e) {
- Throwables.propagateIfPossible(e);
+ Throwables.throwIfUnchecked(e);
throw new RuntimeException(e);
}
}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java
index 24bd8c2..c88a02c 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java
@@ -153,7 +153,7 @@
try {
cmd.destroy();
} catch (Exception e) {
- Throwables.propagateIfPossible(e);
+ Throwables.throwIfUnchecked(e);
throw new RuntimeException(e);
}
}
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
index 71eed63..5790453 100644
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
+++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
@@ -19,6 +19,7 @@
import com.google.common.base.Splitter;
import com.google.gerrit.common.EventBroker;
+import com.google.gerrit.extensions.client.AuthType;
import com.google.gerrit.gpg.GpgModule;
import com.google.gerrit.httpd.auth.oauth.OAuthModule;
import com.google.gerrit.httpd.auth.openid.OpenIdModule;
@@ -29,7 +30,6 @@
import com.google.gerrit.lucene.LuceneIndexModule;
import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker;
import com.google.gerrit.pgm.util.LogFileCompressor;
-import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.server.account.InternalAccountDirectory;
import com.google.gerrit.server.cache.h2.DefaultCacheFactory;
import com.google.gerrit.server.change.ChangeCleanupRunner;
diff --git a/lib/BUCK b/lib/BUCK
index 36c5903..efdf0eb 100644
--- a/lib/BUCK
+++ b/lib/BUCK
@@ -60,16 +60,17 @@
maven_jar(
name = 'gson',
- id = 'com.google.code.gson:gson:2.6.2',
- sha1 = 'f1bc476cc167b18e66c297df599b2377131a8947',
+ id = 'com.google.code.gson:gson:2.7',
+ sha1 = '751f548c85fa49f330cecbb1875893f971b33c4e',
license = 'Apache2.0',
)
maven_jar(
name = 'guava',
- id = 'com.google.guava:guava:19.0',
- sha1 = '6ce200f6b23222af3d8abb6b6459e6c44f4bb0e9',
+ id = 'com.google.guava:guava:20.0:20160818.201422-323',
+ sha1 = '13af7470db1026c57aedd0144018e06fe79bba33',
license = 'Apache2.0',
+ repository = MAVEN_SNAPSHOT,
)
maven_jar(
diff --git a/lib/guice/BUCK b/lib/guice/BUCK
index 85471fd..1c74531 100644
--- a/lib/guice/BUCK
+++ b/lib/guice/BUCK
@@ -1,6 +1,6 @@
include_defs('//lib/maven.defs')
-VERSION = '4.0'
+VERSION = '4.1.0'
EXCLUDE = [
'META-INF/DEPENDENCIES',
'META-INF/LICENSE',
@@ -20,7 +20,7 @@
maven_jar(
name = 'guice_library',
id = 'com.google.inject:guice:' + VERSION,
- sha1 = '0f990a43d3725781b6db7cd0acf0a8b62dfd1649',
+ sha1 = 'eeb69005da379a10071aa4948c48d89250febb07',
license = 'Apache2.0',
deps = [':aopalliance'],
exclude_java_sources = True,
@@ -34,7 +34,7 @@
maven_jar(
name = 'guice-assistedinject',
id = 'com.google.inject.extensions:guice-assistedinject:' + VERSION,
- sha1 = '8fa6431da1a2187817e3e52e967535899e2e46ca',
+ sha1 = 'af799dd7e23e6fe8c988da12314582072b07edcb',
license = 'Apache2.0',
deps = [':guice'],
exclude = EXCLUDE,
@@ -43,7 +43,7 @@
maven_jar(
name = 'guice-servlet',
id = 'com.google.inject.extensions:guice-servlet:' + VERSION,
- sha1 = '4503da866f4c402b5090579b40c1c4aaefabb164',
+ sha1 = '90ac2db772d9b85e2b05417b74f7464bcc061dcb',
license = 'Apache2.0',
deps = [':guice'],
exclude = EXCLUDE,
diff --git a/plugins/download-commands b/plugins/download-commands
index 7b41f3a..3fb4fb6 160000
--- a/plugins/download-commands
+++ b/plugins/download-commands
@@ -1 +1 @@
-Subproject commit 7b41f3a413b46140b050ae5324cbbcdd467d2b3a
+Subproject commit 3fb4fb63317b6004761d1fea98a8f4d288d95409
diff --git a/plugins/hooks b/plugins/hooks
index ac87f18..c1705a7 160000
--- a/plugins/hooks
+++ b/plugins/hooks
@@ -1 +1 @@
-Subproject commit ac87f187034838e6cf8d5824b2e541cc9b3a0aa4
+Subproject commit c1705a739f117b9123e1d63aebf07d043afb0867
diff --git a/plugins/replication b/plugins/replication
index c5123d6..75af773 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit c5123d6a5604cc740d6f42485235c0d3ec141c4e
+Subproject commit 75af77375b34133e85f3ee5f1b19dac19d3f3837
diff --git a/plugins/reviewnotes b/plugins/reviewnotes
index 3f3d572..46079ec 160000
--- a/plugins/reviewnotes
+++ b/plugins/reviewnotes
@@ -1 +1 @@
-Subproject commit 3f3d572e9618f268b19cc54856deee4c96180e4c
+Subproject commit 46079ec92478ddc1e9ffd84eae22fb6af788c9fd
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.html b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.html
index b741784..1fe09e5 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.html
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.html
@@ -32,19 +32,14 @@
<template>
<style>
:host {
- display: block;
+ display: inline-block;
+ font-family: var(--font-family);
}
section {
- margin-top: 1em;
- }
- .groupLabel {
- color: #666;
- margin-bottom: .15em;
- text-align: center;
+ display: inline-block;
}
gr-button {
- display: block;
- margin-bottom: .5em;
+ margin-left: .5em;
}
gr-button:before {
content: attr(data-label);
@@ -53,6 +48,15 @@
content: attr(data-loading-label);
}
@media screen and (max-width: 50em) {
+ :host,
+ section,
+ gr-button {
+ display: block;
+ }
+ gr-button {
+ margin-bottom: .5em;
+ margin-left: 0;
+ }
.confirmDialog {
width: 90vw;
}
@@ -60,7 +64,6 @@
</style>
<div>
<section hidden$="[[!_actionCount(actions.*, _additionalActions.*)]]">
- <div class="groupLabel">Change</div>
<template is="dom-repeat" items="[[_changeActionValues]]" as="action">
<gr-button title$="[[action.title]]"
primary$="[[action.__primary]]"
@@ -73,7 +76,6 @@
</template>
</section>
<section hidden$="[[!_actionCount(_revisionActions.*, _additionalActions.*)]]">
- <div class="groupLabel">Revision</div>
<template is="dom-repeat" items="[[_revisionActionValues]]" as="action">
<gr-button title$="[[action.title]]"
primary$="[[action.__primary]]"
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
index e3f7fd2..8df807e 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
@@ -45,18 +45,16 @@
color: #666;
padding: 1em var(--default-horizontal-margin);
}
- .headerContainer {
- height: 4.1em;
- margin-bottom: .5em;
- }
.header {
align-items: center;
background-color: var(--view-background-color);
- border-bottom: 1px solid #ddd;
display: flex;
- padding: 1em var(--default-horizontal-margin);
+ padding: .65em var(--default-horizontal-margin);
z-index: 99; /* Less than gr-overlay's backdrop */
}
+ .header .download {
+ margin-right: 1em;
+ }
.header.pinned {
border-bottom-color: transparent;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
@@ -69,24 +67,11 @@
flex: 1;
font-size: 1.2em;
font-weight: bold;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
}
gr-change-star {
margin-right: .25em;
vertical-align: -.425em;
}
- .download,
- .patchSelectLabel {
- margin-left: 1em;
- }
- .header select {
- margin-left: .5em;
- }
- .header .reply {
- margin-left: var(--default-horizontal-margin);
- }
gr-reply-dialog {
width: 50em;
}
@@ -94,29 +79,19 @@
color: #999;
text-transform: capitalize;
}
- section {
- margin: 10px 0;
- padding: 10px var(--default-horizontal-margin);
- }
/* Strong specificity here is needed due to
https://github.com/Polymer/polymer/issues/2531 */
.container section.changeInfo {
- border-bottom: 1px solid #ddd;
display: flex;
- margin-top: 0;
- padding-top: 0;
+ padding: 0 var(--default-horizontal-margin);
}
.changeInfo-column:not(:last-of-type) {
margin-right: 1em;
padding-right: 1em;
}
.changeMetadata {
- border-right: 1px solid #ddd;
font-size: .9em;
}
- gr-change-actions {
- margin-top: 1em;
- }
.commitMessage {
font-family: var(--monospace-font-family);
flex: 0 0 72ch;
@@ -124,15 +99,28 @@
margin-bottom: 1em;
overflow-x: hidden;
}
- .commitMessage h4 {
- font-family: var(--font-family);
- font-weight: bold;
- margin-bottom: .25em;
- }
.commitMessage gr-linked-text {
--linked-text-white-space: pre;
overflow: auto;
}
+ .editCommitMessage {
+ margin-top: 1em;
+ }
+ .commitActions {
+ border-bottom: 1px solid #ddd;
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: .5em;
+ padding-bottom: .5em;
+ }
+ .reply {
+ margin-right: .5em;
+ }
+ .mainChangeInfo {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ }
.commitAndRelated {
align-content: flex-start;
display: flex;
@@ -144,14 +132,19 @@
font-size: .9em;
overflow: hidden;
}
+ .patchInfo {
+ border: 1px solid #ddd;
+ margin: 1em var(--default-horizontal-margin);
+ }
+ .patchInfo-header,
gr-file-list {
- margin-bottom: 1em;
- padding: 0 var(--default-horizontal-margin);
+ padding: .5em calc(var(--default-horizontal-margin) / 2);
+ }
+ .patchInfo-header {
+ background-color: #f6f6f6;
+ border-bottom: 1px solid #ebebeb;
}
@media screen and (max-width: 50em) {
- .headerContainer {
- height: 5.15em;
- }
.header {
align-items: flex-start;
flex-direction: column;
@@ -163,30 +156,17 @@
.header-title {
font-size: 1.1em;
}
- .header-actions {
- align-items: center;
- display: flex;
- justify-content: space-between;
- margin-top: .5em;
- }
gr-reply-dialog {
min-width: initial;
width: 90vw;
}
- .download {
+ .downloadContainer {
display: none;
}
- .patchSelectLabel {
- margin-left: 0;
- margin-right: .5em;
- }
- .header select {
- margin-left: 0;
- margin-right: .5em;
- }
- .header .reply {
- margin-left: 0;
- margin-right: .5em;
+ .reply {
+ display: block;
+ margin-right: 0;
+ margin-bottom: .5em;
}
.changeInfo-column:not(:last-of-type) {
margin-right: 0;
@@ -207,6 +187,9 @@
margin-top: .25em;
max-width: none;
}
+ .commitActions {
+ flex-direction: column;
+ }
.commitMessage {
flex: initial;
margin-right: 0;
@@ -215,35 +198,13 @@
</style>
<div class="container loading" hidden$="{{!_loading}}">Loading...</div>
<div class="container" hidden$="{{_loading}}">
- <div class="headerContainer">
- <div class="header">
- <span class="header-title">
- <gr-change-star change="{{_change}}" hidden$="[[!_loggedIn]]"></gr-change-star>
- <a href$="[[_computeChangePermalink(_change._number)]]">[[_change._number]]</a><span>:</span>
- <span>[[_change.subject]]</span>
- <span class="changeStatus">[[_computeChangeStatus(_change, _patchRange.patchNum)]]</span>
- </span>
- <span class="header-actions">
- <gr-button hidden
- class="reply"
- primary$="[[_computeReplyButtonHighlighted(_diffDrafts.*)]]"
- hidden$="[[!_loggedIn]]"
- on-tap="_handleReplyTap">[[_replyButtonLabel]]</gr-button>
- <gr-button class="download" on-tap="_handleDownloadTap">Download</gr-button>
- <span>
- <label class="patchSelectLabel" for="patchSetSelect">Patch set</label>
- <select id="patchSetSelect" on-change="_handlePatchChange">
- <template is="dom-repeat" items="{{_allPatchSets}}" as="patchNumber">
- <option value$="[[patchNumber]]" selected$="[[_computePatchIndexIsSelected(index, _patchRange.patchNum)]]">
- <span>[[patchNumber]]</span>
- /
- <span>[[_computeLatestPatchNum(_allPatchSets)]]</span>
- </option>
- </template>
- </select>
- </span>
- </span>
- </div>
+ <div class="header">
+ <span class="header-title">
+ <gr-change-star change="{{_change}}" hidden$="[[!_loggedIn]]"></gr-change-star>
+ <a href$="[[_computeChangePermalink(_change._number)]]">[[_change._number]]</a><span>:</span>
+ <span>[[_change.subject]]</span>
+ <span class="changeStatus">[[_computeChangeStatus(_change, _patchRange.patchNum)]]</span>
+ </span>
</div>
<section class="changeInfo">
<div class="changeInfo-column changeMetadata">
@@ -254,46 +215,74 @@
mutable="[[_loggedIn]]"
on-show-reply-dialog="_handleShowReplyDialog">
</gr-change-metadata>
- <gr-change-actions id="actions"
- change="[[_change]]"
- actions="[[_change.actions]]"
- change-num="[[_changeNum]]"
- patch-num="[[_patchRange.patchNum]]"
- commit-info="[[_commitInfo]]"
- on-reload-change="_handleReloadChange"></gr-change-actions>
</div>
- <div class="changeInfo-column commitAndRelated">
- <div class="commitMessage">
- <h4>
- Commit message
+ <div class="changeInfo-column mainChangeInfo">
+ <div class="commitActions" hidden$="[[!_loggedIn]]"">
+ <gr-button
+ class="reply"
+ secondary
+ on-tap="_handleReplyTap">[[_replyButtonLabel]]</gr-button>
+ <gr-change-actions id="actions"
+ change="[[_change]]"
+ actions="[[_change.actions]]"
+ change-num="[[_changeNum]]"
+ patch-num="[[_patchRange.patchNum]]"
+ commit-info="[[_commitInfo]]"
+ on-reload-change="_handleReloadChange"></gr-change-actions>
+ </div>
+ <div class="commitAndRelated">
+ <div class="commitMessage">
+ <gr-editable-content id="commitMessageEditor"
+ editing="[[_editingCommitMessage]]"
+ content="{{_commitInfo.message}}">
+ <gr-linked-text pre
+ content="[[_commitInfo.message]]"
+ config="[[_projectConfig.commentlinks]]"></gr-linked-text>
+ </gr-editable-content>
<gr-button link
+ class="editCommitMessage"
on-tap="_handleEditCommitMessage"
hidden$="[[_hideEditCommitMessage]]">Edit</gr-button>
- </h4>
- <gr-editable-content id="commitMessageEditor"
- editing="[[_editingCommitMessage]]"
- content="{{_commitInfo.message}}">
- <gr-linked-text pre
- content="[[_commitInfo.message]]"
- config="[[_projectConfig.commentlinks]]"></gr-linked-text>
- </gr-editable-content>
- </div>
- <div class="relatedChanges">
- <gr-related-changes-list id="relatedChanges"
- change="[[_change]]"
- patch-num="[[_patchRange.patchNum]]"></gr-related-changes-list>
+ </div>
+ <div class="relatedChanges">
+ <gr-related-changes-list id="relatedChanges"
+ change="[[_change]]"
+ patch-num="[[_patchRange.patchNum]]"></gr-related-changes-list>
+ </div>
</div>
</div>
</section>
- <gr-file-list id="fileList"
- change="[[_change]]"
- change-num="[[_changeNum]]"
- patch-range="[[_patchRange]]"
- comments="[[_comments]]"
- drafts="[[_diffDrafts]]"
- revisions="[[_change.revisions]]"
- projectConfig="[[_projectConfig]]"
- selected-index="{{viewState.selectedFileIndex}}"></gr-file-list>
+ <section class="patchInfo">
+ <div class="patchInfo-header">
+ <span>
+ <label class="patchSelectLabel" for="patchSetSelect">Patch set</label>
+ <select id="patchSetSelect" on-change="_handlePatchChange">
+ <template is="dom-repeat" items="{{_allPatchSets}}" as="patchNumber">
+ <option value$="[[patchNumber]]" selected$="[[_computePatchIndexIsSelected(index, _patchRange.patchNum)]]">
+ <span>[[patchNumber]]</span>
+ /
+ <span>[[_computeLatestPatchNum(_allPatchSets)]]</span>
+ </option>
+ </template>
+ </select>
+ </span>
+ <span class="downloadContainer">
+ /
+ <gr-button link
+ class="download"
+ on-tap="_handleDownloadTap">Download</gr-button>
+ </span>
+ </div>
+ <gr-file-list id="fileList"
+ change="[[_change]]"
+ change-num="[[_changeNum]]"
+ patch-range="[[_patchRange]]"
+ comments="[[_comments]]"
+ drafts="[[_diffDrafts]]"
+ revisions="[[_change.revisions]]"
+ projectConfig="[[_projectConfig]]"
+ selected-index="{{viewState.selectedFileIndex}}"></gr-file-list>
+ </section>
<gr-messages-list id="messageList"
change-num="[[_changeNum]]"
messages="[[_change.messages]]"
@@ -312,6 +301,7 @@
on-close="_handleDownloadDialogClose"></gr-download-dialog>
</gr-overlay>
<gr-overlay id="replyOverlay"
+ no-cancel-on-outside-click
on-iron-overlay-opened="_handleReplyOverlayOpen"
with-backdrop>
<gr-reply-dialog id="replyDialog"
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
index 84644da..c7cb978 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
@@ -78,8 +78,6 @@
value: false,
},
_loading: Boolean,
- _headerContainerEl: Object,
- _headerEl: Object,
_projectConfig: Object,
_replyButtonLabel: {
type: String,
@@ -98,10 +96,6 @@
'_paramsAndChangeChanged(params, _change)',
],
- ready: function() {
- this._headerEl = this.$$('.header');
- },
-
attached: function() {
this._getLoggedIn().then(function(loggedIn) {
this._loggedIn = loggedIn;
@@ -114,34 +108,6 @@
this._handleCommitMessageSave.bind(this));
this.addEventListener('editable-content-cancel',
this._handleCommitMessageCancel.bind(this));
- this.listen(window, 'scroll', '_handleBodyScroll');
- },
-
- detached: function() {
- this.unlisten(window, 'scroll', '_handleBodyScroll');
- },
-
- _handleBodyScroll: function(e) {
- var containerEl = this._headerContainerEl ||
- this.$$('.headerContainer');
-
- // Calculate where the header is relative to the window.
- var top = containerEl.offsetTop;
- for (var offsetParent = containerEl.offsetParent;
- offsetParent;
- offsetParent = offsetParent.offsetParent) {
- top += offsetParent.offsetTop;
- }
- // The element may not be displayed yet, in which case do nothing.
- if (top == 0) { return; }
-
- this._headerEl.classList.toggle('pinned', window.scrollY >= top);
- },
-
- _resetHeaderEl: function() {
- var el = this._headerEl || this.$$('.header');
- this._headerEl = el;
- el.classList.remove('pinned');
},
_handleEditCommitMessage: function(e) {
@@ -327,9 +293,6 @@
};
this._reload().then(function() {
- this.$.messageList.topMargin = this._headerEl.offsetHeight;
- this.$.fileList.topMargin = this._headerEl.offsetHeight;
-
// Allow the message list to render before scrolling.
this.async(function() {
this._maybeScrollToMessage();
@@ -484,11 +447,6 @@
return result;
},
- _computeReplyButtonHighlighted: function(changeRecord) {
- var drafts = (changeRecord && changeRecord.base) || {};
- return Object.keys(drafts).length > 0;
- },
-
_computeReplyButtonLabel: function(changeRecord) {
var drafts = (changeRecord && changeRecord.base) || {};
var draftCount = Object.keys(drafts).reduce(function(count, file) {
@@ -640,8 +598,6 @@
]);
}.bind(this);
- this._resetHeaderEl();
-
if (this._patchRange.patchNum) {
return reloadPatchNumDependentResources().then(function() {
return detailCompletes;
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
index a756d11..42f3e29 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.html
@@ -111,22 +111,21 @@
});
});
- test('reply button is highlighted when there are drafts', function() {
+ test('reply button has updated count when there are drafts', function() {
var replyButton = element.$$('gr-button.reply');
assert.ok(replyButton);
- assert.isFalse(replyButton.hasAttribute('primary'));
+ assert.equal(replyButton.textContent, 'Reply');
element._diffDrafts = null;
- assert.isFalse(replyButton.hasAttribute('primary'));
+ assert.equal(replyButton.textContent, 'Reply');
element._diffDrafts = {};
- assert.isFalse(replyButton.hasAttribute('primary'));
+ assert.equal(replyButton.textContent, 'Reply');
element._diffDrafts = {
'file1.txt': [{}],
'file2.txt': [{}, {}],
};
- assert.isTrue(replyButton.hasAttribute('primary'));
assert.equal(replyButton.textContent, 'Reply (3)');
});
@@ -185,17 +184,17 @@
labels: {},
};
flushAsynchronousOperations();
- var selectEl = element.$$('.header select');
+ var selectEl = element.$$('.patchInfo-header select');
assert.ok(selectEl);
- var optionEls =
- Polymer.dom(element.root).querySelectorAll('.header option');
+ var optionEls = Polymer.dom(element.root).querySelectorAll(
+ '.patchInfo-header option');
assert.equal(optionEls.length, 4);
- assert.isFalse(
- element.$$('.header option[value="1"]').hasAttribute('selected'));
- assert.isTrue(
- element.$$('.header option[value="2"]').hasAttribute('selected'));
- assert.isFalse(
- element.$$('.header option[value="3"]').hasAttribute('selected'));
+ assert.isFalse(element.$$('.patchInfo-header option[value="1"]')
+ .hasAttribute('selected'));
+ assert.isTrue(element.$$('.patchInfo-header option[value="2"]')
+ .hasAttribute('selected'));
+ assert.isFalse(element.$$('.patchInfo-header option[value="3"]')
+ .hasAttribute('selected'));
assert.equal(optionEls[3].value, 13);
var showStub = sinon.stub(page, 'show');
@@ -237,17 +236,17 @@
labels: {},
};
flushAsynchronousOperations();
- var selectEl = element.$$('.header select');
+ var selectEl = element.$$('.patchInfo-header select');
assert.ok(selectEl);
- var optionEls =
- Polymer.dom(element.root).querySelectorAll('.header option');
+ var optionEls = Polymer.dom(element.root).querySelectorAll(
+ '.patchInfo-header option');
assert.equal(optionEls.length, 4);
- assert.isFalse(
- element.$$('.header option[value="1"]').hasAttribute('selected'));
- assert.isTrue(
- element.$$('.header option[value="2"]').hasAttribute('selected'));
- assert.isFalse(
- element.$$('.header option[value="3"]').hasAttribute('selected'));
+ assert.isFalse(element.$$('.patchInfo-header option[value="1"]')
+ .hasAttribute('selected'));
+ assert.isTrue(element.$$('.patchInfo-header option[value="2"]')
+ .hasAttribute('selected'));
+ assert.isFalse(element.$$('.patchInfo-header option[value="3"]')
+ .hasAttribute('selected'));
assert.equal(optionEls[3].value, 13);
var showStub = sinon.stub(page, 'show');
@@ -354,7 +353,7 @@
test('topic is coalesced to null', function(done) {
sinon.stub(element, '_changeChanged');
- sinon.stub(element.$.restAPI, 'getChangeDetail', function(num) {
+ sinon.stub(element.$.restAPI, 'getChangeDetail', function() {
return Promise.resolve({id: '123456789', labels: {}});
});
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
index ef5ceed..201671d 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
@@ -181,9 +181,7 @@
</template>
<gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
<gr-storage id="storage"></gr-storage>
- <gr-diff-cursor
- id="cursor"
- fold-offset-top="[[topMargin]]"></gr-diff-cursor>
+ <gr-diff-cursor id="cursor"></gr-diff-cursor>
</template>
<script src="gr-file-list.js"></script>
</dom-module>
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
index 225d8b3..7bbeab1 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.js
@@ -27,7 +27,6 @@
drafts: Object,
revisions: Object,
projectConfig: Object,
- topMargin: Number,
selectedIndex: {
type: Number,
notify: true,
@@ -352,7 +351,7 @@
}
// Don't scroll if it's already in view.
- if (top > window.pageYOffset + this.topMargin &&
+ if (top > window.pageYOffset &&
top < window.pageYOffset + window.innerHeight - el.clientHeight) {
return;
}
diff --git a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.js b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.js
index e7a0573..875bf2b 100644
--- a/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.js
+++ b/polygerrit-ui/app/elements/change/gr-messages-list/gr-messages-list.js
@@ -29,7 +29,6 @@
},
comments: Object,
projectConfig: Object,
- topMargin: Number,
showReplyButtons: {
type: Boolean,
value: false,
@@ -52,7 +51,7 @@
offsetParent = offsetParent.offsetParent) {
top += offsetParent.offsetTop;
}
- window.scrollTo(0, top - this.topMargin);
+ window.scrollTo(0, top);
this._highlightEl(el);
},
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
index 930c8cf..916726fd 100644
--- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
+++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
@@ -45,34 +45,38 @@
.links {
margin-left: 1em;
}
- .links ul {
+ .links .menuContainer {
display: none;
}
.links > li {
cursor: default;
display: inline-block;
margin-left: 1em;
- padding: .4em 0;
+ padding: .5em 0;
position: relative;
}
- .links li:hover ul {
+ .links li:hover .menuContainer,
+ .links li:active .menuContainer {
background-color: #fff;
+ border-radius: 3px;
box-shadow: 0 1px 1px rgba(0, 0, 0, .3);
display: block;
- left: -.75em;
+ left: -.5em;
+ padding: .5em 0;
position: absolute;
- top: 2em;
+ top: 2.45em;
z-index: 1000;
}
.links li ul li a:link,
.links li ul li a:visited {
color: #00e;
display: block;
- padding: .5em .75em;
+ padding: .3em 1em;
text-decoration: none;
white-space: nowrap;
}
- .links li ul li:hover a {
+ .links li ul li:hover a,
+ .links li ul li:active a {
background-color: var(--selection-background-color);
}
.linksTitle {
@@ -87,7 +91,8 @@
height: 0;
position: absolute;
right: 0;
- top: calc(50% - .1em);
+ top: calc(50% - .05em);
+ transition: border-top-color 200ms;
width: 0;
}
.links li:hover .downArrow {
@@ -137,11 +142,13 @@
<span class="linksTitle">
[[linkGroup.title]] <i class="downArrow"></i>
</span>
- <ul>
- <template is="dom-repeat" items="[[linkGroup.links]]" as="link">
- <li><a href$="[[link.url]]">[[link.name]]</a></li>
- </template>
- </ul>
+ <div class="menuContainer">
+ <ul>
+ <template is="dom-repeat" items="[[linkGroup.links]]" as="link">
+ <li><a href$="[[link.url]]">[[link.name]]</a></li>
+ </template>
+ </ul>
+ </div>
</li>
</template>
</ul>
diff --git a/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.html b/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.html
new file mode 100644
index 0000000..7653655
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.html
@@ -0,0 +1,21 @@
+<!--
+Copyright (C) 2016 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.
+-->
+
+<link rel="import" href="../../../bower_components/polymer/polymer.html">
+
+<dom-module id="gr-reporting">
+ <script src="gr-reporting.js"></script>
+</dom-module>
diff --git a/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.js b/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.js
new file mode 100644
index 0000000..c7180a7
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting.js
@@ -0,0 +1,95 @@
+// Copyright (C) 2016 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.
+(function() {
+ 'use strict';
+
+ var APP_STARTED = 'App Started';
+ var PAGE_LOADED = 'Page Loaded';
+ var TIMING_EVENT = 'timing-report';
+ var DEFAULT_CATEGORY = 'UI Latency';
+ var DEFAULT_TYPE = 'timing';
+
+ Polymer({
+ is: 'gr-reporting',
+
+ properties: {
+ _baselines: {
+ type: Array,
+ value: function() { return {}; },
+ }
+ },
+
+ get performanceTiming() {
+ return window.performance.timing;
+ },
+
+ now: function() {
+ return Math.round(10 * window.performance.now()) / 10;
+ },
+
+ reporter: function(type, category, eventName, eventValue) {
+ eventValue = eventValue;
+ var detail = {
+ type: type,
+ category: category,
+ name: eventName,
+ value: eventValue,
+ };
+ document.dispatchEvent(
+ new CustomEvent(TIMING_EVENT, {detail: detail}));
+ console.log(eventName + ': ' + eventValue);
+ },
+
+ /**
+ * User-perceived app start time, should be reported when the app is ready.
+ */
+ appStarted: function() {
+ var startTime =
+ new Date().getTime() - this.performanceTiming.navigationStart;
+ this.reporter(
+ DEFAULT_TYPE, DEFAULT_CATEGORY, APP_STARTED, startTime);
+ },
+
+ /**
+ * Page load time, should be reported at any time after navigation.
+ */
+ pageLoaded: function() {
+ if (this.performanceTiming.loadEventEnd === 0) {
+ console.error('pageLoaded should be called after window.onload');
+ this.async(this.pageLoaded, 100);
+ } else {
+ var loadTime = this.performanceTiming.loadEventEnd -
+ this.performanceTiming.navigationStart;
+ this.reporter(DEFAULT_TYPE, DEFAULT_CATEGORY, PAGE_LOADED, loadTime);
+ }
+ },
+
+ /**
+ * Reset named timer.
+ */
+ time: function(name) {
+ this._baselines[name] = this.now();
+ },
+
+ /**
+ * Finish named timer and report it to server.
+ */
+ timeEnd: function(name) {
+ var baseTime = this._baselines[name] || 0;
+ var time = this.now() - baseTime;
+ this.reporter(DEFAULT_TYPE, DEFAULT_CATEGORY, name, time);
+ delete this._baselines[name];
+ },
+ });
+})();
diff --git a/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting_test.html b/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting_test.html
new file mode 100644
index 0000000..e9226b8
--- /dev/null
+++ b/polygerrit-ui/app/elements/core/gr-reporting/gr-reporting_test.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<!--
+Copyright (C) 2016 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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-reporting</title>
+
+<script src="../../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
+<script src="../../../bower_components/web-component-tester/browser.js"></script>
+
+<link rel="import" href="gr-reporting.html">
+
+<test-fixture id="basic">
+ <template>
+ <gr-reporting></gr-reporting>
+ </template>
+</test-fixture>
+
+<script>
+ suite('gr-reporting tests', function() {
+ var element;
+ var sandbox;
+ var clock;
+ var fakePerformance;
+
+ var NOW_TIME = 100;
+
+ setup(function() {
+ sandbox = sinon.sandbox.create();
+ clock = sinon.useFakeTimers(NOW_TIME);
+ element = fixture('basic');
+ fakePerformance = {
+ navigationStart: 1,
+ loadEventEnd: 2,
+ };
+ sinon.stub(element, 'performanceTiming',
+ {get: function() {return fakePerformance;}});
+ sandbox.stub(element, 'reporter');
+ });
+ teardown(function() {
+ sandbox.restore();
+ clock.restore();
+ });
+
+ test('appStarted', function() {
+ element.appStarted();
+ assert.isTrue(
+ element.reporter.calledWithExactly(
+ 'timing', 'UI Latency', 'App Started',
+ NOW_TIME - fakePerformance.navigationStart
+ ));
+ });
+
+ test('pageLoaded', function() {
+ element.pageLoaded();
+ assert.isTrue(
+ element.reporter.calledWithExactly(
+ 'timing', 'UI Latency', 'Page Loaded',
+ fakePerformance.loadEventEnd - fakePerformance.navigationStart)
+ );
+ });
+
+ test('time and timeEnd', function() {
+ var nowStub = sinon.stub(element, 'now').returns(0);
+ element.time('foo');
+ nowStub.returns(1);
+ element.time('bar');
+ nowStub.returns(2);
+ element.timeEnd('bar');
+ nowStub.returns(3.123);
+ element.timeEnd('foo');
+ assert.isTrue(element.reporter.calledWithExactly(
+ 'timing', 'UI Latency', 'foo', 3.123
+ ));
+ assert.isTrue(element.reporter.calledWithExactly(
+ 'timing', 'UI Latency', 'bar', 1
+ ));
+ });
+ });
+</script>
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router.js b/polygerrit-ui/app/elements/core/gr-router/gr-router.js
index d11d438..8441372 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router.js
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.js
@@ -18,8 +18,12 @@
// custom element having the id "app", but it is made explicit here.
var app = document.querySelector('#app');
var restAPI = document.createElement('gr-rest-api-interface');
+ var reporting = document.createElement('gr-reporting');
window.addEventListener('WebComponentsReady', function() {
+ reporting.timeEnd('WebComponentsReady');
+ reporting.pageLoaded();
+
// Middleware
page(function(ctx, next) {
document.body.scrollTop = 0;
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html
index ec19a2d..18c0602 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.html
@@ -14,10 +14,12 @@
limitations under the License.
-->
<link rel="import" href="../../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../core/gr-reporting/gr-reporting.html">
<link rel="import" href="../gr-diff-comment-thread/gr-diff-comment-thread.html">
<link rel="import" href="../gr-diff-processor/gr-diff-processor.html">
<link rel="import" href="../gr-ranged-comment-layer/gr-ranged-comment-layer.html">
<link rel="import" href="../gr-syntax-layer/gr-syntax-layer.html">
+
<dom-module id="gr-diff-builder">
<template>
<div class="contentWrapper">
@@ -32,6 +34,7 @@
<gr-diff-processor
id="processor"
groups="{{_groups}}"></gr-diff-processor>
+ <gr-reporting id="reporting"></gr-reporting>
</template>
<script src="../gr-diff/gr-diff-line.js"></script>
<script src="../gr-diff/gr-diff-group.js"></script>
@@ -111,17 +114,19 @@
this._clearDiffContent();
- console.time(TimingLabel.TOTAL);
- console.time(TimingLabel.CONTENT);
+ var reporting = this.$.reporting;
+
+ reporting.time(TimingLabel.TOTAL);
+ reporting.time(TimingLabel.CONTENT);
return this.$.processor.process(this.diff.content).then(function() {
if (this.isImageDiff) {
this._builder.renderDiffImages();
}
- console.timeEnd(TimingLabel.CONTENT);
- console.time(TimingLabel.SYNTAX);
+ reporting.timeEnd(TimingLabel.CONTENT);
+ reporting.time(TimingLabel.SYNTAX);
this.$.syntaxLayer.process().then(function() {
- console.timeEnd(TimingLabel.SYNTAX);
- console.timeEnd(TimingLabel.TOTAL);
+ reporting.timeEnd(TimingLabel.SYNTAX);
+ reporting.timeEnd(TimingLabel.TOTAL);
});
this.fire('render');
}.bind(this));
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html
index e8b1453..187a5cd 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder_test.html
@@ -437,6 +437,10 @@
]
},
];
+ stub('gr-reporting', {
+ time: sinon.stub(),
+ timeEnd: sinon.stub(),
+ });
element = fixture('basic');
outputEl = element.queryEffectiveChildren('#diffTable');
element.addEventListener('render', function() {
@@ -458,6 +462,20 @@
element.render({left: [], right: []}, prefs);
});
+ test('reporting', function(done) {
+ var timeStub = element.$.reporting.time;
+ var timeEndStub = element.$.reporting.timeEnd;
+ flush(function() {
+ assert.isTrue(timeStub.calledWithExactly('Diff Total Render'));
+ assert.isTrue(timeStub.calledWithExactly('Diff Content Render'));
+ assert.isTrue(timeStub.calledWithExactly('Diff Syntax Render'));
+ assert.isTrue(timeEndStub.calledWithExactly('Diff Total Render'));
+ assert.isTrue(timeEndStub.calledWithExactly('Diff Content Render'));
+ assert.isTrue(timeEndStub.calledWithExactly('Diff Syntax Render'));
+ done();
+ });
+ });
+
test('renderSection', function() {
var section = outputEl.querySelector('stub:nth-of-type(2)');
var prevInnerHTML = section.innerHTML;
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.html b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.html
index 5a41709..491eded 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.html
@@ -23,7 +23,6 @@
id="cursorManager"
scroll="keep-visible"
cursor-target-class="target-row"
- fold-offset-top="[[foldOffsetTop]]"
target="{{diffRow}}"></gr-cursor-manager>
</template>
<script src="gr-diff-cursor.js"></script>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js
index 99a0b5c..dd11f2c 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-cursor/gr-diff-cursor.js
@@ -54,11 +54,6 @@
},
},
- foldOffsetTop: {
- type: Number,
- value: 0,
- },
-
/**
* If set, the cursor will attempt to move to the line number (instead of
* the first chunk) the next time the diff renders. It is set back to null
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor.js b/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor.js
index 2a1e880..2dd4c91 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor.js
@@ -78,6 +78,22 @@
},
_nextStepHandle: Number,
+ _isScrolling: Boolean,
+ },
+
+ attached: function() {
+ this.listen(window, 'scroll', '_handleWindowScroll');
+ },
+
+ detached: function() {
+ this.unlisten(window, 'scroll', '_handleWindowScroll');
+ },
+
+ _handleWindowScroll: function() {
+ this._isScrolling = true;
+ this.debounce('resetIsScrolling', function() {
+ this._isScrolling = false;
+ }, 50);
},
/**
@@ -100,6 +116,11 @@
var currentBatch = 0;
var nextStep = function() {
+
+ if (this._isScrolling) {
+ this.async(nextStep, 100);
+ return;
+ }
// If we are done, resolve the promise.
if (state.sectionIndex >= content.length) {
resolve(this.groups);
@@ -201,11 +222,11 @@
/**
* Take rows of a shared diff section and produce an array of corresponding
* (potentially collapsed) groups.
- * @param {Array<String>} rows
- * @param {Number} context
- * @param {Number} startLineNumLeft
- * @param {Number} startLineNumRight
- * @param {String} opt_sectionEnd String representing whether this is the
+ * @param {Array<String>} rows
+ * @param {Number} context
+ * @param {Number} startLineNumLeft
+ * @param {Number} startLineNumRight
+ * @param {String} opt_sectionEnd String representing whether this is the
* first section or the last section or neither. Use the values 'first',
* 'last' and null respectively.
* @return {Array<GrDiffGroup>}
@@ -264,10 +285,10 @@
/**
* Take the rows of a delta diff section and produce the corresponding
* group.
- * @param {Array<String>} rowsAdded
- * @param {Array<String>} rowsRemoved
- * @param {Number} startLineNumLeft
- * @param {Number} startLineNumRight
+ * @param {Array<String>} rowsAdded
+ * @param {Array<String>} rowsRemoved
+ * @param {Number} startLineNumLeft
+ * @param {Number} startLineNumRight
* @return {GrDiffGroup}
*/
_deltaGroupFromRows: function(rowsAdded, rowsRemoved, startLineNumLeft,
@@ -325,7 +346,7 @@
* In order to show comments out of the bounds of the selected context,
* treat them as separate chunks within the model so that the content (and
* context surrounding it) renders correctly.
- * @param {Object} content The diff content object.
+ * @param {Object} content The diff content object.
* @return {Object} A new diff content object with regions split up.
*/
_splitCommonGroupsWithComments: function(content) {
@@ -477,8 +498,8 @@
/**
* Given an array and a size, return an array of arrays where no inner array
* is larger than that size, preserving the original order.
- * @param {!Array<T>}
- * @param {number}
+ * @param {!Array<T>} array
+ * @param {number} size
* @return {!Array<!Array<T>>}
* @template T
*/
@@ -489,7 +510,7 @@
var head = array.slice(0, array.length - size);
var tail = array.slice(array.length - size);
- return this._breakdown(head, size).concat([tail])
+ return this._breakdown(head, size).concat([tail]);
},
});
})();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor_test.html b/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor_test.html
index 9d687ac..4f8c532 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-processor/gr-diff-processor_test.html
@@ -40,6 +40,15 @@
'fugit assum per.';
var element;
+ var sandbox;
+
+ setup(function() {
+ sandbox = sinon.sandbox.create();
+ });
+
+ teardown(function() {
+ sandbox.restore();
+ });
suite('not logged in', function() {
@@ -409,6 +418,23 @@
]);
});
+ test('scrolling pauses rendering', function() {
+ var contentRow = {
+ ab: [
+ '<!DOCTYPE html>',
+ '<meta charset="utf-8">',
+ ]
+ };
+ var content = _.times(200, _.constant(contentRow));
+ sandbox.stub(element, 'async');
+ element._isScrolling = true;
+ element.process(content);
+ assert.equal(element.groups.length, 1);
+ element._isScrolling = false;
+ element.process(content);
+ assert.equal(element.groups.length, 33);
+ });
+
suite('gr-diff-processor helpers', function() {
var rows;
@@ -512,15 +538,6 @@
});
suite('_breakdown*', function() {
- var sandbox;
- setup(function() {
- sandbox = sinon.sandbox.create();
- });
-
- teardown(function() {
- sandbox.restore();
- });
-
test('_breakdownGroup ignores shared groups', function() {
sandbox.stub(element, '_breakdown');
var chunk = {ab: ['blah', 'blah', 'blah']};
diff --git a/polygerrit-ui/app/elements/gr-app.html b/polygerrit-ui/app/elements/gr-app.html
index c20795b..25dfaff 100644
--- a/polygerrit-ui/app/elements/gr-app.html
+++ b/polygerrit-ui/app/elements/gr-app.html
@@ -22,6 +22,7 @@
<link rel="import" href="./core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html">
<link rel="import" href="./core/gr-main-header/gr-main-header.html">
<link rel="import" href="./core/gr-router/gr-router.html">
+<link rel="import" href="./core/gr-reporting/gr-reporting.html">
<link rel="import" href="./change-list/gr-change-list-view/gr-change-list-view.html">
<link rel="import" href="./change-list/gr-dashboard-view/gr-dashboard-view.html">
@@ -136,6 +137,7 @@
</gr-overlay>
<gr-error-manager></gr-error-manager>
<gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
+ <gr-reporting id="reporting"></gr-reporting>
</template>
<script src="gr-app.js"></script>
</dom-module>
diff --git a/polygerrit-ui/app/elements/gr-app.js b/polygerrit-ui/app/elements/gr-app.js
index 0833a72..f24ecfd 100644
--- a/polygerrit-ui/app/elements/gr-app.js
+++ b/polygerrit-ui/app/elements/gr-app.js
@@ -72,6 +72,7 @@
},
ready: function() {
+ this.$.reporting.appStarted();
this._viewState = {
changeView: {
changeNum: null,
diff --git a/polygerrit-ui/app/elements/gr-app_test.html b/polygerrit-ui/app/elements/gr-app_test.html
new file mode 100644
index 0000000..ca26ed0
--- /dev/null
+++ b/polygerrit-ui/app/elements/gr-app_test.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<!--
+Copyright (C) 2016 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.
+-->
+
+<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-app</title>
+
+<script src="../bower_components/webcomponentsjs/webcomponents.min.js"></script>
+<script src="../bower_components/web-component-tester/browser.js"></script>
+
+<link rel="import" href="gr-app.html">
+
+<test-fixture id="basic">
+ <template>
+ <gr-app></gr-app>
+ </template>
+</test-fixture>
+
+<script>
+ suite('gr-app tests', function() {
+ var sandbox;
+ var element;
+
+ setup(function(done) {
+ sandbox = sinon.sandbox.create();
+ stub('gr-reporting', {
+ appStarted: sandbox.stub(),
+ });
+ element = fixture('basic');
+ flush(done);
+ });
+ teardown(function() {
+ sandbox.restore();
+ });
+
+ test('reporting', function() {
+ assert.isTrue(element.$.reporting.appStarted.calledOnce);
+ });
+ });
+</script>
diff --git a/polygerrit-ui/app/elements/shared/gr-button/gr-button.html b/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
index c815ffd..cc0da66 100644
--- a/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
+++ b/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
@@ -22,7 +22,7 @@
<template strip-whitespace>
<style>
:host {
- background-color: #fff;
+ background-color: #f5f5f5;
border: 1px solid #d1d2d3;
border-radius: 2px;
box-sizing: border-box;
@@ -30,10 +30,10 @@
cursor: pointer;
display: inline-block;
font-family: var(--font-family);
- font-size: 13px;
+ font-size: 12px;
font-weight: bold;
outline-width: 0;
- padding: .3em .65em;
+ padding: .4em .85em;
position: relative;
text-align: center;
-moz-user-select: none;
@@ -44,10 +44,17 @@
:host([hidden]) {
display: none;
}
+ :host([primary]),
+ :host([secondary]) {
+ color: #fff;
+ }
:host([primary]) {
background-color: #4d90fe;
border-color: #3079ed;
- color: #fff;
+ }
+ :host([secondary]) {
+ background-color: #d14836;
+ border-color: transparent;
}
:host([small]) {
font-size: 12px;
@@ -74,25 +81,44 @@
:host([loading][disabled]) {
cursor: wait;
}
- :host(:focus),
- :host(:hover) {
- border-color: #666;
+ :host(:focus:not([primary]:not[secondary])),
+ :host(:hover:not([primary]:not[secondary])) {
+ background-color: #f8f8f8;
+ border-color: #aaa;
}
:host(:active) {
border-color: #d1d2d3;
color: #aaa;
}
+ :host([primary]:focus),
+ :host([secondary]:focus),
+ :host([primary]:active),
+ :host([secondary]:active) {
+ color: #fff;
+ }
:host([primary]:focus) {
- border-color: #fff;
box-shadow: 0 0 1px #00f;
}
:host([primary]:hover) {
+ background-color: #4d90fe;
border-color: #00F;
}
+ :host([primary]:active),
+ :host([secondary]:active) {
+ box-shadow: none;
+ }
:host([primary]:active) {
border-color: #0c2188;
- box-shadow: none;
- color: #fff;
+ }
+ :host([secondary]:focus) {
+ box-shadow: 0 0 1px #f00;
+ }
+ :host([secondary]:hover) {
+ background-color: #c53727;
+ border: 1px solid #b0281a;
+ }
+ :host([secondary]:active) {
+ border-color: #941c0c;
}
:host([primary][loading]),
:host([primary][disabled]) {
@@ -100,6 +126,7 @@
border-color: transparent;
color: #fff;
}
+
</style>
<content></content>
</template>
diff --git a/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.js b/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.js
index 0d3ea3d..7b3bc23 100644
--- a/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.js
+++ b/polygerrit-ui/app/elements/shared/gr-cursor-manager/gr-cursor-manager.js
@@ -63,15 +63,6 @@
type: String,
value: ScrollBehavior.NEVER,
},
-
- /**
- * When using the 'keep-visible' scroll behavior, set an offset to the top
- * of the window for what is considered above the upper fold.
- */
- foldOffsetTop: {
- type: Number,
- value: 0,
- },
},
detached: function() {
@@ -214,7 +205,7 @@
}
if (this.scroll === ScrollBehavior.KEEP_VISIBLE &&
- top > window.pageYOffset + this.foldOffsetTop &&
+ top > window.pageYOffset &&
top < window.pageYOffset + window.innerHeight) { return; }
// Scroll the element to the middle of the window. Dividing by a third
diff --git a/polygerrit-ui/app/styles/app-theme.html b/polygerrit-ui/app/styles/app-theme.html
index ecf4ac6..faf45d8 100644
--- a/polygerrit-ui/app/styles/app-theme.html
+++ b/polygerrit-ui/app/styles/app-theme.html
@@ -20,7 +20,7 @@
--selection-background-color: #ebf5fb;
--default-text-color: #000;
--view-background-color: #fff;
- --default-horizontal-margin: 1.25rem;
+ --default-horizontal-margin: 1rem;
--font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
--monospace-font-family: 'Source Code Pro', Menlo, 'Lucida Console', Monaco, monospace;
diff --git a/polygerrit-ui/app/test/index.html b/polygerrit-ui/app/test/index.html
index d3cb316..2714f48 100644
--- a/polygerrit-ui/app/test/index.html
+++ b/polygerrit-ui/app/test/index.html
@@ -49,8 +49,8 @@
'diff/gr-diff-comment-thread/gr-diff-comment-thread_test.html',
'diff/gr-diff-comment/gr-diff-comment_test.html',
'diff/gr-diff-cursor/gr-diff-cursor_test.html',
- 'diff/gr-diff-highlight/gr-diff-highlight_test.html',
'diff/gr-diff-highlight/gr-annotation_test.html',
+ 'diff/gr-diff-highlight/gr-diff-highlight_test.html',
'diff/gr-diff-preferences/gr-diff-preferences_test.html',
'diff/gr-diff-processor/gr-diff-processor_test.html',
'diff/gr-diff-selection/gr-diff-selection_test.html',
@@ -61,6 +61,7 @@
'diff/gr-ranged-comment-layer/gr-ranged-comment-layer_test.html',
'diff/gr-selection-action-box/gr-selection-action-box_test.html',
'diff/gr-syntax-layer/gr-syntax-layer_test.html',
+ 'gr-app_test.html',
'settings/gr-account-info/gr-account-info_test.html',
'settings/gr-email-editor/gr-email-editor_test.html',
'settings/gr-group-list/gr-group-list_test.html',
@@ -69,10 +70,10 @@
'settings/gr-settings-view/gr-settings-view_test.html',
'settings/gr-ssh-editor/gr-ssh-editor_test.html',
'settings/gr-watched-projects-editor/gr-watched-projects-editor_test.html',
- 'shared/gr-autocomplete/gr-autocomplete_test.html',
'shared/gr-account-label/gr-account-label_test.html',
'shared/gr-account-link/gr-account-link_test.html',
'shared/gr-alert/gr-alert_test.html',
+ 'shared/gr-autocomplete/gr-autocomplete_test.html',
'shared/gr-avatar/gr-avatar_test.html',
'shared/gr-change-star/gr-change-star_test.html',
'shared/gr-confirm-dialog/gr-confirm-dialog_test.html',