Merge "Bump ow2 asm library to 5.1"
diff --git a/Documentation/config-cla.txt b/Documentation/config-cla.txt
index c07a24f..2234808 100644
--- a/Documentation/config-cla.txt
+++ b/Documentation/config-cla.txt
@@ -37,8 +37,13 @@
Each `contributor-agreement` section within the `project.config` file must
have a unique name. The section name will appear in the web UI.
-If not already present, add the UUID of the groups used in the
-`autoVerify` and `accepted` variables in the groups file.
+If not already present, add the group(s) used in the `autoVerify` and
+`accepted` variables in the `groups` file:
+----
+ # UUID Group Name
+ #
+ 3dedb32915ecdbef5fced9f0a2587d164cd614d4 CLA Accepted - Individual
+----
Commit the configuration change, and push it back:
----
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-changes.txt b/Documentation/rest-api-changes.txt
index 29b8c5f..ec1335b 100644
--- a/Documentation/rest-api-changes.txt
+++ b/Documentation/rest-api-changes.txt
@@ -192,6 +192,7 @@
get::/changes/?q=is:open+owner:self&q=is:open+reviewer:self+-owner:self&q=is:closed+owner:self+limit:5&o=LABELS
****
+[[query-options]]
Additional fields can be obtained by adding `o` parameters, each
option requires more database lookups and slows down the query
response time to the client so they are generally disabled by
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 47d97e3..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
@@ -41,6 +41,7 @@
import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.acceptance.PushOneCommit;
import com.google.gerrit.acceptance.TestProjectInput;
+import com.google.gerrit.common.FooterConstants;
import com.google.gerrit.common.data.LabelType;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.changes.AddReviewerInput;
@@ -58,6 +59,7 @@
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.ChangeInput;
import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CommitInfo;
import com.google.gerrit.extensions.common.GitPerson;
import com.google.gerrit.extensions.common.LabelInfo;
import com.google.gerrit.extensions.common.RevisionInfo;
@@ -538,6 +540,149 @@
}
@Test
+ public void pushCommitOfOtherUser() throws Exception {
+ // admin pushes commit of user
+ PushOneCommit push = pushFactory.create(db, user.getIdent(), testRepo);
+ PushOneCommit.Result result = push.to("refs/for/master");
+ result.assertOkStatus();
+
+ ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
+ assertThat(change.owner._accountId).isEqualTo(admin.id.get());
+ CommitInfo commit = change.revisions.get(change.currentRevision).commit;
+ assertThat(commit.author.email).isEqualTo(user.email);
+ assertThat(commit.committer.email).isEqualTo(user.email);
+
+ // check that the author/committer was added as reviewer
+ Collection<AccountInfo> reviewers = change.reviewers.get(REVIEWER);
+ assertThat(reviewers).isNotNull();
+ assertThat(reviewers).hasSize(1);
+ assertThat(reviewers.iterator().next()._accountId)
+ .isEqualTo(user.getId().get());
+ assertThat(change.reviewers.get(CC)).isNull();
+
+ List<Message> messages = sender.getMessages();
+ assertThat(messages).hasSize(1);
+ Message m = messages.get(0);
+ assertThat(m.rcpt()).containsExactly(user.emailAddress);
+ assertThat(m.body())
+ .contains(admin.fullName + " has uploaded a new change for review");
+ assertThat(m.body())
+ .contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
+ assertMailFrom(m, admin.email);
+ }
+
+ @Test
+ public void pushCommitOfOtherUserThatCannotSeeChange() throws Exception {
+ // create hidden project that is only visible to administrators
+ Project.NameKey p = createProject("p");
+ ProjectConfig cfg = projectCache.checkedGet(p).getConfig();
+ Util.allow(cfg,
+ Permission.READ,
+ groupCache.get(new AccountGroup.NameKey("Administrators"))
+ .getGroupUUID(),
+ "refs/*");
+ Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*");
+ saveProjectConfig(p, cfg);
+
+ // admin pushes commit of user
+ TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
+ PushOneCommit push = pushFactory.create(db, user.getIdent(), repo);
+ PushOneCommit.Result result = push.to("refs/for/master");
+ result.assertOkStatus();
+
+ ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
+ assertThat(change.owner._accountId).isEqualTo(admin.id.get());
+ CommitInfo commit = change.revisions.get(change.currentRevision).commit;
+ assertThat(commit.author.email).isEqualTo(user.email);
+ assertThat(commit.committer.email).isEqualTo(user.email);
+
+ // check the user cannot see the change
+ setApiUser(user);
+ try {
+ gApi.changes().id(result.getChangeId()).get();
+ fail("Expected ResourceNotFoundException");
+ } catch (ResourceNotFoundException e) {
+ // Expected.
+ }
+
+ // check that the author/committer was NOT added as reviewer (he can't see
+ // the change)
+ assertThat(change.reviewers.get(REVIEWER)).isNull();
+ assertThat(change.reviewers.get(CC)).isNull();
+ assertThat(sender.getMessages()).isEmpty();
+ }
+
+ @Test
+ public void pushCommitWithFooterOfOtherUser() throws Exception {
+ // admin pushes commit that references 'user' in a footer
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), testRepo,
+ PushOneCommit.SUBJECT + "\n\n"
+ + FooterConstants.REVIEWED_BY.getName() + ": "
+ + user.getIdent().toExternalString(),
+ PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT);
+ PushOneCommit.Result result = push.to("refs/for/master");
+ result.assertOkStatus();
+
+ // check that 'user' was added as reviewer
+ ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
+ Collection<AccountInfo> reviewers = change.reviewers.get(REVIEWER);
+ assertThat(reviewers).isNotNull();
+ assertThat(reviewers).hasSize(1);
+ assertThat(reviewers.iterator().next()._accountId)
+ .isEqualTo(user.getId().get());
+ assertThat(change.reviewers.get(CC)).isNull();
+
+ List<Message> messages = sender.getMessages();
+ assertThat(messages).hasSize(1);
+ Message m = messages.get(0);
+ assertThat(m.rcpt()).containsExactly(user.emailAddress);
+ assertThat(m.body()).contains("Hello " + user.fullName + ",\n");
+ assertThat(m.body()).contains("I'd like you to do a code review.");
+ assertThat(m.body())
+ .contains("Change subject: " + PushOneCommit.SUBJECT + "\n");
+ assertMailFrom(m, admin.email);
+ }
+
+ @Test
+ public void pushCommitWithFooterOfOtherUserThatCannotSeeChange()
+ throws Exception {
+ // create hidden project that is only visible to administrators
+ Project.NameKey p = createProject("p");
+ ProjectConfig cfg = projectCache.checkedGet(p).getConfig();
+ Util.allow(cfg,
+ Permission.READ, groupCache
+ .get(new AccountGroup.NameKey("Administrators")).getGroupUUID(),
+ "refs/*");
+ Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*");
+ saveProjectConfig(p, cfg);
+
+ // admin pushes commit that references 'user' in a footer
+ TestRepository<InMemoryRepository> repo = cloneProject(p, admin);
+ PushOneCommit push = pushFactory.create(db, admin.getIdent(), repo,
+ PushOneCommit.SUBJECT + "\n\n" + FooterConstants.REVIEWED_BY.getName()
+ + ": " + user.getIdent().toExternalString(),
+ PushOneCommit.FILE_NAME, PushOneCommit.FILE_CONTENT);
+ PushOneCommit.Result result = push.to("refs/for/master");
+ result.assertOkStatus();
+
+ // check that 'user' cannot see the change
+ setApiUser(user);
+ try {
+ gApi.changes().id(result.getChangeId()).get();
+ fail("Expected ResourceNotFoundException");
+ } catch (ResourceNotFoundException e) {
+ // Expected.
+ }
+
+ // check that 'user' was NOT added as cc ('user' can't see the change)
+ setApiUser(admin);
+ ChangeInfo change = gApi.changes().id(result.getChangeId()).get();
+ assertThat(change.reviewers.get(REVIEWER)).isNull();
+ assertThat(change.reviewers.get(CC)).isNull();
+ assertThat(sender.getMessages()).isEmpty();
+ }
+
+ @Test
public void addReviewerThatCannotSeeChange() throws Exception {
// create hidden project that is only visible to administrators
Project.NameKey p = createProject("p");
@@ -760,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/api/revision/RevisionIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
index ee2dbfe..3629e29 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
@@ -52,6 +52,7 @@
import com.google.gerrit.extensions.restapi.BinaryResult;
import com.google.gerrit.extensions.restapi.ETagView;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.server.change.GetRevisionActions;
@@ -566,6 +567,19 @@
}
@Test
+ public void diffNonExistingFile() throws Exception {
+ PushOneCommit.Result r = createChange();
+
+ exception.expect(ResourceNotFoundException.class);
+ exception.expectMessage("non-existing");
+ gApi.changes()
+ .id(r.getChangeId())
+ .revision(r.getCommit().name())
+ .file("non-existing")
+ .diff();
+ }
+
+ @Test
public void diffOnMergeCommitChange() throws Exception {
PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
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/AccountSecurity.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountSecurity.java
index b402f6c..afd6734 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountSecurity.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountSecurity.java
@@ -21,7 +21,6 @@
import com.google.gwtjsonrpc.common.RemoteJsonService;
import com.google.gwtjsonrpc.common.RpcImpl;
import com.google.gwtjsonrpc.common.RpcImpl.Version;
-import com.google.gwtjsonrpc.common.VoidResult;
import java.util.List;
import java.util.Set;
@@ -35,9 +34,4 @@
@SignInRequired
void deleteExternalIds(Set<AccountExternalId.Key> keys,
AsyncCallback<Set<AccountExternalId.Key>> callback);
-
- @Audit
- @SignInRequired
- void enterAgreement(String agreementName,
- AsyncCallback<VoidResult> callback);
}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountService.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountService.java
deleted file mode 100644
index 22482c7..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/AccountService.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2008 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.common.data;
-
-import com.google.gerrit.common.auth.SignInRequired;
-import com.google.gwtjsonrpc.common.AsyncCallback;
-import com.google.gwtjsonrpc.common.RemoteJsonService;
-import com.google.gwtjsonrpc.common.RpcImpl;
-import com.google.gwtjsonrpc.common.RpcImpl.Version;
-
-@RpcImpl(version = Version.V2_0)
-public interface AccountService extends RemoteJsonService {
- @SignInRequired
- void myAgreements(AsyncCallback<AgreementInfo> callback);
-}
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/changes/RevisionApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
index 2731476..a71ab37 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
@@ -47,7 +47,7 @@
Map<String, FileInfo> files() throws RestApiException;
Map<String, FileInfo> files(String base) throws RestApiException;
Map<String, FileInfo> files(int parentNum) throws RestApiException;
- FileApi file(String path);
+ FileApi file(String path) throws RestApiException;
MergeableInfo mergeable() throws RestApiException;
MergeableInfo mergeableOtherBranches() throws RestApiException;
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-extension-api/src/main/java/com/google/gerrit/extensions/client/AccountFieldName.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AccountFieldName.java
new file mode 100644
index 0000000..07d9f37
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/AccountFieldName.java
@@ -0,0 +1,19 @@
+// 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.client;
+
+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-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java
new file mode 100644
index 0000000..206b2f0
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeConfigInfo.java
@@ -0,0 +1,25 @@
+// 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;
+
+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-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadInfo.java
new file mode 100644
index 0000000..180e2d2
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadInfo.java
@@ -0,0 +1,23 @@
+// 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.List;
+import java.util.Map;
+
+public class DownloadInfo {
+ public Map<String, DownloadSchemeInfo> schemes;
+ public List<String> archives;
+}
\ No newline at end of file
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java
new file mode 100644
index 0000000..0e8ad65
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/DownloadSchemeInfo.java
@@ -0,0 +1,25 @@
+// 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 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-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java
new file mode 100644
index 0000000..72c474f
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/GerritInfo.java
@@ -0,0 +1,25 @@
+// 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;
+
+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-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginConfigInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginConfigInfo.java
new file mode 100644
index 0000000..845f7cb
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/PluginConfigInfo.java
@@ -0,0 +1,22 @@
+// 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.List;
+
+public class PluginConfigInfo {
+ public Boolean hasAvatars;
+ public List<String> jsResourcePaths;
+}
\ No newline at end of file
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReceiveInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReceiveInfo.java
new file mode 100644
index 0000000..e66c242
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ReceiveInfo.java
@@ -0,0 +1,19 @@
+// 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;
+
+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-extension-api/src/main/java/com/google/gerrit/extensions/common/SshdInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshdInfo.java
new file mode 100644
index 0000000..98d650c
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SshdInfo.java
@@ -0,0 +1,18 @@
+// 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;
+
+public class SshdInfo {
+}
\ No newline at end of file
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestInfo.java
new file mode 100644
index 0000000..5b0dcbe
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SuggestInfo.java
@@ -0,0 +1,19 @@
+// 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;
+
+public class SuggestInfo {
+ public int from;
+}
\ No newline at end of file
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/UserConfigInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/UserConfigInfo.java
new file mode 100644
index 0000000..5010689
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/UserConfigInfo.java
@@ -0,0 +1,19 @@
+// 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;
+
+public class UserConfigInfo {
+ public String anonymousCowardName;
+}
\ No newline at end of file
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AgreementInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AgreementInfo.java
new file mode 100644
index 0000000..5fb2f48
--- /dev/null
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/AgreementInfo.java
@@ -0,0 +1,27 @@
+// 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.client.info;
+
+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; }-*/;
+ 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 6073e2d..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;
@@ -211,6 +212,14 @@
new RestApi("/accounts/").id(account).view("password.http").delete(cb);
}
+ /** Enter a contributor agreement */
+ public static void enterAgreement(String account, String name,
+ AsyncCallback<NativeString> cb) {
+ AgreementInput in = AgreementInput.create();
+ in.name(name);
+ new RestApi("/accounts/").id(account).view("agreements").put(in, cb);
+ }
+
private static JsArray<ProjectWatchInfo> projectWatchArrayFromSet(
Set<ProjectWatchInfo> set) {
JsArray<ProjectWatchInfo> jsArray = JsArray.createArray().cast();
@@ -220,6 +229,17 @@
return jsArray;
}
+ private static class AgreementInput extends JavaScriptObject {
+ final native void name(String n) /*-{ if(n)this.name=n; }-*/;
+
+ static AgreementInput create() {
+ return createObject().cast();
+ }
+
+ protected AgreementInput() {
+ }
+ }
+
private static class HttpPasswordInput extends JavaScriptObject {
final native void generate(boolean g) /*-{ if(g)this.generate=g; }-*/;
@@ -269,6 +289,12 @@
.post(GpgKeysInput.delete(fingerprints), cb);
}
+ /** List contributor agreements */
+ public static void getAgreements(String account,
+ AsyncCallback<JsArray<AgreementInfo>> cb) {
+ new RestApi("/accounts/").id(account).view("agreements").get(cb);
+ }
+
private static class GpgKeysInput extends JavaScriptObject {
static GpgKeysInput add(String key) {
return createWithAdd(Natives.arrayOf(key));
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java
index a084612..01b5af3 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java
@@ -141,11 +141,8 @@
String errorDialogTitleRegisterNewEmail();
String newAgreement();
- String agreementStatus();
String agreementName();
String agreementDescription();
- String agreementStatus_EXPIRED();
- String agreementStatus_VERIFIED();
String newAgreementSelectTypeHeading();
String newAgreementNoneAvailable();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties
index ca2d316..f74d34b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties
@@ -151,10 +151,7 @@
newAgreement = New Contributor Agreement
-agreementStatus = Status
agreementName = Name
-agreementStatus_EXPIRED = Expired
-agreementStatus_VERIFIED = Verified
agreementDescription = Description
newAgreementSelectTypeHeading = Select an agreement type:
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 308cf30..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,15 +15,19 @@
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;
import com.google.gerrit.client.ui.Hyperlink;
import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.common.data.AgreementInfo;
import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gwt.core.client.JsArray;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
+import java.util.List;
+
public class MyAgreementsScreen extends SettingsScreen {
private AgreementTable agreements;
@@ -39,71 +43,54 @@
@Override
protected void onLoad() {
super.onLoad();
- Util.ACCOUNT_SVC.myAgreements(new ScreenLoadCallback<AgreementInfo>(this) {
+ AccountApi.getAgreements(
+ "self", new ScreenLoadCallback<JsArray<AgreementInfo>>(this) {
@Override
- public void preDisplay(final AgreementInfo result) {
- agreements.display(result);
- }
- });
+ public void preDisplay(JsArray<AgreementInfo> result) {
+ agreements.display(Natives.asList(result));
+ }});
}
private static class AgreementTable extends FancyFlexTable<ContributorAgreement> {
AgreementTable() {
table.setWidth("");
- table.setText(0, 1, Util.C.agreementStatus());
- table.setText(0, 2, Util.C.agreementName());
- table.setText(0, 3, Util.C.agreementDescription());
+ table.setText(0, 1, Util.C.agreementName());
+ table.setText(0, 2, Util.C.agreementDescription());
- final FlexCellFormatter fmt = table.getFlexCellFormatter();
- for (int c = 1; c < 4; c++) {
+ FlexCellFormatter fmt = table.getFlexCellFormatter();
+ for (int c = 1; c < 3; c++) {
fmt.addStyleName(0, c, Gerrit.RESOURCES.css().dataHeader());
}
}
- void display(final AgreementInfo result) {
+ void display(List<AgreementInfo> result) {
while (1 < table.getRowCount()) {
table.removeRow(table.getRowCount() - 1);
}
- for (final String k : result.accepted) {
- addOne(result, k);
+ for (AgreementInfo info : result) {
+ addOne(info);
}
}
- void addOne(final AgreementInfo info, final String k) {
- final int row = table.getRowCount();
+ void addOne(AgreementInfo info) {
+ int row = table.getRowCount();
table.insertRow(row);
applyDataRowStyle(row);
- final ContributorAgreement cla = info.agreements.get(k);
- final String statusName;
- if (cla == null) {
- statusName = Util.C.agreementStatus_EXPIRED();
+ String url = info.url();
+ if (url != null && url.length() > 0) {
+ Anchor a = new Anchor(info.name(), url);
+ a.setTarget("_blank");
+ table.setWidget(row, 1, a);
} else {
- statusName = Util.C.agreementStatus_VERIFIED();
+ table.setText(row, 1, info.name());
}
- table.setText(row, 1, statusName);
-
- if (cla == null) {
- table.setText(row, 2, "");
- table.setText(row, 3, "");
- } else {
- final String url = cla.getAgreementUrl();
- if (url != null && url.length() > 0) {
- final Anchor a = new Anchor(cla.getName(), url);
- a.setTarget("_blank");
- table.setWidget(row, 2, a);
- } else {
- table.setText(row, 2, cla.getName());
- }
- table.setText(row, 3, cla.getDescription());
- }
- final FlexCellFormatter fmt = table.getFlexCellFormatter();
- for (int c = 1; c < 4; c++) {
+ table.setText(row, 2, info.description());
+ FlexCellFormatter fmt = table.getFlexCellFormatter();
+ for (int c = 1; c < 3; c++) {
fmt.addStyleName(row, c, Gerrit.RESOURCES.css().dataCell());
}
-
- setRowItem(row, cla);
}
}
}
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 14f8e2f..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,14 +16,16 @@
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;
import com.google.gerrit.client.ui.AccountScreen;
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.AgreementInfo;
-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;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.http.client.Request;
@@ -41,7 +43,6 @@
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwtexpui.globalkey.client.NpTextBox;
-import com.google.gwtjsonrpc.common.VoidResult;
import java.util.HashSet;
import java.util.List;
@@ -50,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;
@@ -73,25 +74,21 @@
@Override
protected void onLoad() {
super.onLoad();
- Util.ACCOUNT_SVC.myAgreements(new GerritCallback<AgreementInfo>() {
+ AccountApi.getAgreements(
+ "self", new GerritCallback<JsArray<AgreementInfo>>() {
@Override
- public void onSuccess(AgreementInfo result) {
+ public void onSuccess(JsArray<AgreementInfo> result) {
if (isAttached()) {
- mySigned = new HashSet<>(result.accepted);
+ mySigned = new HashSet<>();
+ for (AgreementInfo info: Natives.asList(result)) {
+ mySigned.add(info.name());
+ }
postRPC();
}
- }
- });
- 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
@@ -158,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());
@@ -177,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);
}
@@ -199,24 +196,24 @@
}
private void doEnterAgreement() {
- Util.ACCOUNT_SEC.enterAgreement(current.getName(),
- new GerritCallback<VoidResult>() {
+ AccountApi.enterAgreement("self", current.name(),
+ new GerritCallback<NativeString>() {
@Override
- public void onSuccess(final VoidResult result) {
+ public void onSuccess(NativeString result) {
Gerrit.display(nextToken);
}
@Override
- public void onFailure(final Throwable caught) {
+ public void onFailure(Throwable caught) {
yesIAgreeBox.setText("");
super.onFailure(caught);
}
});
}
- 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());
@@ -250,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/account/Util.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/Util.java
index a0f36b9..b4b4390 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/Util.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/Util.java
@@ -15,7 +15,6 @@
package com.google.gerrit.client.account;
import com.google.gerrit.common.data.AccountSecurity;
-import com.google.gerrit.common.data.AccountService;
import com.google.gerrit.common.data.ProjectAdminService;
import com.google.gwt.core.client.GWT;
import com.google.gwtjsonrpc.client.JsonUtil;
@@ -23,14 +22,10 @@
public class Util {
public static final AccountConstants C = GWT.create(AccountConstants.class);
public static final AccountMessages M = GWT.create(AccountMessages.class);
- public static final AccountService ACCOUNT_SVC;
public static final AccountSecurity ACCOUNT_SEC;
public static final ProjectAdminService PROJECT_SVC;
static {
- ACCOUNT_SVC = GWT.create(AccountService.class);
- JsonUtil.bind(ACCOUNT_SVC, "rpc/AccountService");
-
ACCOUNT_SEC = GWT.create(AccountSecurity.class);
JsonUtil.bind(ACCOUNT_SEC, "rpc/AccountSecurity");
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-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountModule.java
index 62778eb..d32fdaf 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountModule.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountModule.java
@@ -28,12 +28,10 @@
install(new FactoryModule() {
@Override
protected void configure() {
- factory(AgreementInfoFactory.Factory.class);
factory(DeleteExternalIds.Factory.class);
factory(ExternalIdDetailFactory.Factory.class);
}
});
rpc(AccountSecurityImpl.class);
- rpc(AccountServiceImpl.class);
}
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountSecurityImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountSecurityImpl.java
index 873dc0a..3d05548 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountSecurityImpl.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountSecurityImpl.java
@@ -14,66 +14,31 @@
package com.google.gerrit.httpd.rpc.account;
-import com.google.gerrit.audit.AuditService;
import com.google.gerrit.common.data.AccountSecurity;
-import com.google.gerrit.common.data.ContributorAgreement;
-import com.google.gerrit.common.errors.NoSuchEntityException;
import com.google.gerrit.httpd.rpc.BaseServiceImplementation;
-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.AccountGroupMember;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.AccountCache;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.extensions.events.AgreementSignup;
-import com.google.gerrit.server.project.ProjectCache;
import com.google.gwtjsonrpc.common.AsyncCallback;
-import com.google.gwtjsonrpc.common.VoidResult;
-import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
-import java.io.IOException;
-import java.util.Collections;
import java.util.List;
import java.util.Set;
class AccountSecurityImpl extends BaseServiceImplementation implements
AccountSecurity {
- private final ProjectCache projectCache;
- private final Provider<IdentifiedUser> user;
- private final AccountCache accountCache;
-
private final DeleteExternalIds.Factory deleteExternalIdsFactory;
private final ExternalIdDetailFactory.Factory externalIdDetailFactory;
- private final GroupCache groupCache;
- private final AuditService auditService;
- private final AgreementSignup agreementSignup;
-
@Inject
AccountSecurityImpl(final Provider<ReviewDb> schema,
final Provider<CurrentUser> currentUser,
- final Provider<IdentifiedUser> u,
- final ProjectCache pc,
- final AccountCache uac,
final DeleteExternalIds.Factory deleteExternalIdsFactory,
- final ExternalIdDetailFactory.Factory externalIdDetailFactory,
- final GroupCache groupCache,
- final AuditService auditService,
- AgreementSignup agreementSignup) {
+ final ExternalIdDetailFactory.Factory externalIdDetailFactory) {
super(schema, currentUser);
- user = u;
- projectCache = pc;
- accountCache = uac;
- this.auditService = auditService;
this.deleteExternalIdsFactory = deleteExternalIdsFactory;
this.externalIdDetailFactory = externalIdDetailFactory;
- this.groupCache = groupCache;
- this.agreementSignup = agreementSignup;
}
@Override
@@ -86,48 +51,4 @@
final AsyncCallback<Set<AccountExternalId.Key>> callback) {
deleteExternalIdsFactory.create(keys).to(callback);
}
-
- @Override
- public void enterAgreement(final String agreementName,
- final AsyncCallback<VoidResult> callback) {
- run(callback, new Action<VoidResult>() {
- @Override
- public VoidResult run(final ReviewDb db)
- throws OrmException, Failure, IOException {
- ContributorAgreement ca = projectCache.getAllProjects().getConfig()
- .getContributorAgreement(agreementName);
- if (ca == null) {
- throw new Failure(new NoSuchEntityException());
- }
-
- if (ca.getAutoVerify() == null) {
- throw new Failure(new IllegalStateException(
- "cannot enter a non-autoVerify agreement"));
- } else if (ca.getAutoVerify().getUUID() == null) {
- throw new Failure(new NoSuchEntityException());
- }
-
- AccountGroup group = groupCache.get(ca.getAutoVerify().getUUID());
- if (group == null) {
- throw new Failure(new NoSuchEntityException());
- }
-
- Account account = user.get().getAccount();
- agreementSignup.fire(account, ca.getName());
-
- final AccountGroupMember.Key key =
- new AccountGroupMember.Key(account.getId(), group.getId());
- AccountGroupMember m = db.accountGroupMembers().get(key);
- if (m == null) {
- m = new AccountGroupMember(key);
- auditService.dispatchAddAccountsToGroup(account.getId(), Collections
- .singleton(m));
- db.accountGroupMembers().insert(Collections.singleton(m));
- accountCache.evict(m.getAccountId());
- }
-
- return VoidResult.INSTANCE;
- }
- });
- }
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java
deleted file mode 100644
index 8fba47d..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2008 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.httpd.rpc.account;
-
-import com.google.gerrit.common.data.AccountService;
-import com.google.gerrit.common.data.AgreementInfo;
-import com.google.gerrit.httpd.rpc.BaseServiceImplementation;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gwtjsonrpc.common.AsyncCallback;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-
-class AccountServiceImpl extends BaseServiceImplementation implements
- AccountService {
- private final AgreementInfoFactory.Factory agreementInfoFactory;
-
- @Inject
- AccountServiceImpl(final Provider<ReviewDb> schema,
- final Provider<IdentifiedUser> identifiedUser,
- final AgreementInfoFactory.Factory agreementInfoFactory) {
- super(schema, identifiedUser);
- this.agreementInfoFactory = agreementInfoFactory;
- }
-
- @Override
- public void myAgreements(final AsyncCallback<AgreementInfo> callback) {
- agreementInfoFactory.create().to(callback);
- }
-}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AgreementInfoFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AgreementInfoFactory.java
deleted file mode 100644
index 91afd97..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AgreementInfoFactory.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (C) 2009 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.httpd.rpc.account;
-
-import com.google.gerrit.common.data.AgreementInfo;
-import com.google.gerrit.common.data.ContributorAgreement;
-import com.google.gerrit.common.data.PermissionRule;
-import com.google.gerrit.common.data.PermissionRule.Action;
-import com.google.gerrit.httpd.rpc.Handler;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.inject.Inject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-class AgreementInfoFactory extends Handler<AgreementInfo> {
- private static final Logger log = LoggerFactory.getLogger(AgreementInfoFactory.class);
-
- interface Factory {
- AgreementInfoFactory create();
- }
-
- private final IdentifiedUser user;
- private final ProjectCache projectCache;
-
- private AgreementInfo info;
-
- @Inject
- AgreementInfoFactory(final IdentifiedUser user,
- final ProjectCache projectCache) {
- this.user = user;
- this.projectCache = projectCache;
- }
-
- @Override
- public AgreementInfo call() throws Exception {
- List<String> accepted = new ArrayList<>();
- Map<String, ContributorAgreement> agreements = new HashMap<>();
- Collection<ContributorAgreement> cas =
- projectCache.getAllProjects().getConfig().getContributorAgreements();
- for (ContributorAgreement ca : cas) {
- agreements.put(ca.getName(), ca.forUi());
-
- List<AccountGroup.UUID> groupIds = new ArrayList<>();
- for (PermissionRule rule : ca.getAccepted()) {
- if ((rule.getAction() == Action.ALLOW) && (rule.getGroup() != null)) {
- if (rule.getGroup().getUUID() == null) {
- log.warn("group \"" + rule.getGroup().getName() + "\" does not " +
- " exist, referenced in CLA \"" + ca.getName() + "\"");
- } else {
- groupIds.add(new AccountGroup.UUID(rule.getGroup().getUUID().get()));
- }
- }
- }
- if (user.getEffectiveGroups().containsAnyOf(groupIds)) {
- accepted.add(ca.getName());
- }
- }
-
- info = new AgreementInfo();
- info.setAccepted(accepted);
- info.setAgreements(agreements);
- return info;
- }
-}
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-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java
index f16e2ec..5f470a5 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// 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.
@@ -108,6 +108,7 @@
extractMailExample("DeleteReviewer.vm");
extractMailExample("DeleteVote.vm");
extractMailExample("Footer.vm");
+ extractMailExample("footer.soy");
extractMailExample("Merged.vm");
extractMailExample("NewChange.vm");
extractMailExample("RegisterNewEmail.vm");
diff --git a/gerrit-plugin-api/BUCK b/gerrit-plugin-api/BUCK
index 7e12f232..70886d5 100644
--- a/gerrit-plugin-api/BUCK
+++ b/gerrit-plugin-api/BUCK
@@ -42,20 +42,30 @@
'//lib:gson',
'//lib:guava',
'//lib:gwtorm',
+ '//lib:icu4j',
'//lib:jsch',
+ '//lib:jsr305',
'//lib:mime-util',
+ '//lib:protobuf',
'//lib:servlet-api-3_1',
+ '//lib:soy',
'//lib:velocity',
'//lib/commons:lang',
'//lib/dropwizard:dropwizard-core',
'//lib/guice:guice',
'//lib/guice:guice-assistedinject',
+ '//lib/guice:javax-inject',
+ '//lib/guice:multibindings',
'//lib/guice:guice-servlet',
'//lib/jgit/org.eclipse.jgit:jgit',
'//lib/jgit/org.eclipse.jgit.http.server:jgit-servlet',
'//lib/joda:joda-time',
'//lib/log:api',
'//lib/mina:sshd',
+ '//lib/ow2:ow2-asm',
+ '//lib/ow2:ow2-asm-analysis',
+ '//lib/ow2:ow2-asm-commons',
+ '//lib/ow2:ow2-asm-util',
'//lib/prolog:compiler',
],
visibility = ['PUBLIC'],
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/BUCK b/gerrit-server/BUCK
index 4fc578c..443d7c4 100644
--- a/gerrit-server/BUCK
+++ b/gerrit-server/BUCK
@@ -46,6 +46,7 @@
'//lib:mime-util',
'//lib:pegdown',
'//lib:protobuf',
+ '//lib:soy',
'//lib:tukaani-xz',
'//lib:velocity',
'//lib/antlr:java_runtime',
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java
index 718a37f..5a5d16c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java
@@ -43,11 +43,15 @@
import com.google.gerrit.server.notedb.NotesMigration;
import com.google.gerrit.server.notedb.ReviewerStateInternal;
import com.google.gerrit.server.project.ChangeControl;
+import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.util.LabelVote;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
@@ -73,6 +77,9 @@
*/
@Singleton
public class ApprovalsUtil {
+ private static final Logger log =
+ LoggerFactory.getLogger(ApprovalsUtil.class);
+
private static final Ordering<PatchSetApproval> SORT_APPROVALS =
Ordering.natural()
.onResultOf(
@@ -99,13 +106,19 @@
}
private final NotesMigration migration;
+ private final IdentifiedUser.GenericFactory userFactory;
+ private final ChangeControl.GenericFactory changeControlFactory;
private final ApprovalCopier copier;
@VisibleForTesting
@Inject
public ApprovalsUtil(NotesMigration migration,
+ IdentifiedUser.GenericFactory userFactory,
+ ChangeControl.GenericFactory changeControlFactory,
ApprovalCopier copier) {
this.migration = migration;
+ this.userFactory = userFactory;
+ this.changeControlFactory = changeControlFactory;
this.copier = copier;
}
@@ -164,8 +177,8 @@
PatchSetInfo info, Iterable<Account.Id> wantReviewers,
Collection<Account.Id> existingReviewers) throws OrmException {
return addReviewers(db, update, labelTypes, change, ps.getId(),
- ps.isDraft(), info.getAuthor().getAccount(),
- info.getCommitter().getAccount(), wantReviewers, existingReviewers);
+ info.getAuthor().getAccount(), info.getCommitter().getAccount(),
+ wantReviewers, existingReviewers);
}
public List<PatchSetApproval> addReviewers(ReviewDb db, ChangeNotes notes,
@@ -189,12 +202,12 @@
existingReviewers.add(entry.getKey());
}
}
- return addReviewers(db, update, labelTypes, change, psId, false, null, null,
+ return addReviewers(db, update, labelTypes, change, psId, null, null,
wantReviewers, existingReviewers);
}
private List<PatchSetApproval> addReviewers(ReviewDb db, ChangeUpdate update,
- LabelTypes labelTypes, Change change, PatchSet.Id psId, boolean isDraft,
+ LabelTypes labelTypes, Change change, PatchSet.Id psId,
Account.Id authorId, Account.Id committerId,
Iterable<Account.Id> wantReviewers,
Collection<Account.Id> existingReviewers) throws OrmException {
@@ -204,11 +217,11 @@
}
Set<Account.Id> need = Sets.newLinkedHashSet(wantReviewers);
- if (authorId != null && !isDraft) {
+ if (authorId != null && canSee(db, update.getNotes(), authorId)) {
need.add(authorId);
}
- if (committerId != null && !isDraft) {
+ if (committerId != null && canSee(db, update.getNotes(), authorId)) {
need.add(committerId);
}
need.remove(change.getOwner());
@@ -229,6 +242,17 @@
return Collections.unmodifiableList(cells);
}
+ private boolean canSee(ReviewDb db, ChangeNotes notes, Account.Id accountId) {
+ try {
+ IdentifiedUser user = userFactory.create(accountId);
+ return changeControlFactory.controlFor(notes, user).isVisible(db);
+ } catch (OrmException | NoSuchChangeException e) {
+ log.warn(String.format("Failed to check if account %d can see change %d",
+ accountId.get(), notes.getChangeId().get()), e);
+ return false;
+ }
+ }
+
/**
* Adds accounts to a change as reviewers in the CC state.
*
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/changes/RevisionApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
index 6b5e83c..213f90d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
@@ -321,9 +321,13 @@
}
@Override
- public FileApi file(String path) {
- return fileApi.create(files.parse(revision,
- IdString.fromDecoded(path)));
+ public FileApi file(String path) throws RestApiException {
+ try {
+ return fileApi.create(files.parse(revision,
+ IdString.fromDecoded(path)));
+ } catch (IOException e) {
+ throw new RestApiException("Cannot retrieve file", e);
+ }
}
@Override
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/ChangeInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java
index 6333809..84781f5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeInserter.java
@@ -19,6 +19,8 @@
import static com.google.gerrit.reviewdb.client.Change.INITIAL_PATCH_SET_ID;
import com.google.common.base.MoreObjects;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Sets;
import com.google.gerrit.common.FooterConstants;
import com.google.gerrit.common.data.LabelType;
import com.google.gerrit.common.data.LabelTypes;
@@ -34,6 +36,7 @@
import com.google.gerrit.server.ApprovalsUtil;
import com.google.gerrit.server.ChangeMessagesUtil;
import com.google.gerrit.server.ChangeUtil;
+import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.PatchSetUtil;
import com.google.gerrit.server.events.CommitReceivedEvent;
import com.google.gerrit.server.extensions.events.CommentAdded;
@@ -48,6 +51,7 @@
import com.google.gerrit.server.git.validators.CommitValidationException;
import com.google.gerrit.server.git.validators.CommitValidators;
import com.google.gerrit.server.mail.CreateChangeSender;
+import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.notedb.ChangeUpdate;
import com.google.gerrit.server.patch.PatchSetInfoFactory;
import com.google.gerrit.server.project.ChangeControl;
@@ -86,6 +90,7 @@
LoggerFactory.getLogger(ChangeInserter.class);
private final ProjectControl.GenericFactory projectControlFactory;
+ private final IdentifiedUser.GenericFactory userFactory;
private final ChangeControl.GenericFactory changeControlFactory;
private final PatchSetInfoFactory patchSetInfoFactory;
private final PatchSetUtil psUtil;
@@ -128,6 +133,7 @@
@Inject
ChangeInserter(ProjectControl.GenericFactory projectControlFactory,
+ IdentifiedUser.GenericFactory userFactory,
ChangeControl.GenericFactory changeControlFactory,
PatchSetInfoFactory patchSetInfoFactory,
PatchSetUtil psUtil,
@@ -142,6 +148,7 @@
@Assisted RevCommit commit,
@Assisted String refName) {
this.projectControlFactory = projectControlFactory;
+ this.userFactory = userFactory;
this.changeControlFactory = changeControlFactory;
this.patchSetInfoFactory = patchSetInfoFactory;
this.psUtil = psUtil;
@@ -353,8 +360,10 @@
update.fixStatus(change.getStatus());
LabelTypes labelTypes = ctl.getProjectControl().getLabelTypes();
- approvalsUtil.addReviewers(db, update, labelTypes, change,
- patchSet, patchSetInfo, reviewers, Collections.<Account.Id> emptySet());
+ approvalsUtil.addReviewers(db, update, labelTypes, change, patchSet,
+ patchSetInfo,
+ filterOnChangeVisibility(db, ctx.getNotes(), reviewers),
+ Collections.<Account.Id> emptySet());
approvalsUtil.addApprovals(db, update, labelTypes, patchSet,
ctx.getControl(), approvals);
if (message != null) {
@@ -368,6 +377,25 @@
return true;
}
+ private Set<Account.Id> filterOnChangeVisibility(final ReviewDb db,
+ final ChangeNotes notes, Set<Account.Id> accounts) {
+ return Sets.filter(accounts, new Predicate<Account.Id>() {
+ @Override
+ public boolean apply(Account.Id accountId) {
+ try {
+ IdentifiedUser user = userFactory.create(accountId);
+ return changeControlFactory.controlFor(notes, user).isVisible(db);
+ } catch (OrmException | NoSuchChangeException e) {
+ log.warn(
+ String.format("Failed to check if account %d can see change %d",
+ accountId.get(), notes.getChangeId().get()),
+ e);
+ return false;
+ }
+ }
+ });
+ }
+
@Override
public void postUpdate(Context ctx) throws OrmException, NoSuchChangeException {
if (sendMail) {
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/Files.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java
index 35dbec1..1631d48 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java
@@ -29,6 +29,7 @@
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
@@ -48,6 +49,7 @@
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevTree;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
@@ -67,11 +69,15 @@
public class Files implements ChildCollection<RevisionResource, FileResource> {
private final DynamicMap<RestView<FileResource>> views;
private final Provider<ListFiles> list;
+ private final GitRepositoryManager repoManager;
@Inject
- Files(DynamicMap<RestView<FileResource>> views, Provider<ListFiles> list) {
+ Files(DynamicMap<RestView<FileResource>> views,
+ Provider<ListFiles> list,
+ GitRepositoryManager repoManager) {
this.views = views;
this.list = list;
+ this.repoManager = repoManager;
}
@Override
@@ -85,8 +91,20 @@
}
@Override
- public FileResource parse(RevisionResource rev, IdString id) {
- return new FileResource(rev, id.get());
+ public FileResource parse(RevisionResource rev, IdString id)
+ throws ResourceNotFoundException, IOException {
+ if (Patch.COMMIT_MSG.equals(id.get())) {
+ return new FileResource(rev, id.get());
+ }
+ try (Repository repo = repoManager.openRepository(rev.getProject());
+ RevWalk rw = new RevWalk(repo)) {
+ RevTree tree = rw.parseTree(
+ ObjectId.fromString(rev.getPatchSet().getRevision().get()));
+ if (TreeWalk.forPath(repo, id.get(), tree) != null) {
+ return new FileResource(rev, id.get());
+ }
+ }
+ throw new ResourceNotFoundException(id);
}
public static final class ListFiles implements RestReadView<RevisionResource> {
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/GerritGlobalModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java
index da1f9a6..37127c5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// 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.
@@ -134,9 +134,11 @@
import com.google.gerrit.server.mail.EmailModule;
import com.google.gerrit.server.mail.FromAddressGenerator;
import com.google.gerrit.server.mail.FromAddressGeneratorProvider;
+import com.google.gerrit.server.mail.MailTemplates;
import com.google.gerrit.server.mail.MergedSender;
import com.google.gerrit.server.mail.RegisterNewEmailSender;
import com.google.gerrit.server.mail.ReplacePatchSetSender;
+import com.google.gerrit.server.mail.MailSoyTofuProvider;
import com.google.gerrit.server.mail.VelocityRuntimeProvider;
import com.google.gerrit.server.mime.FileTypeRegistry;
import com.google.gerrit.server.mime.MimeUtilFileTypeRegistry;
@@ -170,6 +172,7 @@
import com.google.inject.Inject;
import com.google.inject.TypeLiteral;
import com.google.inject.internal.UniqueAnnotations;
+import com.google.template.soy.tofu.SoyTofu;
import org.apache.velocity.runtime.RuntimeInstance;
import org.eclipse.jgit.lib.Config;
@@ -275,6 +278,9 @@
bind(RuntimeInstance.class)
.toProvider(VelocityRuntimeProvider.class);
+ bind(SoyTofu.class)
+ .annotatedWith(MailTemplates.class)
+ .toProvider(MailSoyTofuProvider.class);
bind(FromAddressGenerator.class).toProvider(
FromAddressGeneratorProvider.class).in(SINGLETON);
bind(Boolean.class).annotatedWith(DisableReverseDnsLookup.class)
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 2b621c2..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,7 +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.GitwebType;
+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;
@@ -29,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;
@@ -39,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;
@@ -70,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(
@@ -87,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;
@@ -103,6 +117,8 @@
this.enableSignedPush = enableSignedPush;
this.docSearcher = docSearcher;
this.migration = migration;
+ this.projectCache = projectCache;
+ this.agreementJson = agreementJson;
}
@Override
@@ -135,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:
@@ -323,90 +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 GitwebInfo {
- public String url;
- public GitwebType type;
- }
-
- 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/extensions/events/ReviewerAdded.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java
index c0b3249..35b14dc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/ReviewerAdded.java
@@ -14,9 +14,9 @@
package com.google.gerrit.server.extensions.events;
-import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.RevisionInfo;
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/git/MergeSuperSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java
index 284e9ed..8d847e9 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSuperSet.java
@@ -32,6 +32,7 @@
import com.google.gerrit.server.change.Submit;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.index.change.ChangeField;
+import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.project.SubmitRuleEvaluator;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.query.change.InternalChangeQuery;
@@ -261,11 +262,19 @@
continue;
}
for (ChangeData topicCd : query().byTopicOpen(topic)) {
- topicCd.changeControl(user);
- if (topicCd.changeControl().isVisible(db, topicCd)) {
- visibleChanges.add(topicCd);
- } else {
- nonVisibleChanges.add(topicCd);
+ try {
+ topicCd.changeControl(user);
+ if (topicCd.changeControl().isVisible(db, topicCd)) {
+ visibleChanges.add(topicCd);
+ } else {
+ nonVisibleChanges.add(topicCd);
+ }
+ } catch (OrmException e) {
+ if (e.getCause() instanceof NoSuchChangeException) {
+ // Ignore and skip this change
+ } else {
+ throw e;
+ }
}
}
topicsSeen.add(topic);
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/mail/EmailArguments.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailArguments.java
index 68e5e50..3136aec 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailArguments.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailArguments.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2010 The Android Open Source Project
+// 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.
@@ -43,6 +43,7 @@
import com.google.gerrit.server.validators.OutgoingEmailValidationListener;
import com.google.inject.Inject;
import com.google.inject.Provider;
+import com.google.template.soy.tofu.SoyTofu;
import org.apache.velocity.runtime.RuntimeInstance;
import org.eclipse.jgit.lib.PersonIdent;
@@ -74,6 +75,7 @@
final Provider<ReviewDb> db;
final ChangeData.Factory changeDataFactory;
final RuntimeInstance velocityRuntime;
+ final SoyTofu soyTofu;
final EmailSettings settings;
final DynamicSet<OutgoingEmailValidationListener> outgoingEmailValidationListeners;
final StarredChangesUtil starredChangesUtil;
@@ -100,6 +102,7 @@
Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
RuntimeInstance velocityRuntime,
+ @MailTemplates SoyTofu soyTofu,
EmailSettings settings,
@SshAdvertisedAddresses List<String> sshAddresses,
DynamicSet<OutgoingEmailValidationListener> outgoingEmailValidationListeners,
@@ -128,6 +131,7 @@
this.db = db;
this.changeDataFactory = changeDataFactory;
this.velocityRuntime = velocityRuntime;
+ this.soyTofu = soyTofu;
this.settings = settings;
this.sshAddresses = sshAddresses;
this.outgoingEmailValidationListeners = outgoingEmailValidationListeners;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailSoyTofuProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailSoyTofuProvider.java
new file mode 100644
index 0000000..320c09b
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailSoyTofuProvider.java
@@ -0,0 +1,80 @@
+// 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.mail;
+
+import com.google.common.io.CharStreams;
+import com.google.common.io.Resources;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.Singleton;
+
+import com.google.template.soy.SoyFileSet;
+import com.google.template.soy.tofu.SoyTofu;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.lang.ClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.charset.StandardCharsets;
+
+/** Configures Soy Tofu object for rendering email templates. */
+@Singleton
+public class MailSoyTofuProvider implements Provider<SoyTofu> {
+
+ // Note: will fail to construct the tofu object if this array is empty.
+ private static final String[] TEMPLATES = {
+ "footer.soy",
+ };
+
+ private final SitePaths site;
+
+ @Inject
+ MailSoyTofuProvider(SitePaths site) {
+ this.site = site;
+ }
+
+ @Override
+ public SoyTofu get() throws ProvisionException {
+ SoyFileSet.Builder builder = new SoyFileSet.Builder();
+ for (String name : TEMPLATES) {
+ addTemplate(builder, name);
+ }
+ return builder.build().compileToTofu();
+ }
+
+ private void addTemplate(SoyFileSet.Builder builder, String name)
+ throws ProvisionException {
+ // Load as a file in the mail templates directory if present.
+ Path tmpl = site.mail_dir.resolve(name);
+ if (Files.isRegularFile(tmpl)) {
+ String content;
+ try (Reader r = Files.newBufferedReader(tmpl, StandardCharsets.UTF_8)) {
+ content = CharStreams.toString(r);
+ } catch (IOException err) {
+ throw new ProvisionException("Failed to read template file " +
+ tmpl.toAbsolutePath().toString(), err);
+ }
+ builder.add(content, tmpl.toAbsolutePath().toString());
+ return;
+ }
+
+ // Otherwise load the template as a resource.
+ String resourcePath = "com/google/gerrit/server/mail/" + name;
+ builder.add(Resources.getResource(resourcePath));
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailTemplates.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailTemplates.java
new file mode 100644
index 0000000..72fdaae
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailTemplates.java
@@ -0,0 +1,25 @@
+// 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.mail;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.inject.BindingAnnotation;
+
+import java.lang.annotation.Retention;
+
+@Retention(RUNTIME)
+@BindingAnnotation
+public @interface MailTemplates {}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/OutgoingEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/OutgoingEmail.java
index 6200688..bc234ec 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/OutgoingEmail.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/OutgoingEmail.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// 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.
@@ -28,6 +28,7 @@
import com.google.gerrit.server.validators.OutgoingEmailValidationListener;
import com.google.gerrit.server.validators.ValidationException;
import com.google.gwtorm.server.OrmException;
+import com.google.template.soy.tofu.SoyTofu;
import org.apache.commons.lang.StringUtils;
import org.apache.velocity.Template;
@@ -65,7 +66,7 @@
private Address smtpFromAddress;
private StringBuilder body;
protected VelocityContext velocityContext;
-
+ protected Map<String, Object> soyContext;
protected final EmailArguments args;
protected Account.Id fromId;
protected NotifyHandling notify = NotifyHandling.ALL;
@@ -164,6 +165,7 @@
*/
protected void init() throws EmailException {
setupVelocityContext();
+ setupSoyContext();
smtpFromAddress = args.fromAddressGenerator.from(fromId);
setHeader("Date", new Date());
@@ -428,6 +430,11 @@
velocityContext.put("StringUtils", StringUtils.class);
}
+ protected void setupSoyContext() {
+ soyContext = new LinkedHashMap<String, Object>();
+ // TODO(wyatta): set data here.
+ }
+
protected String velocify(String template) throws EmailException {
try {
RuntimeInstance runtime = args.velocityRuntime;
@@ -463,6 +470,13 @@
}
}
+ protected String soyFile(String name) throws EmailException {
+ return args.soyTofu
+ .newRenderer("com.google.gerrit.server.mail.template." + name)
+ .setData(soyContext)
+ .render();
+ }
+
public String joinStrings(Iterable<Object> in, String joiner) {
return joinStrings(in.iterator(), joiner);
}
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/FileResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/FileResource.java
index 47942be..82ea155 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/FileResource.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/FileResource.java
@@ -14,16 +14,39 @@
package com.google.gerrit.server.project;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestResource;
import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.TypeLiteral;
import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.TreeWalk;
+
+import java.io.IOException;
public class FileResource implements RestResource {
public static final TypeLiteral<RestView<FileResource>> FILE_KIND =
new TypeLiteral<RestView<FileResource>>() {};
+ public static FileResource create(GitRepositoryManager repoManager,
+ ProjectControl project, ObjectId rev, String path)
+ throws ResourceNotFoundException, IOException {
+ try (Repository repo =
+ repoManager.openRepository(project.getProject().getNameKey());
+ RevWalk rw = new RevWalk(repo)) {
+ RevTree tree = rw.parseTree(rev);
+ if (TreeWalk.forPath(repo, path, tree) != null) {
+ return new FileResource(project, rev, path);
+ }
+ }
+ throw new ResourceNotFoundException(IdString.fromDecoded(path));
+ }
+
private final ProjectControl project;
private final ObjectId rev;
private final String path;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesCollection.java
index d0460d5..dcb8747 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesCollection.java
@@ -19,19 +19,25 @@
import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.jgit.lib.ObjectId;
+import java.io.IOException;
+
@Singleton
public class FilesCollection implements
ChildCollection<BranchResource, FileResource> {
private final DynamicMap<RestView<FileResource>> views;
+ private final GitRepositoryManager repoManager;
@Inject
- FilesCollection(DynamicMap<RestView<FileResource>> views) {
+ FilesCollection(DynamicMap<RestView<FileResource>> views,
+ GitRepositoryManager repoManager) {
this.views = views;
+ this.repoManager = repoManager;
}
@Override
@@ -40,11 +46,10 @@
}
@Override
- public FileResource parse(BranchResource parent, IdString id) {
- return new FileResource(
- parent.getControl(),
- ObjectId.fromString(parent.getRevision()),
- id.get());
+ public FileResource parse(BranchResource parent, IdString id)
+ throws ResourceNotFoundException, IOException {
+ return FileResource.create(repoManager, parent.getControl(),
+ ObjectId.fromString(parent.getRevision()), id.get());
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesInCommitCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesInCommitCollection.java
index 8e0aab8..64a5fb2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesInCommitCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/FilesInCommitCollection.java
@@ -19,17 +19,24 @@
import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Patch;
+import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import java.io.IOException;
+
@Singleton
public class FilesInCommitCollection implements
ChildCollection<CommitResource, FileResource> {
private final DynamicMap<RestView<FileResource>> views;
+ private final GitRepositoryManager repoManager;
@Inject
- FilesInCommitCollection(DynamicMap<RestView<FileResource>> views) {
+ FilesInCommitCollection(DynamicMap<RestView<FileResource>> views,
+ GitRepositoryManager repoManager) {
this.views = views;
+ this.repoManager = repoManager;
}
@Override
@@ -39,8 +46,13 @@
@Override
public FileResource parse(CommitResource parent, IdString id)
- throws ResourceNotFoundException {
- return new FileResource(parent.getProject(), parent.getCommit(), id.get());
+ throws ResourceNotFoundException, IOException {
+ if (Patch.COMMIT_MSG.equals(id.get())) {
+ return new FileResource(parent.getProject(), parent.getCommit(),
+ id.get());
+ }
+ return FileResource.create(repoManager, parent.getProject(),
+ parent.getCommit(), id.get());
}
@Override
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/query/change/ChangeData.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
index a260d02..6526d3c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
@@ -784,8 +784,16 @@
if (c == null) {
currentApprovals = Collections.emptyList();
} else {
- currentApprovals = ImmutableList.copyOf(approvalsUtil.byPatchSet(
- db, changeControl(), c.currentPatchSetId()));
+ try {
+ currentApprovals = ImmutableList.copyOf(approvalsUtil.byPatchSet(
+ db, changeControl(), c.currentPatchSetId()));
+ } catch (OrmException e) {
+ if (e.getCause() instanceof NoSuchChangeException) {
+ currentApprovals = Collections.emptyList();
+ } else {
+ throw e;
+ }
+ }
}
}
return currentApprovals;
@@ -1002,9 +1010,18 @@
mergeable = true;
} else {
PatchSet ps = currentPatchSet();
- if (ps == null || !changeControl().isPatchVisible(ps, db)) {
- return null;
+ try {
+ if (ps == null || !changeControl().isPatchVisible(ps, db)) {
+ return null;
+ }
+ } catch (OrmException e) {
+ if (e.getCause() instanceof NoSuchChangeException) {
+ return null;
+ } else {
+ throw e;
+ }
}
+
try (Repository repo = repoManager.openRepository(project())) {
Ref ref = repo.getRefDatabase().exactRef(c.getDest().get());
SubmitTypeRecord str = submitTypeRecord();
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/main/resources/com/google/gerrit/server/mail/footer.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/footer.soy
new file mode 100644
index 0000000..6800bb7
--- /dev/null
+++ b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/footer.soy
@@ -0,0 +1,24 @@
+/**
+ * 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.
+*/
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The footer template will determine the contents of the footer text
+ * appended to the end of all outgoing emails after the ChangeFooter and
+ * CommentFooter.
+ */
+{template .footer}
+{/template}
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 aaef023..efdf0eb 100644
--- a/lib/BUCK
+++ b/lib/BUCK
@@ -15,6 +15,7 @@
define_license(name = 'fetch')
define_license(name = 'h2')
define_license(name = 'highlightjs')
+define_license(name = 'icu4j')
define_license(name = 'jgit')
define_license(name = 'jsch')
define_license(name = 'MPL1.1')
@@ -59,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(
@@ -88,7 +90,11 @@
# Whitelist lib targets that have jsr305 as a dependency. Generally speaking
# Gerrit core should not depend on these annotations, and instead use
# equivalent annotations in com.google.gerrit.common.
- visibility = ['//lib:guava-retrying'],
+ visibility = [
+ '//gerrit-plugin-api:lib',
+ '//lib:guava-retrying',
+ '//lib:soy',
+ ],
)
maven_jar(
@@ -271,3 +277,34 @@
license = 'Apache2.0',
repository = GERRIT,
)
+
+# Keep this version of Soy synchronized with the version used in Gitiles.
+maven_jar(
+ name = 'soy',
+ id = 'com.google.template:soy:2016-08-09',
+ sha1 = '43d33651e95480d515fe26c10a662faafe3ad1e4',
+ license = 'Apache2.0',
+ deps = [
+ ':args4j',
+ ':guava',
+ ':gson',
+ ':icu4j',
+ ':jsr305',
+ ':protobuf',
+ '//lib/guice:guice',
+ '//lib/guice:guice-assistedinject',
+ '//lib/guice:multibindings',
+ '//lib/guice:javax-inject',
+ '//lib/ow2:ow2-asm',
+ '//lib/ow2:ow2-asm-analysis',
+ '//lib/ow2:ow2-asm-commons',
+ '//lib/ow2:ow2-asm-util',
+ ],
+)
+
+maven_jar(
+ name = 'icu4j',
+ id = 'com.ibm.icu:icu4j:57.1',
+ sha1 = '198ea005f41219f038f4291f0b0e9f3259730e92',
+ license = 'icu4j',
+)
diff --git a/lib/JGIT_VERSION b/lib/JGIT_VERSION
index 58b677a..6457323 100644
--- a/lib/JGIT_VERSION
+++ b/lib/JGIT_VERSION
@@ -1,4 +1,4 @@
include_defs('//lib/maven.defs')
REPO = GERRIT # Leave here even if set to MAVEN_CENTRAL.
-VERS = '4.4.1.201607150455-r.109-g0b4751e'
+VERS = '4.4.1.201607150455-r.118-g1096652'
diff --git a/lib/LICENSE-icu4j b/lib/LICENSE-icu4j
new file mode 100644
index 0000000..90be7cd
--- /dev/null
+++ b/lib/LICENSE-icu4j
@@ -0,0 +1,385 @@
+COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later)
+
+Copyright © 1991-2016 Unicode, Inc. All rights reserved.
+Distributed under the Terms of Use in http://www.unicode.org/copyright.html
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation
+(the "Data Files") or Unicode software and any associated documentation
+(the "Software") to deal in the Data Files or Software
+without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+(a) this copyright and permission notice appear with all copies
+of the Data Files or Software, or
+(b) this copyright and permission notice appear in associated
+Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in these Data Files or Software without prior
+written authorization of the copyright holder.
+
+---------------------
+
+Third-Party Software Licenses
+
+This section contains third-party software notices and/or additional
+terms for licensed third-party software components included within ICU
+libraries.
+
+1. ICU License - ICU 1.8.1 to ICU 57.1
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2016 International Business Machines Corporation and others
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
+SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+All trademarks and registered trademarks mentioned herein are the
+property of their respective owners.
+
+2. Chinese/Japanese Word Break Dictionary Data (cjdict.txt)
+
+ # The Google Chrome software developed by Google is licensed under
+ # the BSD license. Other software included in this distribution is
+ # provided under other licenses, as set forth below.
+ #
+ # The BSD License
+ # http://opensource.org/licenses/bsd-license.php
+ # Copyright (C) 2006-2008, Google Inc.
+ #
+ # All rights reserved.
+ #
+ # Redistribution and use in source and binary forms, with or without
+ # modification, are permitted provided that the following conditions are met:
+ #
+ # Redistributions of source code must retain the above copyright notice,
+ # this list of conditions and the following disclaimer.
+ # Redistributions in binary form must reproduce the above
+ # copyright notice, this list of conditions and the following
+ # disclaimer in the documentation and/or other materials provided with
+ # the distribution.
+ # Neither the name of Google Inc. nor the names of its
+ # contributors may be used to endorse or promote products derived from
+ # this software without specific prior written permission.
+ #
+ #
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ #
+ #
+ # The word list in cjdict.txt are generated by combining three word lists
+ # listed below with further processing for compound word breaking. The
+ # frequency is generated with an iterative training against Google web
+ # corpora.
+ #
+ # * Libtabe (Chinese)
+ # - https://sourceforge.net/project/?group_id=1519
+ # - Its license terms and conditions are shown below.
+ #
+ # * IPADIC (Japanese)
+ # - http://chasen.aist-nara.ac.jp/chasen/distribution.html
+ # - Its license terms and conditions are shown below.
+ #
+ # ---------COPYING.libtabe ---- BEGIN--------------------
+ #
+ # /*
+ # * Copyrighy (c) 1999 TaBE Project.
+ # * Copyright (c) 1999 Pai-Hsiang Hsiao.
+ # * All rights reserved.
+ # *
+ # * Redistribution and use in source and binary forms, with or without
+ # * modification, are permitted provided that the following conditions
+ # * are met:
+ # *
+ # * . Redistributions of source code must retain the above copyright
+ # * notice, this list of conditions and the following disclaimer.
+ # * . Redistributions in binary form must reproduce the above copyright
+ # * notice, this list of conditions and the following disclaimer in
+ # * the documentation and/or other materials provided with the
+ # * distribution.
+ # * . Neither the name of the TaBE Project nor the names of its
+ # * contributors may be used to endorse or promote products derived
+ # * from this software without specific prior written permission.
+ # *
+ # * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ # * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ # * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ # * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ # * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ # * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ # * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ # * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ # * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ # * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ # * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ # * OF THE POSSIBILITY OF SUCH DAMAGE.
+ # */
+ #
+ # /*
+ # * Copyright (c) 1999 Computer Systems and Communication Lab,
+ # * Institute of Information Science, Academia
+ # * Sinica. All rights reserved.
+ # *
+ # * Redistribution and use in source and binary forms, with or without
+ # * modification, are permitted provided that the following conditions
+ # * are met:
+ # *
+ # * . Redistributions of source code must retain the above copyright
+ # * notice, this list of conditions and the following disclaimer.
+ # * . Redistributions in binary form must reproduce the above copyright
+ # * notice, this list of conditions and the following disclaimer in
+ # * the documentation and/or other materials provided with the
+ # * distribution.
+ # * . Neither the name of the Computer Systems and Communication Lab
+ # * nor the names of its contributors may be used to endorse or
+ # * promote products derived from this software without specific
+ # * prior written permission.
+ # *
+ # * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ # * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ # * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ # * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ # * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ # * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ # * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ # * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ # * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ # * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ # * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ # * OF THE POSSIBILITY OF SUCH DAMAGE.
+ # */
+ #
+ # Copyright 1996 Chih-Hao Tsai @ Beckman Institute,
+ # University of Illinois
+ # c-tsai4@uiuc.edu http://casper.beckman.uiuc.edu/~c-tsai4
+ #
+ # ---------------COPYING.libtabe-----END--------------------------------
+ #
+ #
+ # ---------------COPYING.ipadic-----BEGIN-------------------------------
+ #
+ # Copyright 2000, 2001, 2002, 2003 Nara Institute of Science
+ # and Technology. All Rights Reserved.
+ #
+ # Use, reproduction, and distribution of this software is permitted.
+ # Any copy of this software, whether in its original form or modified,
+ # must include both the above copyright notice and the following
+ # paragraphs.
+ #
+ # Nara Institute of Science and Technology (NAIST),
+ # the copyright holders, disclaims all warranties with regard to this
+ # software, including all implied warranties of merchantability and
+ # fitness, in no event shall NAIST be liable for
+ # any special, indirect or consequential damages or any damages
+ # whatsoever resulting from loss of use, data or profits, whether in an
+ # action of contract, negligence or other tortuous action, arising out
+ # of or in connection with the use or performance of this software.
+ #
+ # A large portion of the dictionary entries
+ # originate from ICOT Free Software. The following conditions for ICOT
+ # Free Software applies to the current dictionary as well.
+ #
+ # Each User may also freely distribute the Program, whether in its
+ # original form or modified, to any third party or parties, PROVIDED
+ # that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear
+ # on, or be attached to, the Program, which is distributed substantially
+ # in the same form as set out herein and that such intended
+ # distribution, if actually made, will neither violate or otherwise
+ # contravene any of the laws and regulations of the countries having
+ # jurisdiction over the User or the intended distribution itself.
+ #
+ # NO WARRANTY
+ #
+ # The program was produced on an experimental basis in the course of the
+ # research and development conducted during the project and is provided
+ # to users as so produced on an experimental basis. Accordingly, the
+ # program is provided without any warranty whatsoever, whether express,
+ # implied, statutory or otherwise. The term "warranty" used herein
+ # includes, but is not limited to, any warranty of the quality,
+ # performance, merchantability and fitness for a particular purpose of
+ # the program and the nonexistence of any infringement or violation of
+ # any right of any third party.
+ #
+ # Each user of the program will agree and understand, and be deemed to
+ # have agreed and understood, that there is no warranty whatsoever for
+ # the program and, accordingly, the entire risk arising from or
+ # otherwise connected with the program is assumed by the user.
+ #
+ # Therefore, neither ICOT, the copyright holder, or any other
+ # organization that participated in or was otherwise related to the
+ # development of the program and their respective officials, directors,
+ # officers and other employees shall be held liable for any and all
+ # damages, including, without limitation, general, special, incidental
+ # and consequential damages, arising out of or otherwise in connection
+ # with the use or inability to use the program or any product, material
+ # or result produced or otherwise obtained by using the program,
+ # regardless of whether they have been advised of, or otherwise had
+ # knowledge of, the possibility of such damages at any time during the
+ # project or thereafter. Each user will be deemed to have agreed to the
+ # foregoing by his or her commencement of use of the program. The term
+ # "use" as used herein includes, but is not limited to, the use,
+ # modification, copying and distribution of the program and the
+ # production of secondary products from the program.
+ #
+ # In the case where the program, whether in its original form or
+ # modified, was distributed or delivered to or received by a user from
+ # any person, organization or entity other than ICOT, unless it makes or
+ # grants independently of ICOT any specific warranty to the user in
+ # writing, such person, organization or entity, will also be exempted
+ # from and not be held liable to the user for any such damages as noted
+ # above as far as the program is concerned.
+ #
+ # ---------------COPYING.ipadic-----END----------------------------------
+
+3. Lao Word Break Dictionary Data (laodict.txt)
+
+ # Copyright (c) 2013 International Business Machines Corporation
+ # and others. All Rights Reserved.
+ #
+ # Project: http://code.google.com/p/lao-dictionary/
+ # Dictionary: http://lao-dictionary.googlecode.com/git/Lao-Dictionary.txt
+ # License: http://lao-dictionary.googlecode.com/git/Lao-Dictionary-LICENSE.txt
+ # (copied below)
+ #
+ # This file is derived from the above dictionary, with slight
+ # modifications.
+ # ----------------------------------------------------------------------
+ # Copyright (C) 2013 Brian Eugene Wilson, Robert Martin Campbell.
+ # All rights reserved.
+ #
+ # Redistribution and use in source and binary forms, with or without
+ # modification,
+ # are permitted provided that the following conditions are met:
+ #
+ #
+ # Redistributions of source code must retain the above copyright notice, this
+ # list of conditions and the following disclaimer. Redistributions in
+ # binary form must reproduce the above copyright notice, this list of
+ # conditions and the following disclaimer in the documentation and/or
+ # other materials provided with the distribution.
+ #
+ #
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ # OF THE POSSIBILITY OF SUCH DAMAGE.
+ # --------------------------------------------------------------------------
+
+4. Burmese Word Break Dictionary Data (burmesedict.txt)
+
+ # Copyright (c) 2014 International Business Machines Corporation
+ # and others. All Rights Reserved.
+ #
+ # This list is part of a project hosted at:
+ # github.com/kanyawtech/myanmar-karen-word-lists
+ #
+ # --------------------------------------------------------------------------
+ # Copyright (c) 2013, LeRoy Benjamin Sharon
+ # All rights reserved.
+ #
+ # Redistribution and use in source and binary forms, with or without
+ # modification, are permitted provided that the following conditions
+ # are met: Redistributions of source code must retain the above
+ # copyright notice, this list of conditions and the following
+ # disclaimer. Redistributions in binary form must reproduce the
+ # above copyright notice, this list of conditions and the following
+ # disclaimer in the documentation and/or other materials provided
+ # with the distribution.
+ #
+ # Neither the name Myanmar Karen Word Lists, nor the names of its
+ # contributors may be used to endorse or promote products derived
+ # from this software without specific prior written permission.
+ #
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
+ # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ # TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ # SUCH DAMAGE.
+ # --------------------------------------------------------------------------
+
+5. Time Zone Database
+
+ ICU uses the public domain data and code derived from Time Zone
+Database for its time zone support. The ownership of the TZ database
+is explained in BCP 175: Procedure for Maintaining the Time Zone
+Database section 7.
+
+ # 7. Database Ownership
+ #
+ # The TZ database itself is not an IETF Contribution or an IETF
+ # document. Rather it is a pre-existing and regularly updated work
+ # that is in the public domain, and is intended to remain in the
+ # public domain. Therefore, BCPs 78 [RFC5378] and 79 [RFC3979] do
+ # not apply to the TZ Database or contributions that individuals make
+ # to it. Should any claims be made and substantiated against the TZ
+ # Database, the organization that is providing the IANA
+ # Considerations defined in this RFC, under the memorandum of
+ # understanding with the IETF, currently ICANN, may act in accordance
+ # with all competent court orders. No ownership claims will be made
+ # by ICANN or the IETF Trust on the database or the code. Any person
+ # making a contribution to the database or code waives all rights to
+ # future claims in that contribution or in the TZ Database.
diff --git a/lib/guice/BUCK b/lib/guice/BUCK
index 3893b80..8022ac8 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',
@@ -12,6 +12,7 @@
exported_deps = [
':guice_library',
':javax-inject',
+ ':multibindings',
],
visibility = ['PUBLIC'],
)
@@ -19,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,
@@ -33,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,
@@ -42,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,
@@ -63,3 +64,16 @@
license = 'Apache2.0',
visibility = ['PUBLIC'],
)
+
+maven_jar(
+ name = 'multibindings',
+ id = 'com.google.inject.extensions:guice-multibindings:' + VERSION,
+ sha1 = '3b27257997ac51b0f8d19676f1ea170427e86d51',
+ exclude_java_sources = True,
+ exclude = EXCLUDE + [
+ 'META-INF/maven/com.google.guava/guava/pom.properties',
+ 'META-INF/maven/com.google.guava/guava/pom.xml',
+ ],
+ license = 'Apache2.0',
+ visibility = ['PUBLIC']
+)
diff --git a/lib/jgit/org.eclipse.jgit.archive/BUCK b/lib/jgit/org.eclipse.jgit.archive/BUCK
index fab0634..384a5e0 100644
--- a/lib/jgit/org.eclipse.jgit.archive/BUCK
+++ b/lib/jgit/org.eclipse.jgit.archive/BUCK
@@ -4,7 +4,7 @@
maven_jar(
name = 'jgit-archive',
id = 'org.eclipse.jgit:org.eclipse.jgit.archive:' + VERS,
- sha1 = '57ebfba05a6023e3d9ed48083ff0dcbac09e8047',
+ sha1 = '3f45cd199e40a7c68ee07a1743c06d1c3d07308a',
license = 'jgit',
repository = REPO,
deps = ['//lib/jgit/org.eclipse.jgit:jgit'],
diff --git a/lib/jgit/org.eclipse.jgit.http.server/BUCK b/lib/jgit/org.eclipse.jgit.http.server/BUCK
index 3371b87..2ade9ff 100644
--- a/lib/jgit/org.eclipse.jgit.http.server/BUCK
+++ b/lib/jgit/org.eclipse.jgit.http.server/BUCK
@@ -4,7 +4,7 @@
maven_jar(
name = 'jgit-servlet',
id = 'org.eclipse.jgit:org.eclipse.jgit.http.server:' + VERS,
- sha1 = '44b864259407c0fe2c7ccdeabcef79db3de5a9ea',
+ sha1 = 'fa67bf925001cfc663bf98772f37d5c5c1abd756',
license = 'jgit',
repository = REPO,
deps = ['//lib/jgit/org.eclipse.jgit:jgit'],
diff --git a/lib/jgit/org.eclipse.jgit.junit/BUCK b/lib/jgit/org.eclipse.jgit.junit/BUCK
index 68062e7..a31ee6f 100644
--- a/lib/jgit/org.eclipse.jgit.junit/BUCK
+++ b/lib/jgit/org.eclipse.jgit.junit/BUCK
@@ -4,7 +4,7 @@
maven_jar(
name = 'junit',
id = 'org.eclipse.jgit:org.eclipse.jgit.junit:' + VERS,
- sha1 = '9637d7ec4775a4e0e2467c8e951a735ad06a8c57',
+ sha1 = 'dc7edb9c3060655c7fb93ab9b9349e815bab266f',
license = 'DO_NOT_DISTRIBUTE',
repository = REPO,
unsign = True,
diff --git a/lib/jgit/org.eclipse.jgit/BUCK b/lib/jgit/org.eclipse.jgit/BUCK
index 17e3bbe..7c06726 100644
--- a/lib/jgit/org.eclipse.jgit/BUCK
+++ b/lib/jgit/org.eclipse.jgit/BUCK
@@ -4,8 +4,8 @@
maven_jar(
name = 'jgit',
id = 'org.eclipse.jgit:org.eclipse.jgit:' + VERS,
- bin_sha1 = 'de7fb6fa397b2388bfafe17b212d4fe4ad5df72a',
- src_sha1 = '30665754ae7703018251b2880e0cfba6edcbe189',
+ bin_sha1 = 'cd142b9030910babd119702f1c4eeae13ee90018',
+ src_sha1 = '3e65e476bfb4a529e18752ffcd27b566e7ee7241',
license = 'jgit',
repository = REPO,
unsign = True,
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..cad4298 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="{{_latestCommitMessage}}">
+ <gr-linked-text pre
+ content="[[_latestCommitMessage]]"
+ 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..726e7e5 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
@@ -66,7 +66,11 @@
_hideEditCommitMessage: {
type: Boolean,
computed: '_computeHideEditCommitMessage(_loggedIn, ' +
- '_editingCommitMessage, _change.*, _patchRange.patchNum)',
+ '_editingCommitMessage)',
+ },
+ _latestCommitMessage: {
+ type: String,
+ value: '',
},
_patchRange: Object,
_allPatchSets: {
@@ -78,8 +82,6 @@
value: false,
},
_loading: Boolean,
- _headerContainerEl: Object,
- _headerEl: Object,
_projectConfig: Object,
_replyButtonLabel: {
type: String,
@@ -98,10 +100,6 @@
'_paramsAndChangeChanged(params, _change)',
],
- ready: function() {
- this._headerEl = this.$$('.header');
- },
-
attached: function() {
this._getLoggedIn().then(function(loggedIn) {
this._loggedIn = loggedIn;
@@ -114,34 +112,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) {
@@ -157,7 +127,7 @@
this.$.commitMessageEditor.disabled = false;
if (!resp.ok) { return; }
- this.set('_commitInfo.message', message);
+ this._latestCommitMessage = message;
this._editingCommitMessage = false;
this._reloadWindow();
}.bind(this)).catch(function(err) {
@@ -182,18 +152,8 @@
}.bind(this));
},
- _computeHideEditCommitMessage: function(loggedIn, editing, changeRecord,
- patchNum) {
- if (!changeRecord || !loggedIn || editing) { return true; }
-
- patchNum = parseInt(patchNum, 10);
- if (isNaN(patchNum)) { return true; }
-
- var change = changeRecord.base;
- if (!change.current_revision) { return true; }
- if (change.revisions[change.current_revision]._number !== patchNum) {
- return true;
- }
+ _computeHideEditCommitMessage: function(loggedIn, editing) {
+ if (!loggedIn || editing) { return true; }
return false;
},
@@ -327,9 +287,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 +441,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) {
@@ -593,6 +545,14 @@
}.bind(this));
},
+ _getLatestCommitMessage: function() {
+ return this.$.restAPI.getChangeCommitInfo(this._changeNum,
+ this._computeLatestPatchNum(this._allPatchSets)).then(
+ function(commitInfo) {
+ this._latestCommitMessage = commitInfo.message;
+ }.bind(this));
+ },
+
_getCommitInfo: function() {
return this.$.restAPI.getChangeCommitInfo(
this._changeNum, this._patchRange.patchNum).then(
@@ -635,13 +595,12 @@
if (!this._change) { return Promise.resolve(); }
return Promise.all([
+ this._getLatestCommitMessage(),
this.$.relatedChanges.reload(),
this._getProjectConfig(),
]);
}.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..7f9fb02 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');
@@ -333,28 +332,15 @@
});
test('show commit message edit button', function() {
- var changeRecord = {
- base: {
- revisions: {
- rev1: {_number: 1},
- rev2: {_number: 2},
- },
- current_revision: 'rev2',
- },
- };
- assert.isTrue(element._computeHideEditCommitMessage(
- false, false, changeRecord, '2'));
- assert.isTrue(element._computeHideEditCommitMessage(
- true, true, changeRecord, '2'));
- assert.isTrue(element._computeHideEditCommitMessage(
- true, false, changeRecord, '1'));
- assert.isFalse(element._computeHideEditCommitMessage(
- true, false, changeRecord, '2'));
+ assert.isTrue(element._computeHideEditCommitMessage(false, false));
+ assert.isTrue(element._computeHideEditCommitMessage(true, true));
+ assert.isTrue(element._computeHideEditCommitMessage(false, true));
+ assert.isFalse(element._computeHideEditCommitMessage(true, false));
});
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',