Merge "Focus and tab between diff preferences inputs"
diff --git a/.buckconfig b/.buckconfig
index 820e557..60fd02a 100644
--- a/.buckconfig
+++ b/.buckconfig
@@ -20,9 +20,12 @@
[java]
jar_spool_mode = direct_to_jar
src_roots = java, resources, src
+ source_level = 8
+ target_level = 8
[project]
- ignore = .git, eclipse-out, bazel-gerrit
+ allow_symlinks = allow
+ ignore = .git, eclipse-out, bazel-gerrit, bin
parallel_parsing = true
[cache]
diff --git a/.buckversion b/.buckversion
index f5fe016..efb68ecf 100644
--- a/.buckversion
+++ b/.buckversion
@@ -1 +1 @@
-e64a2e2ada022f81e42be750b774024469551398
+fd3105a0b62899f74662f4cdc156de6990bdc24c
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 828234b..fd57ff7 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -7,9 +7,9 @@
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -113,7 +113,7 @@
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.processAnnotations=enabled
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
diff --git a/BUILD b/BUILD
new file mode 100644
index 0000000..28dd0f5
--- /dev/null
+++ b/BUILD
@@ -0,0 +1,14 @@
+load('//tools/bzl:genrule2.bzl', 'genrule2')
+load('//tools/bzl:pkg_war.bzl', 'pkg_war')
+
+genrule2(
+ name = 'version',
+ srcs = ['VERSION'],
+ cmd = "grep GERRIT_VERSION $< | cut -d \"'\" -f 2 >$@",
+ out = 'version.txt',
+ visibility = ['//visibility:public'],
+)
+
+pkg_war(name = 'gerrit')
+pkg_war(name = 'headless', ui = None)
+
diff --git a/Documentation/access-control.txt b/Documentation/access-control.txt
index d48034a..3af3bca 100644
--- a/Documentation/access-control.txt
+++ b/Documentation/access-control.txt
@@ -635,10 +635,10 @@
allowed to upload new patch sets for their changes. This permission needs to be
set on `refs/for/*`.
-The absence of this permission will prevent users from uploading a
-patch set to a change they do not own. By default, this permission is granted to
-`Registered Users` on `refs/for/*` allowing all registered users to upload a new
-patch set to any change on that ref.
+By default, this permission is granted to `Registered Users` on `refs/for/*`,
+allowing all registered users to upload a new patch set to any change. Revoking
+this permission (by granting it to no groups and setting the "Exclusive" flag)
+will prevent users from uploading a patch set to a change they do not own.
[[category_push_merge]]
@@ -887,6 +887,14 @@
can always edit or remove hashtags (even without having the `Edit Hashtags`
access right assigned).
+[[category_edit_assigned_to]]
+=== Edit Assignee
+
+This category permits users to set who is assigned to a change that is
+uploaded for review.
+
+The change owner, ref owners, and the user currently assigned to a change
+can always change the assignee.
[[example_roles]]
== Examples of typical roles in a project
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index d453f7b..8661d40 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -1412,6 +1412,33 @@
+
Default is true.
+[[core.repositoryCacheCleanupDelay]]core.repositoryCacheCleanupDelay::
++
+Delay between each periodic cleanup of expired repositories.
++
+Values can be specified using standard time unit abbreviations (`ms`, `sec`,
+`min`, etc.).
++
+Set it to 0 in order to switch off cache expiration. If cache expiration is
+switched off, the JVM can still evict cache entries when it is running low
+on available heap memory.
++
+Set it to -1 to automatically derive cleanup delay from
+`core.repositoryCacheExpireAfter` (lowest value between 1/10 of
+`core.repositoryCacheExpireAfter` and 10 minutes).
++
+Default is -1.
+
+[[core.repositoryCacheExpireAfter]]core.repositoryCacheExpireAfter::
++
+Time an unused repository should expire and be evicted from the repository
+cache.
++
+Values can be specified using standard time unit abbreviations (`ms`, `sec`,
+`min`, etc.).
++
+Default is 1 hour.
+
[[database]]
=== Section database
@@ -3300,6 +3327,14 @@
+
By default, true, allowing notifications to be sent.
+[[sendemail.html]]sendemail.html::
++
+If false, Gerrit will only send plain-text emails.
+If true, Gerrit will send multi-part emails with an HTML and
+plain text part.
++
+By default, true, allowing HTML in the emails Gerrit sends.
+
[[sendemail.connectTimeout]]sendemail.connectTimeout::
+
The connection timeout of opening a socket connected to a
diff --git a/Documentation/dev-buck.txt b/Documentation/dev-buck.txt
index 315c0b0..219da7e 100644
--- a/Documentation/dev-buck.txt
+++ b/Documentation/dev-buck.txt
@@ -3,7 +3,7 @@
== Installation
-You need to use Java 7 and Node.js for building gerrit.
+You need to use Java 8 and Node.js for building gerrit.
There is currently no binary distribution of Buck, so it has to be manually
built and installed. Apache Ant and gcc are required. Currently only Linux
@@ -547,7 +547,7 @@
----
cat > .buckjavaargs <<EOF
- -XX:MaxPermSize=512m -Xms8000m -Xmx16000m
+ -Xms8000m -Xmx16000m
EOF
----
diff --git a/Documentation/dev-plugins.txt b/Documentation/dev-plugins.txt
index ecea83f..3260e23 100644
--- a/Documentation/dev-plugins.txt
+++ b/Documentation/dev-plugins.txt
@@ -1112,6 +1112,10 @@
+
Panel will be shown below the related info block.
+** `GerritUiExtensionPoint.CHANGE_SCREEN_HISTORY_RIGHT_OF_BUTTONS`:
++
+Panel will be shown in the history bar on the right side of the buttons.
+
** The following parameters are provided:
*** `GerritUiExtensionPoint.Key.CHANGE_INFO`:
+
diff --git a/Documentation/dev-release-deploy-config.txt b/Documentation/dev-release-deploy-config.txt
index 900e95c..d43c863 100644
--- a/Documentation/dev-release-deploy-config.txt
+++ b/Documentation/dev-release-deploy-config.txt
@@ -89,17 +89,15 @@
To upload artifacts to a bucket the user must authenticate with a
username and password. The username and password need to be retrieved
-from the link:https://console.developers.google.com/project/164060093628[
-Google Developers Console]:
+from the link:https://console.cloud.google.com/storage/settings?project=api-project-164060093628[
+Storage Setting in the Google Cloud Platform Console]:
-* In the menu on the left select `Storage` -> `Cloud Storage` >
-> `Storage access`
-* Select the `Interoperability` tab
-* If no keys are listed under `Interoperable storage access keys`, select "Create a new key"
-* Use the `Access Key` as username, and `Secret` as the password
+Select the `Interoperability` tab, and if no keys are listed under
+`Interoperable storage access keys`, select 'Create a new key'.
-To make the username and password known to Maven, they must be
-configured in the `~/.m2/settings.xml` file.
+Using `Access Key` as username and `Secret` as the password, add the
+configuration in the `~/.m2/settings.xml` file to make the credentials
+known to Maven:
----
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
diff --git a/Documentation/install-quick.txt b/Documentation/install-quick.txt
index 2623256..a8115db 100644
--- a/Documentation/install-quick.txt
+++ b/Documentation/install-quick.txt
@@ -26,14 +26,14 @@
----
$ java -version
- java version "1.7.0_21"
- Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
- Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)
+ openjdk version "1.8.0_72"
+ OpenJDK Runtime Environment (build 1.8.0_72-b15)
+ OpenJDK 64-Bit Server VM (build 25.72-b15, mixed mode)
----
If Java isn't installed, get it:
-* JDK, minimum version 1.7 http://www.oracle.com/technetwork/java/javase/downloads/index.html[Download]
+* JDK, minimum version 1.8 http://www.oracle.com/technetwork/java/javase/downloads/index.html[Download]
[[user]]
diff --git a/Documentation/install.txt b/Documentation/install.txt
index e3fb28d..44f6189 100644
--- a/Documentation/install.txt
+++ b/Documentation/install.txt
@@ -5,7 +5,7 @@
To run the Gerrit service, the following requirements must be met on
the host:
-* JDK, minimum version 1.7 http://www.oracle.com/technetwork/java/javase/downloads/index.html[Download]
+* JDK, minimum version 1.8 http://www.oracle.com/technetwork/java/javase/downloads/index.html[Download]
You'll also need an SQL database to house the review metadata. You have the
choice of either using the embedded H2 or to host your own MySQL or PostgreSQL.
diff --git a/Documentation/rest-api-changes.txt b/Documentation/rest-api-changes.txt
index e28332c..cce00ef 100644
--- a/Documentation/rest-api-changes.txt
+++ b/Documentation/rest-api-changes.txt
@@ -1275,6 +1275,10 @@
link:#current-revision[`CURRENT_REVISION`], and
link:#current-commit[`CURRENT_COMMIT`] options set.
+Standard link:#query-options[formatting options] can be specified
+with the `o` parameter, as well as the `submitted_together` specific
+option `NON_VISIBLE_CHANGES`.
+
.Response
----
HTTP/1.1 200 OK
diff --git a/Documentation/rest-api-config.txt b/Documentation/rest-api-config.txt
index 454a30d..de21034 100644
--- a/Documentation/rest-api-config.txt
+++ b/Documentation/rest-api-config.txt
@@ -123,7 +123,10 @@
"gerrit": {
"all_projects": "All-Projects",
"all_users": "All-Users"
- "doc_search": true
+ "doc_search": true,
+ "web_uis": [
+ "gwt"
+ ]
},
"sshd": {},
"suggest": {
@@ -1469,6 +1472,9 @@
|`report_bug_text` |optional, not set if default|
link:config-gerrit.html#gerrit.reportBugText[Display text for report
bugs link].
+|`web_uis` ||
+List of web UIs supported by the HTTP server. Possible values are `GWT`
+and `POLYGERRIT`.
|=================================
[[hit-ration-info]]
diff --git a/ReleaseNotes/ReleaseNotes-2.13.txt b/ReleaseNotes/ReleaseNotes-2.13.txt
index d73a1bd..b875603 100644
--- a/ReleaseNotes/ReleaseNotes-2.13.txt
+++ b/ReleaseNotes/ReleaseNotes-2.13.txt
@@ -327,6 +327,18 @@
capability, or to ensure that specific groups always have administration
capabilities.
+* New configuration options to configure JGit repository cache parameters.
++
+link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.13/config-gerrit.html#core.repositoryCacheCleanupDelay[
+core.repositoryCacheCleanupDelay] and
+link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.13/config-gerrit.html#core.repositoryCacheExpireAfter[
+core.repositoryCacheExpireAfter] can be configured.
+
+* Accept `-b` as an alias of `--batch` in the
+link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.13/pgm-init.html[
+init program].
+
+
== Bug Fixes
* Don't add the same SSH key multiple times.
@@ -400,6 +412,22 @@
easier to track down which commit failed validation when multiple commits
are pushed at the same time.
+* Don't check mergeability of draft changes.
++
+Draft changes can be deleted but not abandoned so there is no way for
+an administrator to get rid of the them on behalf of the users. This can
+become a problem when there many draft changes because the mergeability
+check can be costly.
++
+The mergeability check is no longer done for draft changes, but will be
+done when the draft change is published.
+
+* Fix internal server error when plugin-provided file history weblink
+is null.
++
+It is valid for a plugin to provide a null weblink, but doing so resulted
+in an internal server error.
+
== Dependency updates
* Add dependency on blame-cache 0.1-9
@@ -430,7 +458,7 @@
* Upgrade Jetty to 9.2.14.v20151106
-* Upgrade JGit to 4.4.1.201607150455-r.144-gb67df51
+* Upgrade JGit to 4.5.0.201609210915-r
* Upgrade joda-convert to 1.8.1
diff --git a/WORKSPACE b/WORKSPACE
index 5d7386c..77d6dbc 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -118,6 +118,12 @@
sha1 = 'cdb2dcb4e22b83d6b32b93095f644c3462739e82',
)
+http_jar(
+ name = "javax_validation_src",
+ url = "http://repo1.maven.org/maven2/javax/validation/validation-api/1.0.0.GA/validation-api-1.0.0.GA-sources.jar",
+ sha256 = 'a394d52a9b7fe2bb14f0718d2b3c8308ffe8f37e911956012398d55c9f9f9b54',
+)
+
JGIT_VERS = '4.4.1.201607150455-r.118-g1096652'
maven_jar(
@@ -165,14 +171,14 @@
maven_jar(
name = 'gwtjsonrpc',
- artifact = 'com.google.gerrit:gwtjsonrpc:1.10',
- sha1 = '25adea6ef102b761993688e80dfc7203e0f5edf0',
+ artifact = 'com.google.gerrit:gwtjsonrpc:1.11',
+ sha1 = '0990e7eec9eec3a15661edcf9232acbac4aeacec',
)
http_jar(
name = 'gwtjsonrpc_src',
- sha256 = '009c4c7574eaddf49d2c72dd015cfbd5b495fbeea4c3958c2ec548af2c186733',
- url = 'http://repo.maven.apache.org/maven2/com/google/gerrit/gwtjsonrpc/1.10/gwtjsonrpc-1.10-sources.jar',
+ sha256 = 'fc503488872c022073e244015fcb6806a64b65afe546bdac2db167a3875fb418',
+ url = 'http://repo.maven.apache.org/maven2/com/google/gerrit/gwtjsonrpc/1.11/gwtjsonrpc-1.11-sources.jar',
)
maven_jar(
@@ -183,14 +189,14 @@
maven_jar(
name = 'gwtorm_client',
- artifact = 'com.google.gerrit:gwtorm:1.15',
- sha1 = '26a2459f543ed78977535f92e379dc0d6cdde8bb',
+ artifact = 'com.google.gerrit:gwtorm:1.16',
+ sha1 = '3e41b6d7bb352fa0539ce23b9bce97cf8c26c3bf',
)
http_jar(
name = 'gwtorm_client_src',
- sha256 = 'e0cf9382ed8c3cd1f0884ab77dabe634a04546676c4960d8b4c4b64a20132ef6',
- url = 'http://repo.maven.apache.org/maven2/com/google/gerrit/gwtorm/1.15/gwtorm-1.15-sources.jar',
+ sha256 = 'd3e482c9ac1f828aa853debe6545c16503fbbde3bda94b18f652d9830b7f84b1',
+ url = 'http://repo.maven.apache.org/maven2/com/google/gerrit/gwtorm/1.16/gwtorm-1.16-sources.jar',
)
maven_jar(
@@ -583,8 +589,8 @@
maven_jar(
name = 'jimfs',
- artifact = 'com.google.jimfs:jimfs:1.0',
- sha1 = 'edd65a2b792755f58f11134e76485a928aab4c97',
+ artifact = 'com.google.jimfs:jimfs:1.1',
+ sha1 = '8fbd0579dc68aba6186935cc1bee21d2f3e7ec1c',
)
maven_jar(
@@ -673,60 +679,60 @@
sha1 = 'df4b50061e8e4c348ce243b921f53ee63ba9bbe1',
)
-JETTY_VERS = '9.2.14.v20151106'
+JETTY_VERS = '9.3.11.v20160721'
maven_jar(
name = 'jetty_servlet',
artifact = 'org.eclipse.jetty:jetty-servlet:' + JETTY_VERS,
- sha1 = '3a2cd4d8351a38c5d60e0eee010fee11d87483ef',
+ sha1 = 'd550147b85c73ea81084a4ac7915ba7f609021c5',
)
maven_jar(
name = 'jetty_security',
artifact = 'org.eclipse.jetty:jetty-security:' + JETTY_VERS,
- sha1 = '2d36974323fcb31e54745c1527b996990835db67',
+ sha1 = '1cbefc5d1196b9e1ca6f4cc36738998a6ebde8bf',
)
maven_jar(
name = 'jetty_servlets',
artifact = 'org.eclipse.jetty:jetty-servlets:' + JETTY_VERS,
- sha1 = 'a75c78a0ee544073457ca5ee9db20fdc6ed55225',
+ sha1 = 'a9f7a43977151a463aa21a9b0e882aa3d25452ef',
)
maven_jar(
name = 'jetty_server',
artifact = 'org.eclipse.jetty:jetty-server:' + JETTY_VERS,
- sha1 = '70b22c1353e884accf6300093362b25993dac0f5',
+ sha1 = 'd932e0dc1e9bd4839ae446754615163d60271a66',
)
maven_jar(
name = 'jetty_jmx',
artifact = 'org.eclipse.jetty:jetty-jmx:' + JETTY_VERS,
- sha1 = '617edc5e966b4149737811ef8b289cd94b831bab',
+ sha1 = '21a658d2f5eb87c23eef4911966625ea95f66d32',
)
maven_jar(
name = 'jetty_continuation',
artifact = 'org.eclipse.jetty:jetty-continuation:' + JETTY_VERS,
- sha1 = '8909d62fd7e28351e2da30de6fb4105539b949c0',
+ sha1 = '92a91c0dcc5f5d779a1c9f94038332be3f46c9df',
)
maven_jar(
name = 'jetty_http',
artifact = 'org.eclipse.jetty:jetty-http:' + JETTY_VERS,
- sha1 = '699ad1f2fa6fb0717e1b308a8c9e1b8c69d81ef6',
+ sha1 = 'dcfb95e5b886a981bb76467b911c5b706117f9cf',
)
maven_jar(
name = 'jetty_io',
artifact = 'org.eclipse.jetty:jetty-io:' + JETTY_VERS,
- sha1 = 'dfa4137371a3f08769820138ca1a2184dacda267',
+ sha1 = 'db5f4f481159894a4b670072a34917b5414d0c98',
)
maven_jar(
name = 'jetty_util',
artifact = 'org.eclipse.jetty:jetty-util:' + JETTY_VERS,
- sha1 = '0057e00b912ae0c35859ac81594a996007706a0b',
+ sha1 = '1812ffd5a04698051180d582c146ca807760c808',
)
maven_jar(
@@ -746,3 +752,29 @@
artifact = 'xerces:xercesImpl:2.8.1',
sha1 = '25101e37ec0c907db6f0612cbf106ee519c1aef1',
)
+
+maven_jar(
+ name = 'postgresql',
+ artifact = 'postgresql:postgresql:9.1-901-1.jdbc4',
+ sha1 = '9bfabe48876ec38f6cbaa6931bad05c64a9ea942',
+)
+
+CM_VERSION = '5.18.2'
+
+maven_jar(
+ name = 'codemirror_minified',
+ artifact = 'org.webjars.npm:codemirror-minified:' + CM_VERSION,
+ sha1 = '6755af157a7eaf2401468906bef67bbacc3c97f6',
+)
+
+maven_jar(
+ name = 'codemirror_original',
+ artifact = 'org.webjars.npm:codemirror:' + CM_VERSION,
+ sha1 = '18c721ae88eed27cddb458c42f5d221fa3d9713e',
+)
+
+maven_jar(
+ name = 'diff_match_patch',
+ artifact = 'org.webjars:google-diff-match-patch:20121119-1',
+ sha1 = '0cf1782dbcb8359d95070da9176059a5a9d37709',
+)
diff --git a/gerrit-acceptance-framework/BUILD b/gerrit-acceptance-framework/BUILD
index 934e8d1..58c13f5 100644
--- a/gerrit-acceptance-framework/BUILD
+++ b/gerrit-acceptance-framework/BUILD
@@ -59,3 +59,12 @@
],
visibility = ['//visibility:public'],
)
+
+load('//tools/bzl:javadoc.bzl', 'java_doc')
+
+java_doc(
+ name = 'acceptance-framework-javadoc',
+ title = 'Gerrit Acceptance Test Framework Documentation',
+ libs = [':lib'],
+ pkgs = ['com.google.gerrit.acceptance'],
+)
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
index 1afb374..82de9f8 100644
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
+++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
@@ -17,10 +17,11 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.gerrit.acceptance.GitUtil.initSsh;
import static com.google.gerrit.extensions.api.changes.SubmittedTogetherOption.NON_VISIBLE_CHANGES;
+import static com.google.gerrit.reviewdb.client.Patch.COMMIT_MSG;
+import static com.google.gerrit.reviewdb.client.Patch.MERGE_LIST;
import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
import static org.eclipse.jgit.lib.Constants.HEAD;
-import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
@@ -49,6 +50,8 @@
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.extensions.common.ActionInfo;
import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeType;
+import com.google.gerrit.extensions.common.DiffInfo;
import com.google.gerrit.extensions.common.EditInfo;
import com.google.gerrit.extensions.restapi.BinaryResult;
import com.google.gerrit.extensions.restapi.IdString;
@@ -68,6 +71,7 @@
import com.google.gerrit.server.account.GroupCache;
import com.google.gerrit.server.change.Abandon;
import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.FileContentUtil;
import com.google.gerrit.server.change.RevisionResource;
import com.google.gerrit.server.change.Revisions;
import com.google.gerrit.server.config.AllProjectsName;
@@ -547,21 +551,26 @@
protected PushOneCommit.Result createMergeCommitChange(String ref)
throws Exception {
+ return createMergeCommitChange(ref, "foo");
+ }
+
+ protected PushOneCommit.Result createMergeCommitChange(String ref, String file)
+ throws Exception {
ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
PushOneCommit.Result p1 = pushFactory.create(db, admin.getIdent(),
- testRepo, "parent 1", ImmutableMap.of("foo", "foo-1", "bar", "bar-1"))
+ testRepo, "parent 1", ImmutableMap.of(file, "foo-1", "bar", "bar-1"))
.to(ref);
// reset HEAD in order to create a sibling of the first change
testRepo.reset(initial);
PushOneCommit.Result p2 = pushFactory.create(db, admin.getIdent(),
- testRepo, "parent 2", ImmutableMap.of("foo", "foo-2", "bar", "bar-2"))
+ testRepo, "parent 2", ImmutableMap.of(file, "foo-2", "bar", "bar-2"))
.to(ref);
PushOneCommit m = pushFactory.create(db, admin.getIdent(), testRepo, "merge",
- ImmutableMap.of("foo", "foo-1", "bar", "bar-2"));
+ ImmutableMap.of(file, "foo-1", "bar", "bar-2"));
m.setParents(ImmutableList.of(p1.getCommit(), p2.getCommit()));
PushOneCommit.Result result = m.to(ref);
result.assertOkStatus();
@@ -887,13 +896,7 @@
}
private static Iterable<String> changeIds(Iterable<ChangeInfo> changes) {
- return Iterables.transform(changes,
- new Function<ChangeInfo, String>() {
- @Override
- public String apply(ChangeInfo input) {
- return input.changeId;
- }
- });
+ return Iterables.transform(changes, i -> i.changeId);
}
protected void assertSubmittedTogether(String chId, String... expected)
@@ -1093,4 +1096,45 @@
}
assertThat(refValues.keySet()).containsAnyIn(trees.keySet());
}
+
+ protected void assertDiffForNewFile(DiffInfo diff, RevCommit commit,
+ String path, String expectedContentSideB) throws Exception {
+ List<String> expectedLines = new ArrayList<>();
+ for (String line : expectedContentSideB.split("\n")) {
+ expectedLines.add(line);
+ }
+
+ assertThat(diff.binary).isNull();
+ assertThat(diff.changeType).isEqualTo(ChangeType.ADDED);
+ assertThat(diff.diffHeader).isNotNull();
+ assertThat(diff.intralineStatus).isNull();
+ assertThat(diff.webLinks).isNull();
+
+ assertThat(diff.metaA).isNull();
+ assertThat(diff.metaB).isNotNull();
+ assertThat(diff.metaB.commitId).isEqualTo(commit.name());
+
+ String expectedContentType = "text/plain";
+ if (COMMIT_MSG.equals(path)) {
+ expectedContentType = FileContentUtil.TEXT_X_GERRIT_COMMIT_MESSAGE;
+ } else if (MERGE_LIST.equals(path)) {
+ expectedContentType = FileContentUtil.TEXT_X_GERRIT_MERGE_LIST;
+ }
+ assertThat(diff.metaB.contentType).isEqualTo(expectedContentType);
+
+ assertThat(diff.metaB.lines).isEqualTo(expectedLines.size());
+ assertThat(diff.metaB.name).isEqualTo(path);
+ assertThat(diff.metaB.webLinks).isNull();
+
+ assertThat(diff.content).hasSize(1);
+ DiffInfo.ContentEntry contentEntry = diff.content.get(0);
+ assertThat(contentEntry.b).containsExactlyElementsIn(expectedLines)
+ .inOrder();
+ assertThat(contentEntry.a).isNull();
+ assertThat(contentEntry.ab).isNull();
+ assertThat(contentEntry.common).isNull();
+ assertThat(contentEntry.editA).isNull();
+ assertThat(contentEntry.editB).isNull();
+ assertThat(contentEntry.skip).isNull();
+ }
}
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
index f53202f..0783688 100644
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
+++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
@@ -27,6 +27,8 @@
import com.google.gerrit.server.config.TrackingFooters;
import com.google.gerrit.server.config.TrackingFootersProvider;
import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
+import com.google.gerrit.server.notedb.GwtormChangeBundleReader;
import com.google.gerrit.server.notedb.NotesMigration;
import com.google.gerrit.server.schema.DataSourceType;
import com.google.gerrit.server.schema.NotesMigrationSchemaFactory;
@@ -89,6 +91,7 @@
bind(Key.get(schemaFactory, ReviewDbFactory.class))
.to(InMemoryDatabase.class);
bind(InMemoryDatabase.class).in(SINGLETON);
+ bind(ChangeBundleReader.class).to(GwtormChangeBundleReader.class);
listener().to(CreateDatabase.class);
diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestAccount.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestAccount.java
index 7f08b6f..c1a815a 100644
--- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestAccount.java
+++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/TestAccount.java
@@ -14,7 +14,6 @@
package com.google.gerrit.acceptance;
-import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.server.mail.Address;
@@ -29,13 +28,7 @@
public class TestAccount {
public static FluentIterable<Account.Id> ids(
Iterable<TestAccount> accounts) {
- return FluentIterable.from(accounts)
- .transform(new Function<TestAccount, Account.Id>() {
- @Override
- public Account.Id apply(TestAccount in) {
- return in.id;
- }
- });
+ return FluentIterable.from(accounts).transform(a -> a.id);
}
public static FluentIterable<Account.Id> ids(TestAccount... accounts) {
@@ -43,13 +36,7 @@
}
public static FluentIterable<String> names(Iterable<TestAccount> accounts) {
- return FluentIterable.from(accounts)
- .transform(new Function<TestAccount, String>() {
- @Override
- public String apply(TestAccount in) {
- return in.fullName;
- }
- });
+ return FluentIterable.from(accounts).transform(a -> a.fullName);
}
public static FluentIterable<String> names(TestAccount... accounts) {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/GetMergeListIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/GetMergeListIT.java
deleted file mode 100644
index 0cb7d89..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/GetMergeListIT.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// 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.acceptance.api.change;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.eclipse.jgit.lib.Constants.HEAD;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.extensions.common.CommitInfo;
-
-import org.eclipse.jgit.lib.ObjectId;
-import org.junit.Test;
-
-import java.util.List;
-
-@NoHttpd
-public class GetMergeListIT extends AbstractDaemonTest {
-
- @Test
- public void getMergeList() throws Exception {
- ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
-
- PushOneCommit.Result gp1 = pushFactory
- .create(db, admin.getIdent(), testRepo, "grand parent 1",
- ImmutableMap.of("foo", "foo-1.1", "bar", "bar-1.1"))
- .to("refs/for/master");
-
- PushOneCommit.Result p1 = pushFactory
- .create(db, admin.getIdent(), testRepo, "parent 1",
- ImmutableMap.of("foo", "foo-1.2", "bar", "bar-1.2"))
- .to("refs/for/master");
-
- // reset HEAD in order to create a sibling of the first change
- testRepo.reset(initial);
-
- PushOneCommit.Result gp2 = pushFactory
- .create(db, admin.getIdent(), testRepo, "grand parent 1",
- ImmutableMap.of("foo", "foo-2.1", "bar", "bar-2.1"))
- .to("refs/for/master");
-
- PushOneCommit.Result p2 = pushFactory
- .create(db, admin.getIdent(), testRepo, "parent 2",
- ImmutableMap.of("foo", "foo-2.2", "bar", "bar-2.2"))
- .to("refs/for/master");
-
- PushOneCommit m = pushFactory.create(db, admin.getIdent(), testRepo,
- "merge", ImmutableMap.of("foo", "foo-1", "bar", "bar-2"));
- m.setParents(ImmutableList.of(p1.getCommit(), p2.getCommit()));
- PushOneCommit.Result result = m.to("refs/for/master");
- result.assertOkStatus();
-
- List<CommitInfo> mergeList =
- gApi.changes().id(result.getChangeId()).current().getMergeList().get();
- assertThat(mergeList).hasSize(2);
- assertThat(mergeList.get(0).commit).isEqualTo(p2.getCommit().name());
- assertThat(mergeList.get(1).commit).isEqualTo(gp2.getCommit().name());
-
- mergeList = gApi.changes().id(result.getChangeId()).current().getMergeList()
- .withUninterestingParent(2).get();
- assertThat(mergeList).hasSize(2);
- assertThat(mergeList.get(0).commit).isEqualTo(p1.getCommit().name());
- assertThat(mergeList.get(1).commit).isEqualTo(gp1.getCommit().name());
- }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/MergeListIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/MergeListIT.java
new file mode 100644
index 0000000..481df31
--- /dev/null
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/MergeListIT.java
@@ -0,0 +1,209 @@
+// 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.acceptance.api.change;
+
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.reviewdb.client.Patch.MERGE_LIST;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.eclipse.jgit.lib.Constants.HEAD;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.common.RawInputUtil;
+import com.google.gerrit.extensions.api.changes.RevisionApi;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.DiffInfo;
+import com.google.gerrit.extensions.restapi.BinaryResult;
+import com.google.gerrit.server.edit.ChangeEditModifier;
+import com.google.gerrit.server.edit.ChangeEditUtil;
+import com.google.gerrit.server.project.InvalidChangeOperationException;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.inject.Inject;
+
+import org.eclipse.jgit.dircache.InvalidPathException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.util.List;
+import java.util.Set;
+
+@NoHttpd
+public class MergeListIT extends AbstractDaemonTest {
+
+ private String changeId;
+ private RevCommit merge;
+ private RevCommit parent1;
+ private RevCommit grandParent1;
+ private RevCommit parent2;
+ private RevCommit grandParent2;
+
+ @Inject
+ private ChangeEditModifier modifier;
+
+ @Inject
+ private ChangeEditUtil editUtil;
+
+ @Before
+ public void setup() throws Exception {
+ ObjectId initial = repo().exactRef(HEAD).getLeaf().getObjectId();
+
+ PushOneCommit.Result gp1 = pushFactory
+ .create(db, admin.getIdent(), testRepo, "grand parent 1",
+ ImmutableMap.of("foo", "foo-1.1", "bar", "bar-1.1"))
+ .to("refs/for/master");
+ grandParent1 = gp1.getCommit();
+
+ PushOneCommit.Result p1 = pushFactory
+ .create(db, admin.getIdent(), testRepo, "parent 1",
+ ImmutableMap.of("foo", "foo-1.2", "bar", "bar-1.2"))
+ .to("refs/for/master");
+ parent1 = p1.getCommit();
+
+ // reset HEAD in order to create a sibling of the first change
+ testRepo.reset(initial);
+
+ PushOneCommit.Result gp2 = pushFactory
+ .create(db, admin.getIdent(), testRepo, "grand parent 2",
+ ImmutableMap.of("foo", "foo-2.1", "bar", "bar-2.1"))
+ .to("refs/for/master");
+ grandParent2 = gp2.getCommit();
+
+ PushOneCommit.Result p2 = pushFactory
+ .create(db, admin.getIdent(), testRepo, "parent 2",
+ ImmutableMap.of("foo", "foo-2.2", "bar", "bar-2.2"))
+ .to("refs/for/master");
+ parent2 = p2.getCommit();
+
+ PushOneCommit m = pushFactory.create(db, admin.getIdent(), testRepo,
+ "merge", ImmutableMap.of("foo", "foo-1", "bar", "bar-2"));
+ m.setParents(ImmutableList.of(p1.getCommit(), p2.getCommit()));
+ PushOneCommit.Result result = m.to("refs/for/master");
+ result.assertOkStatus();
+ merge = result.getCommit();
+ changeId = result.getChangeId();
+ }
+
+ @Test
+ public void getMergeList() throws Exception {
+ List<CommitInfo> mergeList = current(changeId).getMergeList().get();
+ assertThat(mergeList).hasSize(2);
+ assertThat(mergeList.get(0).commit).isEqualTo(parent2.name());
+ assertThat(mergeList.get(1).commit).isEqualTo(grandParent2.name());
+
+ mergeList = current(changeId).getMergeList()
+ .withUninterestingParent(2).get();
+ assertThat(mergeList).hasSize(2);
+ assertThat(mergeList.get(0).commit).isEqualTo(parent1.name());
+ assertThat(mergeList.get(1).commit).isEqualTo(grandParent1.name());
+ }
+
+ @Test
+ public void getMergeListContent() throws Exception {
+ BinaryResult bin = current(changeId).file(MERGE_LIST).content();
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ bin.writeTo(os);
+ String content = new String(os.toByteArray(), UTF_8);
+ assertThat(content).isEqualTo(
+ getMergeListContent(parent2, grandParent2));
+ }
+
+ @Test
+ public void getFileList() throws Exception {
+ assertThat(getFiles(changeId)).contains(MERGE_LIST);
+ assertThat(getFiles(changeId, 1)).contains(MERGE_LIST);
+ assertThat(getFiles(changeId, 2)).contains(MERGE_LIST);
+
+ assertThat(getFiles(createChange().getChangeId()))
+ .doesNotContain(MERGE_LIST);
+ }
+
+ @Test
+ public void getDiffForMergeList() throws Exception {
+ DiffInfo diff = getMergeListDiff(changeId);
+ assertDiffForNewFile(diff, merge, MERGE_LIST,
+ getMergeListContent(parent2, grandParent2));
+
+ diff = getMergeListDiff(changeId, 1);
+ assertDiffForNewFile(diff, merge, MERGE_LIST,
+ getMergeListContent(parent2, grandParent2));
+
+ diff = getMergeListDiff(changeId, 2);
+ assertDiffForNewFile(diff, merge, MERGE_LIST,
+ getMergeListContent(parent1, grandParent1));
+ }
+
+ @Test
+ public void editMergeList() throws Exception {
+ ChangeData cd = getOnlyElement(queryProvider.get().byKeyPrefix(changeId));
+ modifier.createEdit(cd.change(), cd.currentPatchSet());
+
+ exception.expect(InvalidPathException.class);
+ exception.expectMessage("Invalid path: " + MERGE_LIST);
+ modifier.modifyFile(editUtil.byChange(cd.change()).get(), MERGE_LIST,
+ RawInputUtil.create("new content"));
+ }
+
+ @Test
+ public void deleteMergeList() throws Exception {
+ ChangeData cd = getOnlyElement(queryProvider.get().byKeyPrefix(changeId));
+ modifier.createEdit(cd.change(), cd.currentPatchSet());
+
+ exception.expect(InvalidChangeOperationException.class);
+ exception.expectMessage("no changes were made");
+ modifier.deleteFile(editUtil.byChange(cd.change()).get(), MERGE_LIST);
+ }
+
+ private String getMergeListContent(RevCommit... commits) {
+ StringBuilder mergeList = new StringBuilder("Merge List:\n\n");
+ for (RevCommit c : commits) {
+ mergeList.append("* ")
+ .append(c.abbreviate(8).name())
+ .append(" ")
+ .append(c.getShortMessage())
+ .append("\n");
+ }
+ return mergeList.toString();
+ }
+
+ private Set<String> getFiles(String changeId) throws Exception {
+ return current(changeId).files().keySet();
+ }
+
+ private Set<String> getFiles(String changeId, int parent) throws Exception {
+ return current(changeId).files(parent).keySet();
+ }
+
+ private DiffInfo getMergeListDiff(String changeId) throws Exception {
+ return current(changeId).file(MERGE_LIST).diff();
+ }
+
+ private DiffInfo getMergeListDiff(String changeId, int parent)
+ throws Exception {
+ return current(changeId).file(MERGE_LIST).diff(parent);
+ }
+
+ private RevisionApi current(String changeId) throws Exception {
+ return gApi.changes()
+ .id(changeId)
+ .current();
+ }
+}
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 322cd4e..de0c3c1 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
@@ -20,11 +20,13 @@
import static com.google.gerrit.acceptance.PushOneCommit.PATCH;
import static com.google.gerrit.acceptance.PushOneCommit.SUBJECT;
import static com.google.gerrit.reviewdb.client.Patch.COMMIT_MSG;
+import static com.google.gerrit.reviewdb.client.Patch.MERGE_LIST;
import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.eclipse.jgit.lib.Constants.HEAD;
import static org.junit.Assert.fail;
+import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.gerrit.acceptance.AbstractDaemonTest;
@@ -45,7 +47,6 @@
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.common.ChangeType;
import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.extensions.common.DiffInfo;
import com.google.gerrit.extensions.common.FileInfo;
@@ -539,7 +540,7 @@
.revision(r.getCommit().name())
.files()
.keySet()
- ).containsExactly(COMMIT_MSG, "foo", "bar");
+ ).containsExactly(COMMIT_MSG, MERGE_LIST, "foo", "bar");
// list files against parent 1
assertThat(gApi.changes()
@@ -547,7 +548,7 @@
.revision(r.getCommit().name())
.files(1)
.keySet()
- ).containsExactly(COMMIT_MSG, "bar");
+ ).containsExactly(COMMIT_MSG, MERGE_LIST, "bar");
// list files against parent 2
assertThat(gApi.changes()
@@ -555,7 +556,7 @@
.revision(r.getCommit().name())
.files(2)
.keySet()
- ).containsExactly(COMMIT_MSG, "foo");
+ ).containsExactly(COMMIT_MSG, MERGE_LIST, "foo");
}
@Test
@@ -853,66 +854,40 @@
.file(path)
.diff();
- List<String> expectedLines = new ArrayList<>();
+ List<String> headers = new ArrayList<>();
if (path.equals(COMMIT_MSG)) {
RevCommit c = pushResult.getCommit();
RevCommit parentCommit = c.getParents()[0];
String parentCommitId = testRepo.getRevWalk().getObjectReader()
.abbreviate(parentCommit.getId(), 8).name();
- expectedLines.add("Parent: " + parentCommitId + " ("
+ headers.add("Parent: " + parentCommitId + " ("
+ parentCommit.getShortMessage() + ")");
SimpleDateFormat dtfmt =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US);
PersonIdent author = c.getAuthorIdent();
dtfmt.setTimeZone(author.getTimeZone());
- expectedLines.add("Author: " + author.getName() + " <"
+ headers.add("Author: " + author.getName() + " <"
+ author.getEmailAddress() + ">");
- expectedLines.add("AuthorDate: "
+ headers.add("AuthorDate: "
+ dtfmt.format(Long.valueOf(author.getWhen().getTime())));
PersonIdent committer = c.getCommitterIdent();
dtfmt.setTimeZone(committer.getTimeZone());
- expectedLines.add("Commit: " + committer.getName() + " <"
+ headers.add("Commit: " + committer.getName() + " <"
+ committer.getEmailAddress() + ">");
- expectedLines.add("CommitDate: "
+ headers.add("CommitDate: "
+ dtfmt.format(Long.valueOf(committer.getWhen().getTime())));
- expectedLines.add("");
+ headers.add("");
}
- for (String line : expectedContentSideB.split("\n")) {
- expectedLines.add(line);
+ if (!headers.isEmpty()) {
+ String header = Joiner.on("\n").join(headers);
+ expectedContentSideB = header + "\n" + expectedContentSideB;
}
- assertThat(diff.binary).isNull();
- assertThat(diff.changeType).isEqualTo(ChangeType.ADDED);
- assertThat(diff.diffHeader).isNotNull();
- assertThat(diff.intralineStatus).isNull();
- assertThat(diff.webLinks).isNull();
-
- assertThat(diff.metaA).isNull();
- assertThat(diff.metaB).isNotNull();
- assertThat(diff.metaB.commitId).isEqualTo(pushResult.getCommit().name());
- assertThat(diff.metaB.contentType).isEqualTo(
- path.equals(COMMIT_MSG)
- ? "text/x-gerrit-commit-message"
- : "text/plain");
- assertThat(diff.metaB.lines).isEqualTo(expectedLines.size());
- assertThat(diff.metaB.name).isEqualTo(path);
- assertThat(diff.metaB.webLinks).isNull();
-
- assertThat(diff.content).hasSize(1);
- DiffInfo.ContentEntry contentEntry = diff.content.get(0);
- assertThat(contentEntry.b).hasSize(expectedLines.size());
- for (int i = 0; i < contentEntry.b.size(); i++) {
- assertThat(contentEntry.b.get(i)).isEqualTo(expectedLines.get(i));
- }
- assertThat(contentEntry.a).isNull();
- assertThat(contentEntry.ab).isNull();
- assertThat(contentEntry.common).isNull();
- assertThat(contentEntry.editA).isNull();
- assertThat(contentEntry.editB).isNull();
- assertThat(contentEntry.skip).isNull();
+ assertDiffForNewFile(diff, pushResult.getCommit(), path,
+ expectedContentSideB);
}
}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java
index 28f7ff8..dfeac35 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractSubmoduleSubscription.java
@@ -29,6 +29,7 @@
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevObject;
import org.eclipse.jgit.revwalk.RevTree;
@@ -75,8 +76,9 @@
}
protected TestRepository<?> createProjectWithPush(String name,
- @Nullable Project.NameKey parent, SubmitType submitType) throws Exception {
- Project.NameKey project = createProject(name, parent, submitType);
+ @Nullable Project.NameKey parent, boolean createEmptyCommit,
+ SubmitType submitType) throws Exception {
+ Project.NameKey project = createProject(name, parent, createEmptyCommit, submitType);
grant(Permission.PUSH, project, "refs/heads/*");
grant(Permission.SUBMIT, project, "refs/for/refs/heads/*");
return cloneProject(project);
@@ -84,12 +86,17 @@
protected TestRepository<?> createProjectWithPush(String name,
@Nullable Project.NameKey parent) throws Exception {
- return createProjectWithPush(name, parent, getSubmitType());
+ return createProjectWithPush(name, parent, true, getSubmitType());
+ }
+
+ protected TestRepository<?> createProjectWithPush(String name,
+ boolean createEmptyCommit) throws Exception {
+ return createProjectWithPush(name, null, createEmptyCommit, getSubmitType());
}
protected TestRepository<?> createProjectWithPush(String name)
throws Exception {
- return createProjectWithPush(name, null);
+ return createProjectWithPush(name, null, true, getSubmitType());
}
private static AtomicInteger contentCounter = new AtomicInteger(0);
@@ -305,8 +312,13 @@
String submodule) throws Exception {
submodule = name(submodule);
- ObjectId commitId = repo.git().fetch().setRemote("origin").call()
- .getAdvertisedRef("refs/heads/" + branch).getObjectId();
+ Ref branchTip = repo.git().fetch().setRemote("origin").call()
+ .getAdvertisedRef("refs/heads/" + branch);
+ if (branchTip == null) {
+ return false;
+ }
+
+ ObjectId commitId = branchTip.getObjectId();
RevWalk rw = repo.getRevWalk();
RevCommit c = rw.parseCommit(commitId);
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
index dc88926..d62a27b 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
@@ -258,6 +258,56 @@
}
@Test
+ public void testDoNotUseFastForward() throws Exception {
+ TestRepository<?> superRepo = createProjectWithPush("super-project", false);
+ TestRepository<?> sub = createProjectWithPush("sub", false);
+
+ allowMatchingSubmoduleSubscription("sub", "refs/heads/master",
+ "super-project", "refs/heads/master");
+
+ createSubmoduleSubscription(superRepo, "master", "sub", "master");
+
+ ObjectId subId =
+ pushChangeTo(sub, "refs/for/master", "some message", "same-topic");
+
+ ObjectId superId =
+ pushChangeTo(superRepo, "refs/for/master", "some message", "same-topic");
+
+ String subChangeId = getChangeId(sub, subId).get();
+ approve(subChangeId);
+ approve(getChangeId(superRepo, superId).get());
+
+ gApi.changes().id(subChangeId).current().submit();
+
+ expectToHaveSubmoduleState(superRepo, "master", "sub", sub, "master");
+ RevCommit superHead = getRemoteHead(name("super-project"), "master");
+ assertThat(superHead.getShortMessage()).contains("some message");
+ assertThat(superHead.getId()).isNotEqualTo(superId);
+ }
+
+ @Test
+ public void testUseFastForwardWhenNoSubmodule() throws Exception {
+ TestRepository<?> superRepo = createProjectWithPush("super-project", false);
+ TestRepository<?> sub = createProjectWithPush("sub", false);
+
+ ObjectId subId =
+ pushChangeTo(sub, "refs/for/master", "some message", "same-topic");
+
+ ObjectId superId =
+ pushChangeTo(superRepo, "refs/for/master", "some message", "same-topic");
+
+ String subChangeId = getChangeId(sub, subId).get();
+ approve(subChangeId);
+ approve(getChangeId(superRepo, superId).get());
+
+ gApi.changes().id(subChangeId).current().submit();
+
+ RevCommit superHead = getRemoteHead(name("super-project"), "master");
+ assertThat(superHead.getShortMessage()).isEqualTo("some message");
+ assertThat(superHead.getId()).isEqualTo(superId);
+ }
+
+ @Test
public void testDifferentPaths() throws Exception {
TestRepository<?> superRepo = createProjectWithPush("super-project");
TestRepository<?> sub = createProjectWithPush("sub");
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/BUCK
index ff167ac..3522991 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/BUCK
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/BUCK
@@ -3,6 +3,5 @@
acceptance_tests(
group = 'pgm',
srcs = glob(['*IT.java']),
- source_under_test = ['//gerrit-pgm:pgm'],
labels = ['pgm'],
)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/BUILD b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/BUILD
index 806acd2..56cecb8 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/BUILD
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/BUILD
@@ -3,6 +3,5 @@
acceptance_tests(
group = 'pgm',
srcs = glob(['*IT.java']),
- source_under_test = ['//gerrit-pgm:pgm'],
labels = ['pgm'],
)
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 b0280e8..ce7e8c9 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
@@ -65,8 +65,10 @@
// gerrit
@GerritConfig(name = "gerrit.allProjects", value = "Root"),
@GerritConfig(name = "gerrit.allUsers", value = "Users"),
- @GerritConfig(name = "gerrit.reportBugUrl", value = "https://example.com/report"),
+ @GerritConfig(name = "gerrit.enableGwtUi", value = "true"),
+ @GerritConfig(name = "gerrit.enablePolyGerrit", value = "true"),
@GerritConfig(name = "gerrit.reportBugText", value = "REPORT BUG"),
+ @GerritConfig(name = "gerrit.reportBugUrl", value = "https://example.com/report"),
// suggest
@GerritConfig(name = "suggest.from", value = "3"),
@@ -108,6 +110,9 @@
assertThat(i.gerrit.reportBugUrl).isEqualTo("https://example.com/report");
assertThat(i.gerrit.reportBugText).isEqualTo("REPORT BUG");
+ // Acceptance tests force --headless even when UIs are specified in config.
+ assertThat(i.gerrit.webUis).isEmpty();
+
// plugin
assertThat(i.plugin.jsResourcePaths).isEmpty();
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java
index 70dafaa..5b6f3f9 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java
@@ -32,9 +32,11 @@
import com.google.gerrit.extensions.client.Comment;
import com.google.gerrit.extensions.client.Side;
import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.server.change.ChangeResource;
import com.google.gerrit.server.change.ChangesCollection;
import com.google.gerrit.server.change.PostReview;
@@ -148,8 +150,8 @@
@Test
public void postCommentOnMergeCommitChange() throws Exception {
for (Integer line : lines) {
- final String file = "/COMMIT_MSG";
- PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
+ String file = "foo";
+ PushOneCommit.Result r = createMergeCommitChange("refs/for/master", file);
String changeId = r.getChangeId();
String revId = r.getCommit().getName();
ReviewInput input = new ReviewInput();
@@ -165,6 +167,39 @@
assertThat(Lists.transform(result.get(file), infoToInput(file)))
.containsExactly(c1, c2, c3, c4);
}
+
+ // for the commit message comments on the auto-merge are not possible
+ for (Integer line : lines) {
+ String file = Patch.COMMIT_MSG;
+ PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
+ String changeId = r.getChangeId();
+ String revId = r.getCommit().getName();
+ ReviewInput input = new ReviewInput();
+ CommentInput c1 = newComment(file, Side.REVISION, line, "ps-1");
+ CommentInput c2 = newCommentOnParent(file, 1, line, "parent-1 of ps-1");
+ CommentInput c3 = newCommentOnParent(file, 2, line, "parent-2 of ps-1");
+ input.comments = new HashMap<>();
+ input.comments.put(file, ImmutableList.of(c1, c2, c3));
+ revision(r).review(input);
+ Map<String, List<CommentInfo>> result = getPublishedComments(changeId, revId);
+ assertThat(result).isNotEmpty();
+ assertThat(Lists.transform(result.get(file), infoToInput(file)))
+ .containsExactly(c1, c2, c3);
+ }
+ }
+
+ @Test
+ public void postCommentOnCommitMessageOnAutoMerge() throws Exception {
+ PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
+ ReviewInput input = new ReviewInput();
+ CommentInput c =
+ newComment(Patch.COMMIT_MSG, Side.PARENT, 0, "comment on auto-merge");
+ input.comments = new HashMap<>();
+ input.comments.put(Patch.COMMIT_MSG, ImmutableList.of(c));
+ exception.expect(BadRequestException.class);
+ exception.expectMessage(
+ "cannot comment on " + Patch.COMMIT_MSG + " on auto-merge");
+ revision(r).review(input);
}
@Test
@@ -504,8 +539,7 @@
assertThat(ps2List.get(2).message).isEqualTo("join lines");
assertThat(ps2List.get(3).message).isEqualTo("typo: content");
- ImmutableList<Message> messages =
- email.getMessages(r2.getChangeId(), "comment");
+ List<Message> messages = email.getMessages(r2.getChangeId(), "comment");
assertThat(messages).hasSize(1);
String url = canonicalWebUrl.get();
int c = r1.getChange().getId().get();
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java
index 06170d0..b843721 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java
@@ -23,8 +23,11 @@
import com.google.gerrit.acceptance.TestProjectInput;
import com.google.gerrit.extensions.api.changes.SubmittedTogetherInfo;
import com.google.gerrit.extensions.client.ChangeStatus;
+import com.google.gerrit.extensions.client.ListChangesOption;
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.FileInfo;
+import com.google.gerrit.extensions.common.RevisionInfo;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.testutil.ConfigSuite;
@@ -44,6 +47,63 @@
}
@Test
+ public void doesNotIncludeCurrentFiles() throws Exception {
+ RevCommit c1_1 = commitBuilder()
+ .add("a.txt", "1")
+ .message("subject: 1")
+ .create();
+ RevCommit c2_1 = commitBuilder()
+ .add("b.txt", "2")
+ .message("subject: 2")
+ .create();
+ String id2 = getChangeId(c2_1);
+ pushHead(testRepo, "refs/for/master", false);
+
+ SubmittedTogetherInfo info =
+ gApi.changes()
+ .id(id2)
+ .submittedTogether(EnumSet.of(NON_VISIBLE_CHANGES));
+ assertThat(info.changes).hasSize(2);
+ assertThat(info.changes.get(0).currentRevision).isEqualTo(c2_1.name());
+ assertThat(info.changes.get(1).currentRevision).isEqualTo(c1_1.name());
+
+ assertThat(info.changes.get(0).currentRevision).isEqualTo(c2_1.name());
+ RevisionInfo rev = info.changes.get(0).revisions.get(c2_1.name());
+ assertThat(rev.files).isNull();
+ }
+
+ @Test
+ public void returnsCurrentFilesIfOptionRequested() throws Exception {
+ RevCommit c1_1 = commitBuilder()
+ .add("a.txt", "1")
+ .message("subject: 1")
+ .create();
+ RevCommit c2_1 = commitBuilder()
+ .add("b.txt", "2")
+ .message("subject: 2")
+ .create();
+ String id2 = getChangeId(c2_1);
+ pushHead(testRepo, "refs/for/master", false);
+
+ SubmittedTogetherInfo info =
+ gApi.changes()
+ .id(id2)
+ .submittedTogether(
+ EnumSet.of(ListChangesOption.CURRENT_FILES),
+ EnumSet.of(NON_VISIBLE_CHANGES));
+ assertThat(info.changes).hasSize(2);
+ assertThat(info.changes.get(0).currentRevision).isEqualTo(c2_1.name());
+ assertThat(info.changes.get(1).currentRevision).isEqualTo(c1_1.name());
+
+ assertThat(info.changes.get(0).currentRevision).isEqualTo(c2_1.name());
+ RevisionInfo rev = info.changes.get(0).revisions.get(c2_1.name());
+ assertThat(rev).isNotNull();
+ FileInfo file = rev.files.get("b.txt");
+ assertThat(file).isNotNull();
+ assertThat(file.status).isEqualTo('A');
+ }
+
+ @Test
public void returnsAncestors() throws Exception {
// Create two commits and push.
RevCommit c1_1 = commitBuilder()
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java
index f61402b..8606ce7 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/ChangeRebuilderIT.java
@@ -58,6 +58,7 @@
import com.google.gerrit.server.git.RepoRefCache;
import com.google.gerrit.server.git.UpdateException;
import com.google.gerrit.server.notedb.ChangeBundle;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.notedb.NoteDbChangeState;
import com.google.gerrit.server.notedb.NoteDbUpdateManager;
@@ -123,6 +124,9 @@
@Inject
private Sequences seq;
+ @Inject
+ private ChangeBundleReader bundleReader;
+
@Before
public void setUp() throws Exception {
assume().that(NoteDbMode.readWrite()).isFalse();
@@ -388,7 +392,7 @@
// Check that the bundles are equal.
ChangeBundle actual = ChangeBundle.fromNotes(
plcUtil, notesFactory.create(dbProvider.get(), project, id));
- ChangeBundle expected = ChangeBundle.fromReviewDb(getUnwrappedDb(), id);
+ ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
assertThat(actual.differencesFrom(expected)).isEmpty();
}
@@ -439,7 +443,7 @@
// Check that the bundles are equal.
ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id);
ChangeBundle actual = ChangeBundle.fromNotes(plcUtil, notes);
- ChangeBundle expected = ChangeBundle.fromReviewDb(getUnwrappedDb(), id);
+ ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
assertThat(actual.differencesFrom(expected)).isEmpty();
assertThat(
Iterables.transform(
@@ -478,7 +482,7 @@
// Check that the bundles are equal.
ChangeBundle actual = ChangeBundle.fromNotes(
plcUtil, notesFactory.create(dbProvider.get(), project, id));
- ChangeBundle expected = ChangeBundle.fromReviewDb(getUnwrappedDb(), id);
+ ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
assertThat(actual.differencesFrom(expected)).isEmpty();
}
@@ -508,7 +512,7 @@
assertChangeUpToDate(false, id);
assertThat(getMetaRef(project, changeMetaRef(id))).isEqualTo(oldMetaId);
ChangeBundle actual = ChangeBundle.fromNotes(plcUtil, notes);
- ChangeBundle expected = ChangeBundle.fromReviewDb(getUnwrappedDb(), id);
+ ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
assertThat(actual.differencesFrom(expected)).isEmpty();
assertChangeUpToDate(false, id);
@@ -550,7 +554,7 @@
// Not up to date, but the actual returned state matches anyway.
assertDraftsUpToDate(false, id, user);
ChangeBundle actual = ChangeBundle.fromNotes(plcUtil, notes);
- ChangeBundle expected = ChangeBundle.fromReviewDb(getUnwrappedDb(), id);
+ ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
assertThat(actual.differencesFrom(expected)).isEmpty();
// Another rebuild attempt succeeds
@@ -605,7 +609,7 @@
assertChangeUpToDate(true, id);
assertDraftsUpToDate(false, id, user);
ChangeBundle actual = ChangeBundle.fromNotes(plcUtil, notes);
- ChangeBundle expected = ChangeBundle.fromReviewDb(getUnwrappedDb(), id);
+ ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
assertThat(actual.differencesFrom(expected)).isEmpty();
// Another rebuild attempt succeeds
@@ -711,6 +715,8 @@
rin.message = "comment";
Timestamp ts = new Timestamp(c.getCreatedOn().getTime() + 2000);
+ assertThat(ts).isGreaterThan(c.getCreatedOn());
+ assertThat(ts).isLessThan(db.patchSets().get(psId).getCreatedOn());
RevisionResource revRsrc = parseCurrentRevisionResource(r.getChangeId());
postReview.get().apply(revRsrc, rin, ts);
diff --git a/gerrit-acceptance-tests/tests.bzl b/gerrit-acceptance-tests/tests.bzl
index ff2562d..62a99e3 100644
--- a/gerrit-acceptance-tests/tests.bzl
+++ b/gerrit-acceptance-tests/tests.bzl
@@ -11,7 +11,6 @@
flaky = 0,
deps = [],
labels = [],
- source_under_test = [], #unused
vm_args = ['-Xmx256m']):
junit_tests(
name = group,
diff --git a/gerrit-acceptance-tests/tests.defs b/gerrit-acceptance-tests/tests.defs
index 85cc78b..648bd63 100644
--- a/gerrit-acceptance-tests/tests.defs
+++ b/gerrit-acceptance-tests/tests.defs
@@ -8,7 +8,6 @@
srcs,
deps = [],
labels = [],
- source_under_test = [],
vm_args = ['-Xmx256m']):
from os import path
if path.exists('/dev/urandom'):
@@ -20,11 +19,6 @@
deps = deps + BOUNCYCASTLE + [
'//gerrit-acceptance-tests:lib'
],
- source_under_test = [
- '//gerrit-httpd:httpd',
- '//gerrit-sshd:sshd',
- '//gerrit-server:server',
- ] + source_under_test,
labels = labels + [
'acceptance',
'slow',
diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
index 5009771..8141dfb 100644
--- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
+++ b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
@@ -119,19 +119,8 @@
public void start() {
if (executor != null) {
for (final H2CacheImpl<?, ?> cache : caches) {
- executor.execute(new Runnable() {
- @Override
- public void run() {
- cache.start();
- }
- });
-
- cleanup.schedule(new Runnable() {
- @Override
- public void run() {
- cache.prune(cleanup);
- }
- }, 30, TimeUnit.SECONDS);
+ executor.execute(cache::start);
+ cleanup.schedule(() -> cache.prune(cleanup), 30, TimeUnit.SECONDS);
}
}
}
diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
index 838f42c..7e05236 100644
--- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
+++ b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheImpl.java
@@ -144,24 +144,14 @@
final ValueHolder<V> h = new ValueHolder<>(val);
h.created = TimeUtil.nowMs();
mem.put(key, h);
- executor.execute(new Runnable() {
- @Override
- public void run() {
- store.put(key, h);
- }
- });
+ executor.execute(() -> store.put(key, h));
}
@SuppressWarnings("unchecked")
@Override
public void invalidate(final Object key) {
if (keyType.getRawType().isInstance(key) && store.mightContain((K) key)) {
- executor.execute(new Runnable() {
- @Override
- public void run() {
- store.invalidate((K) key);
- }
- });
+ executor.execute(() -> store.invalidate((K) key));
}
mem.invalidate(key);
}
@@ -212,12 +202,7 @@
cal.add(Calendar.DAY_OF_MONTH, 1);
long delay = cal.getTimeInMillis() - TimeUtil.nowMs();
- service.schedule(new Runnable() {
- @Override
- public void run() {
- prune(service);
- }
- }, delay, TimeUnit.MILLISECONDS);
+ service.schedule(() -> prune(service), delay, TimeUnit.MILLISECONDS);
}
static class ValueHolder<V> {
@@ -252,12 +237,7 @@
final ValueHolder<V> h = new ValueHolder<>(loader.load(key));
h.created = TimeUtil.nowMs();
- executor.execute(new Runnable() {
- @Override
- public void run() {
- store.put(key, h);
- }
- });
+ executor.execute(() -> store.put(key, h));
return h;
}
}
@@ -280,14 +260,9 @@
}
}
- final ValueHolder<V> h = new ValueHolder<V>(loader.call());
+ final ValueHolder<V> h = new ValueHolder<>(loader.call());
h.created = TimeUtil.nowMs();
- executor.execute(new Runnable() {
- @Override
- public void run() {
- store.put(key, h);
- }
- });
+ executor.execute(() -> store.put(key, h));
return h;
}
}
diff --git a/gerrit-common/BUCK b/gerrit-common/BUCK
index 847fd25..452b2fe 100644
--- a/gerrit-common/BUCK
+++ b/gerrit-common/BUCK
@@ -62,7 +62,6 @@
'//lib:guava',
'//lib:junit',
],
- source_under_test = [':client'],
)
java_test(
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/Permission.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/Permission.java
index 8fae4a6..290b9f9 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/Permission.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/Permission.java
@@ -29,6 +29,7 @@
public static final String CREATE_SIGNED_TAG = "createSignedTag";
public static final String DELETE_DRAFTS = "deleteDrafts";
public static final String EDIT_HASHTAGS = "editHashtags";
+ public static final String EDIT_ASSIGNEE = "editAssignee";
public static final String EDIT_TOPIC_NAME = "editTopicName";
public static final String FORGE_AUTHOR = "forgeAuthor";
public static final String FORGE_COMMITTER = "forgeCommitter";
@@ -74,6 +75,7 @@
NAMES_LC.add(VIEW_DRAFTS.toLowerCase());
NAMES_LC.add(EDIT_TOPIC_NAME.toLowerCase());
NAMES_LC.add(EDIT_HASHTAGS.toLowerCase());
+ NAMES_LC.add(EDIT_ASSIGNEE.toLowerCase());
NAMES_LC.add(DELETE_DRAFTS.toLowerCase());
NAMES_LC.add(PUBLISH_DRAFTS.toLowerCase());
diff --git a/gerrit-extension-api/BUCK b/gerrit-extension-api/BUCK
index 2cc8291..a0e7495 100644
--- a/gerrit-extension-api/BUCK
+++ b/gerrit-extension-api/BUCK
@@ -67,7 +67,6 @@
'//lib:truth',
'//lib/guice:guice',
],
- source_under_test = [':api'],
)
java_doc(
diff --git a/gerrit-extension-api/BUILD b/gerrit-extension-api/BUILD
index 4a5cfe3..b66617a 100644
--- a/gerrit-extension-api/BUILD
+++ b/gerrit-extension-api/BUILD
@@ -44,3 +44,12 @@
],
visibility = ['//visibility:public'],
)
+
+load('//tools/bzl:javadoc.bzl', 'java_doc')
+
+java_doc(
+ name = 'extension-api-javadoc',
+ title = 'Gerrit Review Extension API Documentation',
+ libs = [':api'],
+ pkgs = ['com.google.gerrit.extensions'],
+)
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
index f656c2d..f860552 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
@@ -97,6 +97,9 @@
List<ChangeInfo> submittedTogether() throws RestApiException;
SubmittedTogetherInfo submittedTogether(
EnumSet<SubmittedTogetherOption> options) throws RestApiException;
+ SubmittedTogetherInfo submittedTogether(
+ EnumSet<ListChangesOption> listOptions,
+ EnumSet<SubmittedTogetherOption> submitOptions) throws RestApiException;
/**
* Publishes a draft change.
@@ -360,5 +363,12 @@
EnumSet<SubmittedTogetherOption> options) throws RestApiException {
throw new NotImplementedException();
}
+
+ @Override
+ public SubmittedTogetherInfo submittedTogether(
+ EnumSet<ListChangesOption> a,
+ EnumSet<SubmittedTogetherOption> b) throws RestApiException {
+ throw new NotImplementedException();
+ }
}
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherOption.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherOption.java
index 8649e91f..e2cab4d 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherOption.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmittedTogetherOption.java
@@ -16,15 +16,5 @@
/** Output options available for submitted_together requests. */
public enum SubmittedTogetherOption {
- NON_VISIBLE_CHANGES(0);
-
- private final int value;
-
- SubmittedTogetherOption(int v) {
- value = v;
- }
-
- public int getValue() {
- return value;
- }
+ NON_VISIBLE_CHANGES;
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Comment.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Comment.java
index 7c8a3e8..78ffb82 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Comment.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/Comment.java
@@ -59,6 +59,13 @@
}
}
+ public short side() {
+ if (side == Side.PARENT) {
+ return (short) (parent == null ? 0 : -parent.shortValue());
+ }
+ return 1;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/UiType.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/UiType.java
new file mode 100644
index 0000000..0d9df39
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/client/UiType.java
@@ -0,0 +1,32 @@
+// 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 UiType {
+ NONE,
+ GWT,
+ POLYGERRIT;
+
+ public static UiType parse(String str) {
+ if (str != null) {
+ for (UiType type : UiType.values()) {
+ if (type.name().equalsIgnoreCase(str)) {
+ return type;
+ }
+ }
+ }
+ return null;
+ }
+}
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
index 72c474f..0c10ec7 100644
--- 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
@@ -14,6 +14,10 @@
package com.google.gerrit.extensions.common;
+import com.google.gerrit.extensions.client.UiType;
+
+import java.util.Set;
+
public class GerritInfo {
public String allProjects;
public String allUsers;
@@ -22,4 +26,5 @@
public Boolean editGpgKeys;
public String reportBugUrl;
public String reportBugText;
-}
\ No newline at end of file
+ public Set<UiType> webUis;
+}
diff --git a/gerrit-gpg/BUCK b/gerrit-gpg/BUCK
index 73d9f04..fe93bf8 100644
--- a/gerrit-gpg/BUCK
+++ b/gerrit-gpg/BUCK
@@ -52,6 +52,5 @@
'//lib/bouncycastle:bcprov',
'//lib/jgit/org.eclipse.jgit.junit:junit',
],
- source_under_test = [':gpg'],
visibility = ['//tools/eclipse:classpath'],
)
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java
index db6cb7a..3bbe6eb 100644
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java
+++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java
@@ -19,10 +19,8 @@
import com.google.common.base.CharMatcher;
import com.google.common.base.MoreObjects;
-import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
-import com.google.common.collect.Ordering;
import com.google.common.io.BaseEncoding;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.reviewdb.client.AccountExternalId;
@@ -274,9 +272,7 @@
private static String missingUserIds(Set<String> allowedUserIds) {
StringBuilder sb = new StringBuilder("Key must contain a valid"
+ " certification for one of the following identities:\n");
- Iterator<String> sorted = FluentIterable.from(allowedUserIds)
- .toSortedList(Ordering.natural())
- .iterator();
+ Iterator<String> sorted = allowedUserIds.stream().sorted().iterator();
while (sorted.hasNext()) {
sb.append(" ").append(sorted.next());
if (sorted.hasNext()) {
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java
index 49657c6..ddee18d 100644
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java
+++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/GpgKeys.java
@@ -19,7 +19,6 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.CharMatcher;
-import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import com.google.common.io.BaseEncoding;
@@ -211,14 +210,8 @@
@VisibleForTesting
public static FluentIterable<AccountExternalId> getGpgExtIds(ReviewDb db,
Account.Id accountId) throws OrmException {
- return FluentIterable
- .from(db.accountExternalIds().byAccount(accountId))
- .filter(new Predicate<AccountExternalId>() {
- @Override
- public boolean apply(AccountExternalId in) {
- return in.isScheme(SCHEME_GPGKEY);
- }
- });
+ return FluentIterable.from(db.accountExternalIds().byAccount(accountId))
+ .filter(in -> in.isScheme(SCHEME_GPGKEY));
}
private Iterable<AccountExternalId> getGpgExtIds(AccountResource rsrc)
diff --git a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/PostGpgKeys.java b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/PostGpgKeys.java
index 2deae3f..7c5c6ea 100644
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/PostGpgKeys.java
+++ b/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/PostGpgKeys.java
@@ -18,7 +18,6 @@
import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
import static java.nio.charset.StandardCharsets.UTF_8;
-import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
@@ -161,13 +160,8 @@
if (!newExtIds.isEmpty()) {
db.get().accountExternalIds().insert(newExtIds);
}
- db.get().accountExternalIds().deleteKeys(Iterables.transform(toRemove,
- new Function<Fingerprint, AccountExternalId.Key>() {
- @Override
- public AccountExternalId.Key apply(Fingerprint fp) {
- return toExtIdKey(fp.get());
- }
- }));
+ db.get().accountExternalIds().deleteKeys(
+ Iterables.transform(toRemove, fp -> toExtIdKey(fp.get())));
accountCache.evict(rsrc.getUser().getAccountId());
return toJson(newKeys, toRemove, store, rsrc.getUser());
}
diff --git a/gerrit-gwtexpui/BUCK b/gerrit-gwtexpui/BUCK
index 79a97a9..23db13f 100644
--- a/gerrit-gwtexpui/BUCK
+++ b/gerrit-gwtexpui/BUCK
@@ -80,7 +80,6 @@
'//lib/gwt:user',
'//lib/gwt:dev',
],
- source_under_test = [':SafeHtml'],
)
gwt_module(
diff --git a/gerrit-gwtui-common/BUCK b/gerrit-gwtui-common/BUCK
index a8ea06f..d4d97a6 100644
--- a/gerrit-gwtui-common/BUCK
+++ b/gerrit-gwtui-common/BUCK
@@ -41,7 +41,7 @@
binary_jar = ':diffy_image_files_ln',
deps = [
'//lib:LICENSE-diffy',
- '//lib:LICENSE-CC-BY3.0',
+ '//lib:LICENSE-CC-BY3.0-unported',
],
visibility = ['PUBLIC'],
)
@@ -66,7 +66,6 @@
'//lib/gwt:user',
'//lib/jgit/org.eclipse.jgit:jgit',
],
- source_under_test = [':client'],
vm_args = ['-Xmx512m'],
visibility = ['//tools/eclipse:classpath'],
)
diff --git a/gerrit-gwtui-common/BUILD b/gerrit-gwtui-common/BUILD
new file mode 100644
index 0000000..01a82af
--- /dev/null
+++ b/gerrit-gwtui-common/BUILD
@@ -0,0 +1,69 @@
+load('//tools/bzl:genrule2.bzl', 'genrule2')
+load('//tools/bzl:java.bzl', 'java_library2')
+load('//tools/bzl:junit.bzl', 'junit_tests')
+load('//tools/bzl:gwt.bzl', 'gwt_module')
+
+EXPORTED_DEPS = [
+ '//gerrit-common:client',
+ '//gerrit-gwtexpui:Clippy',
+ '//gerrit-gwtexpui:GlobalKey',
+ '//gerrit-gwtexpui:Progress',
+ '//gerrit-gwtexpui:SafeHtml',
+ '//gerrit-gwtexpui:UserAgent',
+]
+DEPS = ['//lib/gwt:user']
+SRC = 'src/main/java/com/google/gerrit/'
+DIFFY = glob(['src/main/resources/com/google/gerrit/client/diffy*.png'])
+
+gwt_module(
+ name = 'client',
+ srcs = glob(['src/main/**/*.java']),
+ gwt_xml = SRC + 'GerritGwtUICommon.gwt.xml',
+ resources = glob(
+ ['src/main/**/*'],
+ exclude = [SRC + 'client/**/*.java'] +
+ [SRC + 'GerritGwtUICommon.gwt.xml']
+ ),
+ exported_deps = EXPORTED_DEPS,
+ deps = DEPS,
+ visibility = ['//visibility:public'],
+)
+
+java_library2(
+ name = 'client-lib',
+ srcs = glob(['src/main/**/*.java']),
+ resources = glob(['src/main/**/*']),
+ exported_deps = EXPORTED_DEPS,
+ deps = DEPS,
+ visibility = ['//visibility:public'],
+)
+
+java_import(
+ name = 'diffy_logo',
+ jars = [':diffy_image_files_ln'],
+ visibility = ['//visibility:public'],
+)
+
+genrule2(
+ name = 'diffy_image_files_ln',
+ srcs = [':diffy_image_files'],
+ cmd = 'ln -s $$ROOT/$(location :diffy_image_files) $@',
+ out = 'diffy_images.jar',
+)
+
+java_library(
+ name = 'diffy_image_files',
+ resources = DIFFY,
+)
+
+junit_tests(
+ name = 'client_tests',
+ srcs = glob(['src/test/java/**/*.java']),
+ deps = [
+ ':client',
+ '//lib:junit',
+ '//lib/gwt:dev',
+ '//lib/jgit/org.eclipse.jgit:jgit',
+ ],
+ visibility = ['//visibility:public'],
+)
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/GerritUiExtensionPoint.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/GerritUiExtensionPoint.java
index 0a339a1..eb10718 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/GerritUiExtensionPoint.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/GerritUiExtensionPoint.java
@@ -22,6 +22,7 @@
CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK,
CHANGE_SCREEN_BELOW_RELATED_INFO_BLOCK,
CHANGE_SCREEN_BELOW_COMMIT_INFO_BLOCK,
+ CHANGE_SCREEN_HISTORY_RIGHT_OF_BUTTONS,
/* MyPasswordScreen */
PASSWORD_SCREEN_BOTTOM,
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/FileInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/FileInfo.java
index 9b290a5..b21126d 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/FileInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/FileInfo.java
@@ -56,6 +56,12 @@
} else if (Patch.COMMIT_MSG.equals(b.path())) {
return 1;
}
+ if (Patch.MERGE_LIST.equals(a.path())) {
+ return -1;
+ } else if (Patch.MERGE_LIST.equals(b.path())) {
+ return 1;
+ }
+
// Look at file suffixes to check if it makes sense to use a different order
int s1 = a.path().lastIndexOf('.');
int s2 = b.path().lastIndexOf('.');
@@ -76,9 +82,15 @@
}
public static String getFileName(String path) {
- String fileName = Patch.COMMIT_MSG.equals(path)
- ? "Commit Message"
- : path;
+ String fileName;
+ if (Patch.COMMIT_MSG.equals(path)) {
+ fileName = "Commit Message";
+ } else if (Patch.MERGE_LIST.equals(path)) {
+ fileName = "Merge List";
+ } else {
+ fileName = path;
+ }
+
int s = fileName.lastIndexOf('/');
return s >= 0 ? fileName.substring(s + 1) : fileName;
}
diff --git a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GerritInfo.java b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GerritInfo.java
index 750412d..a111896 100644
--- a/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GerritInfo.java
+++ b/gerrit-gwtui-common/src/main/java/com/google/gerrit/client/info/GerritInfo.java
@@ -14,8 +14,13 @@
package com.google.gerrit.client.info;
+import com.google.gerrit.extensions.client.UiType;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArrayString;
+
+import java.util.ArrayList;
+import java.util.List;
public class GerritInfo extends JavaScriptObject {
public final Project.NameKey allProjectsNameKey() {
@@ -42,6 +47,19 @@
public final native String reportBugUrl() /*-{ return this.report_bug_url; }-*/;
public final native String reportBugText() /*-{ return this.report_bug_text; }-*/;
+ private native JsArrayString _webUis() /*-{ return this.web_uis; }-*/;
+ public final List<UiType> webUis() {
+ JsArrayString webUis = _webUis();
+ List<UiType> result = new ArrayList<>(webUis.length());
+ for (int i = 0; i < webUis.length(); i++) {
+ UiType t = UiType.parse(webUis.get(i));
+ if (t != null) {
+ result.add(t);
+ }
+ }
+ return result;
+ }
+
protected GerritInfo() {
}
}
diff --git a/gerrit-gwtui/BUCK b/gerrit-gwtui/BUCK
index 3f87388..63d52b0 100644
--- a/gerrit-gwtui/BUCK
+++ b/gerrit-gwtui/BUCK
@@ -47,7 +47,6 @@
name = 'silk_icons',
deps = [
'//lib:LICENSE-silk_icons',
- '//lib:LICENSE-CC-BY3.0',
],
)
@@ -62,7 +61,6 @@
'//lib/gwt:dev',
'//lib/gwt:user',
],
- source_under_test = [':ui_module'],
vm_args = ['-Xmx512m'],
visibility = ['//tools/eclipse:classpath'],
)
diff --git a/gerrit-gwtui/BUILD b/gerrit-gwtui/BUILD
new file mode 100644
index 0000000..dbf02e8
--- /dev/null
+++ b/gerrit-gwtui/BUILD
@@ -0,0 +1,89 @@
+load('//tools/bzl:gwt.bzl', 'gwt_module')
+load('//tools/bzl:genrule2.bzl', 'genrule2')
+load(':gwt.bzl', 'gwt_binary')
+
+MODULE = 'com.google.gerrit.GerritGwtUI'
+
+GWT_JVM_ARGS = ['-Xmx512m']
+
+GWT_COMPILER_ARGS = [
+ '-XdisableClassMetadata',
+]
+
+GWT_COMPILER_ARGS_RELEASE_MODE = GWT_COMPILER_ARGS + [
+ '-XdisableCastChecking',
+]
+
+GWT_TRANSITIVE_DEPS = [
+ '//lib/gwt:javax-validation',
+ '//lib/gwt:javax-validation_src',
+ '//lib/ow2:ow2-asm',
+ '//lib/ow2:ow2-asm-analysis',
+ '//lib/ow2:ow2-asm-commons',
+ '//lib/ow2:ow2-asm-tree',
+ '//lib/ow2:ow2-asm-util',
+]
+
+DEPS = GWT_TRANSITIVE_DEPS + [
+ '//gerrit-gwtexpui:CSS',
+ '//lib:gwtjsonrpc',
+ '//lib/gwt:dev',
+ '@jgit_src//file',
+]
+
+gwt_module(
+ name = 'ui_module',
+ srcs = glob(['src/main/java/**/*.java']),
+ gwt_xml = 'src/main/java/%s.gwt.xml' % MODULE.replace('.', '/'),
+ resources = glob(
+ ['src/main/java/**/*'],
+ exclude = ['src/main/java/**/*.java'] +
+ ['src/main/java/%s.gwt.xml' % MODULE.replace('.', '/')]
+ ),
+ deps = [
+ '//gerrit-gwtui-common:diffy_logo',
+ '//gerrit-gwtui-common:client',
+ '//gerrit-gwtexpui:CSS',
+ '//lib/codemirror:codemirror',
+ '//lib/gwt:user',
+ ],
+ visibility = ['//visibility:public'],
+)
+
+genrule2(
+ name = 'ui_optdbg',
+ srcs = [
+ ':ui_dbg',
+ ':ui_opt',
+ ],
+ cmd = 'cd $$TMP;' +
+ 'unzip -q $$ROOT/$(location :ui_dbg);' +
+ 'mv' +
+ ' gerrit_ui/gerrit_ui.nocache.js' +
+ ' gerrit_ui/dbg_gerrit_ui.nocache.js;' +
+ 'unzip -qo $$ROOT/$(location :ui_opt);' +
+ 'mkdir -p $$(dirname $@);' +
+ 'zip -qr $$ROOT/$@ .',
+ out = 'ui_optdbg.zip',
+ visibility = ['//visibility:public'],
+)
+
+gwt_binary(
+ name = 'ui_opt',
+ modules = [MODULE],
+ module_deps = [':ui_module'],
+ deps = DEPS,
+ compiler_args = GWT_COMPILER_ARGS,
+ jvm_args = GWT_JVM_ARGS,
+)
+
+gwt_binary(
+ name = 'ui_dbg',
+ modules = [MODULE],
+ style = 'PRETTY',
+ optimize = "0",
+ module_deps = [':ui_module'],
+ deps = DEPS,
+ compiler_args = GWT_COMPILER_ARGS,
+ jvm_args = GWT_JVM_ARGS,
+)
diff --git a/gerrit-gwtui/gwt.bzl b/gerrit-gwtui/gwt.bzl
new file mode 100644
index 0000000..91936de
--- /dev/null
+++ b/gerrit-gwtui/gwt.bzl
@@ -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.
+
+# Port of Buck native gwt_binary() rule. See discussion in context of
+# https://github.com/facebook/buck/issues/109
+
+jar_filetype = FileType(['.jar'])
+GWT_COMPILER = "com.google.gwt.dev.Compiler"
+
+def _impl(ctx):
+ output_zip = ctx.outputs.output
+ output_dir = output_zip.path + '.gwt_output'
+ deploy_dir = output_zip.path + '.gwt_deploy'
+
+ deps = _get_transitive_closure(ctx)
+
+ paths = []
+ for dep in deps:
+ paths.append(dep.path)
+
+ cmd = "external/local_jdk/bin/java %s -Dgwt.normalizeTimestamps=true -cp %s %s -war %s -deploy %s " % (
+ " ".join(ctx.attr.jvm_args),
+ ":".join(paths),
+ GWT_COMPILER,
+ output_dir,
+ deploy_dir,
+ )
+ cmd += " ".join([
+ "-style %s" % ctx.attr.style,
+ "-optimize %s" % ctx.attr.optimize,
+ "-strict",
+ " ".join(ctx.attr.compiler_args),
+ " ".join(ctx.attr.modules) + "\n",
+ "rm -rf %s/gwt-unitCache\n" % output_dir,
+ "root=`pwd`\n",
+ "cd %s; $root/%s Cc ../%s $(find .)\n" % (
+ output_dir,
+ ctx.executable._zip.path,
+ output_zip.basename,
+ )
+ ])
+
+ ctx.action(
+ inputs = list(deps) + ctx.files._jdk + ctx.files._zip,
+ outputs = [output_zip],
+ mnemonic = "GwtBinary",
+ progress_message = "GWT compiling " + output_zip.short_path,
+ command = "set -e\n" + cmd,
+ )
+
+def _get_transitive_closure(ctx):
+ deps = set()
+ for dep in ctx.attr.module_deps:
+ deps += dep.java.transitive_runtime_deps
+ deps += dep.java.transitive_source_jars
+ for dep in ctx.attr.deps:
+ if hasattr(dep, 'java'):
+ deps += dep.java.transitive_runtime_deps
+ elif hasattr(dep, 'files'):
+ deps += dep.files
+
+ return deps
+
+gwt_binary = rule(
+ implementation = _impl,
+ attrs = {
+ "style": attr.string(default = "OBF"),
+ "optimize": attr.string(default = "9"),
+ "deps": attr.label_list(allow_files=jar_filetype),
+ "modules": attr.string_list(mandatory=True),
+ "module_deps": attr.label_list(allow_files=jar_filetype),
+ "compiler_args": attr.string_list(),
+ "jvm_args": attr.string_list(),
+ "_jdk": attr.label(
+ default=Label("//tools/defaults:jdk")),
+ "_zip": attr.label(
+ default=Label("@bazel_tools//tools/zip:zipper"),
+ executable=True,
+ single_file=True),
+ },
+ outputs = {
+ "output": "%{name}.zip",
+ },
+)
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 2b4c821..cb2ac07 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
@@ -486,7 +486,11 @@
} else if ("unified".equals(panel)) {
unified(token, baseId, id, side, line);
} else if ("edit".equals(panel)) {
- codemirrorForEdit(token, id, line);
+ if (!Patch.isMagic(id.get()) || Patch.COMMIT_MSG.equals(id.get())) {
+ codemirrorForEdit(token, id, line);
+ } else {
+ Gerrit.display(token, new NotFoundScreen());
+ }
} else {
Gerrit.display(token, new NotFoundScreen());
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java
index dd1505c..3f0daa2 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/FormatUtil.java
@@ -17,7 +17,6 @@
import com.google.gerrit.client.change.Resources;
import com.google.gerrit.client.info.AccountInfo;
import com.google.gerrit.client.info.GeneralPreferences;
-import com.google.gerrit.reviewdb.client.Account;
import com.google.gwt.i18n.client.NumberFormat;
import java.util.Date;
@@ -84,17 +83,6 @@
return createAccountFormatter().name(info);
}
- public static AccountInfo asInfo(Account acct) {
- if (acct == null) {
- return AccountInfo.create(0, null, null, null);
- }
- return AccountInfo.create(
- acct.getId() != null ? acct.getId().get() : 0,
- acct.getFullName(),
- acct.getPreferredEmail(),
- acct.getUserName());
- }
-
public static AccountInfo asInfo(com.google.gerrit.common.data.AccountInfo acct) {
if (acct == null) {
return AccountInfo.create(0, null, null, null);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
index d280e07..93246cb 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
@@ -50,6 +50,7 @@
import com.google.gerrit.extensions.client.DiffPreferencesInfo;
import com.google.gerrit.extensions.client.EditPreferencesInfo;
import com.google.gerrit.extensions.client.GerritTopMenu;
+import com.google.gerrit.extensions.client.UiType;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.aria.client.Roles;
import com.google.gwt.core.client.EntryPoint;
@@ -537,6 +538,14 @@
btmmenu.add(new InlineHTML(M.poweredBy(vs)));
+ if (info().gerrit().webUis().contains(UiType.POLYGERRIT)) {
+ btmmenu.add(new InlineLabel(" | "));
+ Anchor a = new Anchor(
+ C.polyGerrit(), GWT.getHostPageBaseURL() + "?polygerrit=1");
+ a.setStyleName("");
+ btmmenu.add(a);
+ }
+
String reportBugUrl = info().gerrit().reportBugUrl();
if (reportBugUrl != null) {
String reportBugText = info().gerrit().reportBugText();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java
index 4c8c58d..53d9260 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java
@@ -130,4 +130,6 @@
String searchDropdownChanges();
String searchDropdownDoc();
+
+ String polyGerrit();
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.properties
index 10d7e1d..d50ab34 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.properties
@@ -113,3 +113,5 @@
searchDropdownChanges = Changes
searchDropdownDoc = Docs
+
+polyGerrit = PolyGerrit
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
index 3290aac..5e7b873 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
@@ -127,6 +127,7 @@
createSignedTag, \
delete, \
deleteDrafts, \
+ editAssignee, \
editHashtags, \
editTopicName, \
forgeAuthor, \
@@ -150,6 +151,7 @@
createSignedTag = Create Signed Tag
delete = Delete Reference
deleteDrafts = Delete Drafts
+editAssignee = Edit Assignee
editHashtags = Edit Hashtags
editTopicName = Edit Topic Name
forgeAuthor = Forge Author Identity
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 9a4a049..55d22a9 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
@@ -204,6 +204,7 @@
@UiField FileTable files;
@UiField ListBox diffBase;
@UiField History history;
+ @UiField SimplePanel historyExtensionRight;
@UiField Button includedIn;
@UiField Button patchSets;
@@ -361,6 +362,9 @@
addExtensionPoint(
GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_COMMIT_INFO_BLOCK,
commitExtension, change, rev);
+ addExtensionPoint(
+ GerritUiExtensionPoint.CHANGE_SCREEN_HISTORY_RIGHT_OF_BUTTONS,
+ historyExtensionRight, change, rev);
}
private void addExtensionPoint(GerritUiExtensionPoint extensionPoint,
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.ui.xml
index a0d5405..7790044 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen.ui.xml
@@ -355,6 +355,11 @@
padding-top: 5px;
}
+ .historyExtension {
+ display: inline-block;
+ float: right;
+ }
+
.pushCertStatus {
padding-left: 5px;
}
@@ -601,6 +606,7 @@
<ui:attribute name='title'/>
<div><ui:msg>Collapse All</ui:msg></div>
</g:Button>
+ <g:SimplePanel ui:field='historyExtensionRight' styleName='{style.historyExtension}'/>
</div>
</div>
<c:History ui:field='history'/>
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java
index c0879e7..3a85b26 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java
@@ -267,11 +267,18 @@
if (table != null) {
String self = Gerrit.selfRedirect(null);
for (FileInfo info : Natives.asList(table.list)) {
- Window.open(self + "#" + url(info), "_blank", null);
+ if (canOpen(info.path())) {
+ Window.open(self + "#" + url(info), "_blank", null);
+ }
}
}
}
+ private boolean canOpen(String path) {
+ return mode != Mode.EDIT || !Patch.isMagic(path)
+ || Patch.COMMIT_MSG.equals(path);
+ }
+
private void setTable(MyTable table) {
clear();
add(table);
@@ -429,7 +436,10 @@
@Override
protected void onOpenRow(int row) {
if (1 <= row && row <= list.length()) {
- Gerrit.display(url(list.get(row - 1)));
+ FileInfo info = list.get(row - 1);
+ if (canOpen(info.path())) {
+ Gerrit.display(url(info));
+ }
}
}
@@ -452,7 +462,10 @@
@Override
public void onKeyPress(KeyPressEvent event) {
- Gerrit.display(url(list.get(index)));
+ FileInfo info = list.get(index);
+ if (canOpen(info.path())) {
+ Gerrit.display(url(info));
+ }
}
}
}
@@ -538,7 +551,7 @@
bytesDeleted = 0;
for (int i = 0; i < list.length(); i++) {
FileInfo info = list.get(i);
- if (!Patch.COMMIT_MSG.equals(info.path())) {
+ if (!Patch.isMagic(info.path())) {
if (!info.binary()) {
hasNonBinaryFile = true;
inserted += info.linesInserted();
@@ -628,7 +641,7 @@
private void columnDeleteRestore(SafeHtmlBuilder sb, FileInfo info) {
sb.openTd().setStyleName(R.css().restoreDelete());
if (hasUser) {
- if (!Patch.COMMIT_MSG.equals(info.path())) {
+ if (!Patch.isMagic(info.path())) {
boolean editable = isEditable(info);
sb.openDiv()
.openElement("button")
@@ -659,7 +672,7 @@
private void columnStatus(SafeHtmlBuilder sb, FileInfo info) {
sb.openTd().setStyleName(R.css().status());
- if (!Patch.COMMIT_MSG.equals(info.path())
+ if (!Patch.isMagic(info.path())
&& info.status() != null
&& !ChangeType.MODIFIED.matches(info.status())) {
sb.append(info.status());
@@ -668,20 +681,43 @@
}
private void columnPath(SafeHtmlBuilder sb, FileInfo info) {
- sb.openTd()
- .setStyleName(R.css().pathColumn())
- .openAnchor();
-
String path = info.path();
+
+ sb.openTd()
+ .setStyleName(R.css().pathColumn());
+
+ if (!canOpen(path)) {
+ sb.openDiv();
+ appendPath(path);
+ sb.closeDiv();
+ sb.closeTd();
+ return;
+ }
+
+ sb.openAnchor();
+
if (mode == Mode.EDIT && !isEditable(info)) {
sb.setAttribute("onclick", RESTORE + "(event," + info._row() + ")");
} else {
sb.setAttribute("href", "#" + url(info))
.setAttribute("onclick", OPEN + "(event," + info._row() + ")");
}
+ appendPath(path);
+ sb.closeAnchor();
+ if (info.oldPath() != null) {
+ sb.br();
+ sb.openSpan().setStyleName(R.css().renameCopySource())
+ .append(info.oldPath())
+ .closeSpan();
+ }
+ sb.closeTd();
+ }
+ private void appendPath(String path) {
if (Patch.COMMIT_MSG.equals(path)) {
sb.append(Util.C.commitMessage());
+ } else if (Patch.MERGE_LIST.equals(path)) {
+ sb.append(Util.C.mergeList());
} else if (Gerrit.getUserPreferences().muteCommonPathPrefixes()) {
int commonPrefixLen = commonPrefix(path);
if (commonPrefixLen > 0) {
@@ -694,15 +730,6 @@
} else {
sb.append(path);
}
-
- sb.closeAnchor();
- if (info.oldPath() != null) {
- sb.br();
- sb.openSpan().setStyleName(R.css().renameCopySource())
- .append(info.oldPath())
- .closeSpan();
- }
- sb.closeTd();
}
private int commonPrefix(String path) {
@@ -784,7 +811,7 @@
private void columnDelta1(SafeHtmlBuilder sb, FileInfo info) {
sb.openTd().setStyleName(R.css().deltaColumn1());
- if (!Patch.COMMIT_MSG.equals(info.path()) && !info.binary()) {
+ if (!Patch.isMagic(info.path()) && !info.binary()) {
if (showChangeSizeBars) {
sb.append(info.linesInserted() + info.linesDeleted());
} else if (!ChangeType.DELETED.matches(info.status())) {
@@ -813,7 +840,7 @@
private void columnDelta2(SafeHtmlBuilder sb, FileInfo info) {
sb.openTd().setStyleName(R.css().deltaColumn2());
if (showChangeSizeBars
- && !Patch.COMMIT_MSG.equals(info.path()) && !info.binary()
+ && !Patch.isMagic(info.path()) && !info.binary()
&& (info.linesInserted() != 0 || info.linesDeleted() != 0)) {
int w = 80;
int t = inserted + deleted;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Message.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Message.java
index 6c27ed9..c8735b7 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Message.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Message.java
@@ -176,6 +176,10 @@
if (l != null) {
comments.add(new FileComments(clp, ps, Util.C.commitMessage(), l));
}
+ l = m.remove(Patch.MERGE_LIST);
+ if (l != null) {
+ comments.add(new FileComments(clp, ps, Util.C.mergeList(), l));
+ }
for (Map.Entry<String, List<CommentInfo>> e : m.entrySet()) {
comments.add(new FileComments(clp, ps, e.getKey(), e.getValue()));
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChangesTab.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChangesTab.java
index 791effc..846ad53 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChangesTab.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/RelatedChangesTab.java
@@ -178,7 +178,7 @@
rows = new ArrayList<>(changes.length());
connectedPos = changes.length() - 1;
connected = showIndirectAncestors
- ? new HashSet<String>(Math.max(changes.length() * 4 / 3, 16))
+ ? new HashSet<>(Math.max(changes.length() * 4 / 3, 16))
: null;
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java
index e29048a..b985f43 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyBox.java
@@ -422,12 +422,17 @@
comments.add(new FileComments(clp, psId,
Util.C.commitMessage(), copyPath(Patch.COMMIT_MSG, l)));
}
+ l = m.get(Patch.MERGE_LIST);
+ if (l != null) {
+ comments.add(new FileComments(clp, psId, Util.C.commitMessage(),
+ copyPath(Patch.MERGE_LIST, l)));
+ }
List<String> paths = new ArrayList<>(m.keySet());
Collections.sort(paths);
for (String path : paths) {
- if (!path.equals(Patch.COMMIT_MSG)) {
+ if (!Patch.isMagic(path)) {
comments.add(new FileComments(clp, psId,
path, copyPath(path, m.get(path))));
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java
index b2334d1d..4a9eea4 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java
@@ -63,6 +63,7 @@
String patchTableColumnComments();
String patchTableColumnSize();
String commitMessage();
+ String mergeList();
String patchTablePrev();
String patchTableNext();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties
index b7e2677..675cd07 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties
@@ -45,6 +45,7 @@
patchTableColumnComments = Comments
patchTableColumnSize = Size
commitMessage = Commit Message
+mergeList = Merge List
patchTablePrev = Previous file
patchTableNext = Next file
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Header.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Header.java
index f377038..3033cbb1 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Header.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/Header.java
@@ -122,6 +122,8 @@
SafeHtmlBuilder b = new SafeHtmlBuilder();
if (Patch.COMMIT_MSG.equals(path)) {
return b.append(Util.C.commitMessage());
+ } else if (Patch.MERGE_LIST.equals(path)) {
+ return b.append(Util.C.mergeList());
}
int s = path.lastIndexOf('/') + 1;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java
index bc37abb..d45b8d8 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PatchSetSelectBox.java
@@ -128,7 +128,7 @@
if (meta == null) {
return;
}
- if (!Patch.COMMIT_MSG.equals(path)) {
+ if (!Patch.isMagic(path)) {
linkPanel.add(createDownloadLink());
}
if (!binary && open && idActive != null && Gerrit.isSignedIn()) {
@@ -147,7 +147,7 @@
void setUpBlame(final CodeMirror cm, final boolean isBase,
final PatchSet.Id rev, final String path) {
- if (!Patch.COMMIT_MSG.equals(path) && Gerrit.isSignedIn()
+ if (!Patch.isMagic(path) && Gerrit.isSignedIn()
&& Gerrit.info().change().allowBlame()) {
Anchor blameIcon = createBlameIcon();
blameIcon.addClickHandler(new ClickHandler() {
diff --git a/gerrit-httpd/BUCK b/gerrit-httpd/BUCK
index d52963a..0b0499c 100644
--- a/gerrit-httpd/BUCK
+++ b/gerrit-httpd/BUCK
@@ -73,7 +73,6 @@
'//lib/jgit/org.eclipse.jgit.junit:junit',
'//lib/joda:joda-time',
],
- source_under_test = [':httpd'],
# TODO(sop) Remove after Buck supports Eclipse
visibility = ['//tools/eclipse:classpath'],
)
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 3941657..8d8937c 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
@@ -34,6 +34,7 @@
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.GerritOptions;
import com.google.gwtexpui.server.CacheControlFilter;
import com.google.inject.Key;
import com.google.inject.Provider;
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java
index 3e3b7c4..fa551e8 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java
@@ -25,6 +25,7 @@
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.server.RemotePeer;
import com.google.gerrit.server.config.AuthConfig;
+import com.google.gerrit.server.config.GerritOptions;
import com.google.gerrit.server.config.GerritRequestModule;
import com.google.gerrit.server.config.GitwebCgiConfig;
import com.google.gerrit.server.git.AsyncReceiveCommits;
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
index fe556ac..ac7c7e7 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/gitweb/GitwebServlet.java
@@ -609,45 +609,39 @@
final OutputStream dst) throws IOException {
final int contentLength = req.getContentLength();
final InputStream src = req.getInputStream();
- new Thread(new Runnable() {
- @Override
- public void run() {
+ new Thread(() -> {
+ try {
try {
- try {
- final byte[] buf = new byte[bufferSize];
- int remaining = contentLength;
- while (0 < remaining) {
- final int max = Math.max(buf.length, remaining);
- final int n = src.read(buf, 0, max);
- if (n < 0) {
- throw new EOFException("Expected " + remaining + " more bytes");
- }
- dst.write(buf, 0, n);
- remaining -= n;
+ final byte[] buf = new byte[bufferSize];
+ int remaining = contentLength;
+ while (0 < remaining) {
+ final int max = Math.max(buf.length, remaining);
+ final int n = src.read(buf, 0, max);
+ if (n < 0) {
+ throw new EOFException("Expected " + remaining + " more bytes");
}
- } finally {
- dst.close();
+ dst.write(buf, 0, n);
+ remaining -= n;
}
- } catch (IOException e) {
- log.debug("Unexpected error copying input to CGI", e);
+ } finally {
+ dst.close();
}
+ } catch (IOException e) {
+ log.debug("Unexpected error copying input to CGI", e);
}
}, "Gitweb-InputFeeder").start();
}
private void copyStderrToLog(final InputStream in) {
- new Thread(new Runnable() {
- @Override
- public void run() {
- try (BufferedReader br =
- new BufferedReader(new InputStreamReader(in, ISO_8859_1.name()))) {
- String line;
- while ((line = br.readLine()) != null) {
- log.error("CGI: " + line);
- }
- } catch (IOException e) {
- log.debug("Unexpected error copying stderr from CGI", e);
+ new Thread(() -> {
+ try (BufferedReader br =
+ new BufferedReader(new InputStreamReader(in, ISO_8859_1.name()))) {
+ String line;
+ while ((line = br.readLine()) != null) {
+ log.error("CGI: " + line);
}
+ } catch (IOException e) {
+ log.debug("Unexpected error copying stderr from CGI", e);
}
}, "Gitweb-ErrorLogger").start();
}
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 27aff21..cd70143 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
@@ -18,14 +18,13 @@
import static com.google.gerrit.server.plugins.PluginEntry.ATTR_CHARACTER_ENCODING;
import static com.google.gerrit.server.plugins.PluginEntry.ATTR_CONTENT_TYPE;
import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toList;
import com.google.common.base.CharMatcher;
import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.cache.Cache;
-import com.google.common.collect.FluentIterable;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.io.ByteStreams;
@@ -74,6 +73,7 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
+import java.util.function.Predicate;
import java.util.jar.Attributes;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -378,34 +378,30 @@
List<PluginEntry> docs = new ArrayList<>();
PluginEntry about = null;
- Predicate<PluginEntry> filter = new Predicate<PluginEntry>() {
- @Override
- public boolean apply(PluginEntry entry) {
- String name = entry.getName();
- Optional<Long> size = entry.getSize();
- if (name.startsWith(prefix)
- && (name.endsWith(".md") || name.endsWith(".html"))
- && size.isPresent()) {
- if (size.get() <= 0 || size.get() > SMALL_RESOURCE) {
- log.warn(String.format(
- "Plugin %s: %s omitted from document index. "
- + "Size %d out of range (0,%d).",
- pluginName,
- name.substring(prefix.length()),
- size.get(),
- SMALL_RESOURCE));
- return false;
+ Predicate<PluginEntry> filter =
+ entry -> {
+ String name = entry.getName();
+ Optional<Long> size = entry.getSize();
+ if (name.startsWith(prefix)
+ && (name.endsWith(".md") || name.endsWith(".html"))
+ && size.isPresent()) {
+ if (size.get() <= 0 || size.get() > SMALL_RESOURCE) {
+ log.warn(String.format(
+ "Plugin %s: %s omitted from document index. "
+ + "Size %d out of range (0,%d).",
+ pluginName,
+ name.substring(prefix.length()),
+ size.get(),
+ SMALL_RESOURCE));
+ return false;
+ }
+ return true;
}
- return true;
- }
- return false;
- }
- };
+ return false;
+ };
- List<PluginEntry> entries = FluentIterable
- .from(Collections.list(scanner.entries()))
- .filter(filter)
- .toList();
+ List<PluginEntry> entries = Collections.list(scanner.entries()).stream()
+ .filter(filter).collect(toList());
for (PluginEntry entry: entries) {
String name = entry.getName().substring(prefix.length());
if (name.startsWith("cmd-")) {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java
index 4f07ac2..c35738b 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java
@@ -294,17 +294,14 @@
}
private Callable<Resource> newLoader(final Path p) {
- return new Callable<Resource>() {
- @Override
- public Resource call() throws IOException {
- try {
- return new Resource(
- getLastModifiedTime(p),
- contentType(p.toString()),
- Files.readAllBytes(p));
- } catch (NoSuchFileException e) {
- return Resource.NOT_FOUND;
- }
+ return () -> {
+ try {
+ return new Resource(
+ getLastModifiedTime(p),
+ contentType(p.toString()),
+ Files.readAllBytes(p));
+ } catch (NoSuchFileException e) {
+ return Resource.NOT_FOUND;
}
};
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticModule.java
index d3d8773..31e337e 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticModule.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/StaticModule.java
@@ -19,15 +19,14 @@
import static java.nio.file.Files.exists;
import static java.nio.file.Files.isReadable;
-import com.google.common.base.Enums;
import com.google.common.cache.Cache;
import com.google.common.collect.ImmutableList;
-import com.google.gerrit.httpd.GerritOptions;
-import com.google.gerrit.httpd.GerritOptions.UiPreference;
+import com.google.gerrit.extensions.client.UiType;
import com.google.gerrit.httpd.XsrfCookieFilter;
import com.google.gerrit.httpd.raw.ResourceServlet.Resource;
import com.google.gerrit.launcher.GerritLauncher;
import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.config.GerritOptions;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
@@ -464,7 +463,10 @@
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
- if (!isPolyGerritEnabled(req, res)) {
+ if (handlePolyGerritParam(req, res)) {
+ return;
+ }
+ if (!isPolyGerritEnabled(req)) {
chain.doFilter(req, res);
return;
}
@@ -507,41 +509,57 @@
return uri.startsWith(ctx) ? uri.substring(ctx.length()) : uri;
}
- private boolean isPolyGerritEnabled(HttpServletRequest req,
- HttpServletResponse res) {
+ private boolean handlePolyGerritParam(HttpServletRequest req,
+ HttpServletResponse res) throws IOException {
if (!options.enableGwtUi()) {
- return true;
+ return false;
}
+ boolean redirect = false;
String param = req.getParameter("polygerrit");
if ("1".equals(param)) {
- return setPolyGerritCookie(req, res, UiPreference.POLYGERRIT);
+ setPolyGerritCookie(req, res, UiType.POLYGERRIT);
+ redirect = true;
} else if ("0".equals(param)) {
- return setPolyGerritCookie(req, res, UiPreference.GWT);
- } else {
- return isPolyGerritCookie(req);
+ setPolyGerritCookie(req, res, UiType.GWT);
+ redirect = true;
}
+ if (redirect) {
+ // Strip polygerrit param from URL. This actually strips all params,
+ // which is a similar behavior to the JS PolyGerrit redirector code.
+ // Stripping just one param is frustratingly difficult without the use
+ // of Apache httpclient, which is a dep we don't want here:
+ // https://gerrit-review.googlesource.com/#/c/57570/57/gerrit-httpd/BUCK@32
+ res.sendRedirect(req.getRequestURL().toString());
+ }
+ return redirect;
+ }
+
+ private boolean isPolyGerritEnabled(HttpServletRequest req) {
+ return !options.enableGwtUi() || isPolyGerritCookie(req);
}
private boolean isPolyGerritCookie(HttpServletRequest req) {
- UiPreference pref = options.defaultUi();
+ UiType type = options.defaultUi();
Cookie[] all = req.getCookies();
if (all != null) {
for (Cookie c : all) {
if (GERRIT_UI_COOKIE.equals(c.getName())) {
- String v = c.getValue().toUpperCase();
- pref = Enums.getIfPresent(UiPreference.class, v).or(pref);
- break;
+ UiType t = UiType.parse(c.getValue());
+ if (t != null) {
+ type = t;
+ break;
+ }
}
}
}
- return pref == UiPreference.POLYGERRIT;
+ return type == UiType.POLYGERRIT;
}
- private boolean setPolyGerritCookie(HttpServletRequest req,
- HttpServletResponse res, UiPreference pref) {
+ private void setPolyGerritCookie(HttpServletRequest req,
+ HttpServletResponse res, UiType pref) {
// Only actually set a cookie if both UIs are enabled in the server;
// otherwise clear it.
- Cookie cookie = new Cookie(GERRIT_UI_COOKIE, pref.name().toLowerCase());
+ Cookie cookie = new Cookie(GERRIT_UI_COOKIE, pref.name());
if (options.enablePolyGerrit() && options.enableGwtUi()) {
cookie.setPath("/");
cookie.setSecure(isSecure(req));
@@ -551,7 +569,6 @@
cookie.setMaxAge(0);
}
res.addCookie(cookie);
- return pref == UiPreference.POLYGERRIT;
}
private static boolean isSecure(HttpServletRequest req) {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
index e3f3fb1..c1a3eec 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
@@ -26,6 +26,7 @@
import static java.math.RoundingMode.CEILING;
import static java.nio.charset.StandardCharsets.ISO_8859_1;
import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.joining;
import static javax.servlet.http.HttpServletResponse.SC_ACCEPTED;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
import static javax.servlet.http.HttpServletResponse.SC_CONFLICT;
@@ -41,9 +42,7 @@
import static javax.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED;
import com.google.common.base.CharMatcher;
-import com.google.common.base.Function;
import com.google.common.base.Joiner;
-import com.google.common.base.Predicates;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
@@ -145,6 +144,7 @@
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
+import java.util.stream.StreamSupport;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletException;
@@ -497,11 +497,13 @@
String headers = req.getHeader(ACCESS_CONTROL_REQUEST_HEADERS);
if (headers != null) {
res.addHeader(VARY, ACCESS_CONTROL_REQUEST_HEADERS);
- String badHeader = Iterables.getFirst(
- Iterables.filter(
- Splitter.on(',').trimResults().split(headers),
- Predicates.not(Predicates.in(ALLOWED_CORS_REQUEST_HEADERS))),
- null);
+ String badHeader =
+ StreamSupport.stream(
+ Splitter.on(',').trimResults().split(headers).spliterator(),
+ false)
+ .filter(h -> !ALLOWED_CORS_REQUEST_HEADERS.contains(h))
+ .findFirst()
+ .orElse(null);
if (badHeader != null) {
throw new BadRequestException(badHeader + " not allowed in CORS");
}
@@ -1034,16 +1036,12 @@
} else if (r.isEmpty()) {
throw new ResourceNotFoundException(projection);
} else {
- throw new AmbiguousViewException(String.format(
- "Projection %s is ambiguous: %s",
- name,
- Joiner.on(", ").join(
- Iterables.transform(r.keySet(), new Function<String, String>() {
- @Override
- public String apply(String in) {
- return in + "~" + projection;
- }
- }))));
+ throw new AmbiguousViewException(
+ String.format(
+ "Projection %s is ambiguous: %s",
+ name,
+ r.keySet().stream().map(in -> in + "~" + projection)
+ .collect(joining(", "))));
}
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java
index ed2a4f9..bd88e6a 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java
@@ -14,7 +14,6 @@
package com.google.gerrit.httpd.rpc.project;
-import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Maps;
import com.google.gerrit.common.data.AccessSection;
@@ -238,14 +237,7 @@
}
}
}
- return Maps.filterEntries(
- infos,
- new Predicate<Map.Entry<AccountGroup.UUID, GroupInfo>>() {
- @Override
- public boolean apply(Map.Entry<AccountGroup.UUID, GroupInfo> in) {
- return in.getValue() != null;
- }
- });
+ return Maps.filterEntries(infos, in -> in.getValue() != null);
}
private ProjectControl open() throws NoSuchProjectException {
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 2a506ba..29b2918 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
@@ -24,7 +24,6 @@
import static com.google.gerrit.server.index.change.ChangeIndexRewriter.CLOSED_STATUSES;
import static com.google.gerrit.server.index.change.ChangeIndexRewriter.OPEN_STATUSES;
-import com.google.common.base.Function;
import com.google.common.base.Throwables;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.FluentIterable;
@@ -585,17 +584,12 @@
cd.setStars(stars);
}
- private void decodeReviewers(Multimap<String, IndexableField> doc, ChangeData cd) {
+ private void decodeReviewers(Multimap<String, IndexableField> doc,
+ ChangeData cd) {
cd.setReviewers(
ChangeField.parseReviewerFieldValues(
FluentIterable.from(doc.get(REVIEWER_FIELD))
- .transform(
- new Function<IndexableField, String>() {
- @Override
- public String apply(IndexableField in) {
- return in.stringValue();
- }
- })));
+ .transform(IndexableField::stringValue)));
}
private static <T> List<T> decodeProtos(Multimap<String, IndexableField> doc,
diff --git a/gerrit-main/BUILD b/gerrit-main/BUILD
new file mode 100644
index 0000000..67863c5
--- /dev/null
+++ b/gerrit-main/BUILD
@@ -0,0 +1,13 @@
+java_binary(
+ name = 'main_bin',
+ main_class = 'Main',
+ runtime_deps = [':main_lib'],
+ visibility = ['//visibility:public'],
+)
+
+java_library(
+ name = 'main_lib',
+ srcs = ['src/main/java/Main.java'],
+ deps = ['//gerrit-launcher:launcher'],
+ visibility = ['//visibility:public'],
+)
diff --git a/gerrit-main/src/main/java/Main.java b/gerrit-main/src/main/java/Main.java
index a29f1c6..58de6a4 100644
--- a/gerrit-main/src/main/java/Main.java
+++ b/gerrit-main/src/main/java/Main.java
@@ -31,11 +31,11 @@
private static boolean onSupportedJavaVersion() {
final String version = System.getProperty("java.specification.version");
- if (1.7 <= parse(version)) {
+ if (1.8 <= parse(version)) {
return true;
}
- System.err.println("fatal: Gerrit Code Review requires Java 7 or later");
+ System.err.println("fatal: Gerrit Code Review requires Java 8 or later");
System.err.println(" (trying to run on Java " + version + ")");
return false;
}
diff --git a/gerrit-patch-jgit/BUCK b/gerrit-patch-jgit/BUCK
index 09ccf9c..4a4929e 100644
--- a/gerrit-patch-jgit/BUCK
+++ b/gerrit-patch-jgit/BUCK
@@ -33,7 +33,7 @@
'org/eclipse/jgit/diff/Edit.java;' +
'cd $TMP;' +
'zip -Dq $OUT org/eclipse/jgit/diff/Edit.java',
- out = 'edit.src.zip',
+ out = 'edit-sources.jar',
)
java_library(
@@ -61,6 +61,5 @@
'//lib/jgit/org.eclipse.jgit:jgit',
'//lib:junit',
],
- source_under_test = [':server'],
visibility = ['//tools/eclipse:classpath'],
)
diff --git a/gerrit-pgm/BUCK b/gerrit-pgm/BUCK
index 4be941c..8852133 100644
--- a/gerrit-pgm/BUCK
+++ b/gerrit-pgm/BUCK
@@ -180,5 +180,4 @@
'//lib/jgit/org.eclipse.jgit:jgit',
'//lib/jgit/org.eclipse.jgit.junit:junit',
],
- source_under_test = [':pgm'],
)
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 d98f999..078fdaf 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
@@ -23,7 +23,6 @@
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;
import com.google.gerrit.httpd.GetUserFilter;
import com.google.gerrit.httpd.GitOverHttpModule;
import com.google.gerrit.httpd.H2CacheBasedWebSession;
@@ -56,6 +55,7 @@
import com.google.gerrit.server.config.CanonicalWebUrlProvider;
import com.google.gerrit.server.config.DownloadConfig;
import com.google.gerrit.server.config.GerritGlobalModule;
+import com.google.gerrit.server.config.GerritOptions;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.RestCacheAdminModule;
import com.google.gerrit.server.events.StreamEventsApiListener;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java
index 9ae2d6c..2ed4c36 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java
@@ -14,9 +14,8 @@
package com.google.gerrit.pgm;
-import com.google.common.base.Function;
import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
import com.google.gerrit.common.IoUtil;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.PluginData;
@@ -42,6 +41,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Set;
/** Initialize a new Gerrit installation. */
public class Init extends BaseInit {
@@ -237,16 +237,10 @@
if (nullOrEmpty(installPlugins) || nullOrEmpty(plugins)) {
return;
}
- ArrayList<String> copy = Lists.newArrayList(installPlugins);
- List<String> pluginNames = Lists.transform(plugins, new Function<PluginData, String>() {
- @Override
- public String apply(PluginData input) {
- return input.name;
- }
- });
- copy.removeAll(pluginNames);
- if (!copy.isEmpty()) {
- ui.message("Cannot find plugin(s): %s\n", Joiner.on(", ").join(copy));
+ Set<String> missing = Sets.newHashSet(installPlugins);
+ plugins.stream().forEach(p -> missing.remove(p.name));
+ if (!missing.isEmpty()) {
+ ui.message("Cannot find plugin(s): %s\n", Joiner.on(", ").join(missing));
listPlugins = true;
}
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNoteDb.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNoteDb.java
index 0656c3b..030ac30 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNoteDb.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNoteDb.java
@@ -17,7 +17,6 @@
import static com.google.gerrit.reviewdb.server.ReviewDbUtil.unwrapDb;
import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
-import com.google.common.base.Function;
import com.google.common.base.Predicates;
import com.google.common.base.Stopwatch;
import com.google.common.collect.ArrayListMultimap;
@@ -234,13 +233,8 @@
ArrayListMultimap.create();
try (ReviewDb db = schemaFactory.open()) {
if (projects.isEmpty() && !changes.isEmpty()) {
- Iterable<Change> todo = unwrapDb(db).changes().get(
- Iterables.transform(changes, new Function<Integer, Change.Id>() {
- @Override
- public Change.Id apply(Integer in) {
- return new Change.Id(in);
- }
- }));
+ Iterable<Change> todo = unwrapDb(db).changes()
+ .get(Iterables.transform(changes, Change.Id::new));
for (Change c : todo) {
changesByProject.put(c.getProject(), c.getId());
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java
index 2e7d88a..501b115 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Reindex.java
@@ -16,10 +16,8 @@
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
+import static java.util.stream.Collectors.toSet;
-import com.google.common.base.Function;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
import com.google.gerrit.common.Die;
import com.google.gerrit.extensions.config.FactoryModule;
@@ -134,14 +132,8 @@
}
checkNotNull(indexDefs, "Called this method before injectMembers?");
- Set<String> valid = FluentIterable.from(indexDefs).transform(
- new Function<IndexDefinition<?, ?, ?>, String>() {
- @Override
- public String apply(IndexDefinition<?, ?, ?> input) {
- return input.getName();
- }
- }).toSortedSet(Ordering.natural());
-
+ Set<String> valid = indexDefs.stream()
+ .map(IndexDefinition::getName).sorted().collect(toSet());
Set<String> invalid = Sets.difference(Sets.newHashSet(indices), valid);
if (invalid.isEmpty()) {
return;
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 a6471c7..f4bcd86 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
@@ -135,8 +135,4 @@
libraries.bouncyCastlePGP.downloadRequired();
}
}
-
- @Override
- public void postRun() throws Exception {
- }
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java
index 4e5d044..b5b230d 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitCache.java
@@ -54,8 +54,4 @@
Path loc = site.resolve(path);
FileUtil.mkdirsOrDie(loc, "cannot create cache.directory");
}
-
- @Override
- public void postRun() throws Exception {
- }
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java
index 36754a1..03ddd7b 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitContainer.java
@@ -117,8 +117,4 @@
private static String javaHome() {
return System.getProperty("java.home");
}
-
- @Override
- public void postRun() throws Exception {
- }
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java
index 7e4d3c1..47783e4 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java
@@ -102,8 +102,4 @@
GerritServerIdProvider.KEY, GerritServerIdProvider.generate());
}
}
-
- @Override
- public void postRun() throws Exception {
- }
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java
index d8fd509..19eaa3c 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitGitManager.java
@@ -47,8 +47,4 @@
}
FileUtil.mkdirsOrDie(d, "Cannot create");
}
-
- @Override
- public void postRun() throws Exception {
- }
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java
index a907d46..72a70c9 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitHttpd.java
@@ -202,8 +202,4 @@
throw die("Cannot delete " + tmpdir, e);
}
}
-
- @Override
- public void postRun() throws Exception {
- }
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitIndex.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitIndex.java
index 018211b..185063b 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitIndex.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitIndex.java
@@ -87,8 +87,4 @@
return true;
}
}
-
- @Override
- public void postRun() throws Exception {
- }
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java
index 5c7eefd..ed5f7d2 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSendEmail.java
@@ -64,8 +64,4 @@
sendemail.string("SMTP username", "smtpUser", username);
sendemail.password("smtpUser", "smtpPass");
}
-
- @Override
- public void postRun() throws Exception {
- }
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java
index cb4439a..63d4883 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitSshd.java
@@ -163,8 +163,4 @@
System.err.println(" done");
}
}
-
- @Override
- public void postRun() throws Exception {
- }
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
index 52f9096..87b24f9 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
@@ -286,8 +286,4 @@
}
return null;
}
-
- @Override
- public void postRun() throws Exception {
- }
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitStep.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitStep.java
index fd28399..9d4becc 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitStep.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/api/InitStep.java
@@ -19,5 +19,5 @@
void run() throws Exception;
/** Executed after the site has been initialized */
- void postRun() throws Exception;
+ default void postRun() throws Exception {}
}
diff --git a/gerrit-plugin-api/BUILD b/gerrit-plugin-api/BUILD
index c761703..9404acc 100644
--- a/gerrit-plugin-api/BUILD
+++ b/gerrit-plugin-api/BUILD
@@ -58,3 +58,38 @@
],
visibility = ['//visibility:public'],
)
+
+java_binary(
+ name = 'plugin-api-sources',
+ main_class = 'Dummy',
+ runtime_deps = [
+ '//gerrit-antlr:libquery_exception-src.jar',
+ '//gerrit-antlr:libquery_parser-src.jar',
+ '//gerrit-common:libannotations-src.jar',
+ '//gerrit-extension-api:libapi-src.jar',
+ '//gerrit-gwtexpui:libserver-src.jar',
+ '//gerrit-httpd:libhttpd-src.jar',
+ '//gerrit-pgm:libinit-api-src.jar',
+ '//gerrit-reviewdb:libserver-src.jar',
+ '//gerrit-server:libserver-src.jar',
+ '//gerrit-sshd:libsshd-src.jar',
+ ],
+ visibility = ['//visibility:public'],
+)
+
+load('//tools/bzl:javadoc.bzl', 'java_doc')
+
+java_doc(
+ name = 'plugin-api-javadoc',
+ title = 'Gerrit Review Plugin API Documentation',
+ pkgs = ['com.google.gerrit'],
+ libs = PLUGIN_API + [
+ '//gerrit-antlr:query_exception',
+ '//gerrit-antlr:query_parser',
+ '//gerrit-common:annotations',
+ '//gerrit-common:server',
+ '//gerrit-extension-api:api',
+ '//gerrit-gwtexpui:server',
+ '//gerrit-reviewdb:server',
+ ],
+)
diff --git a/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs b/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs
index 2a585e4..602b029 100644
--- a/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs
+++ b/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs
@@ -4,8 +4,8 @@
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=ignore
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
@@ -85,7 +85,7 @@
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
diff --git a/gerrit-plugin-archetype/src/main/resources/archetype-resources/pom.xml b/gerrit-plugin-archetype/src/main/resources/archetype-resources/pom.xml
index 026e21d..f0cc120 100644
--- a/gerrit-plugin-archetype/src/main/resources/archetype-resources/pom.xml
+++ b/gerrit-plugin-archetype/src/main/resources/archetype-resources/pom.xml
@@ -66,8 +66,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
- <source>1.7</source>
- <target>1.7</target>
+ <source>1.8</source>
+ <target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs
index 2a585e4..602b029 100644
--- a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs
+++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs
@@ -4,8 +4,8 @@
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=ignore
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
@@ -85,7 +85,7 @@
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/pom.xml b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/pom.xml
index 2c7fe88..baec648 100644
--- a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/pom.xml
+++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/pom.xml
@@ -61,8 +61,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
- <source>1.7</source>
- <target>1.7</target>
+ <source>1.8</source>
+ <target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
diff --git a/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs
index 2a585e4..602b029 100644
--- a/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs
+++ b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs
@@ -4,8 +4,8 @@
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=ignore
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
@@ -85,7 +85,7 @@
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
diff --git a/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/pom.xml b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/pom.xml
index 8f4aadd..7a38260 100644
--- a/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/pom.xml
+++ b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/pom.xml
@@ -60,8 +60,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
- <source>1.7</source>
- <target>1.7</target>
+ <source>1.8</source>
+ <target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
diff --git a/gerrit-reviewdb/BUCK b/gerrit-reviewdb/BUCK
index 82e0135..a5fb1f5 100644
--- a/gerrit-reviewdb/BUCK
+++ b/gerrit-reviewdb/BUCK
@@ -33,6 +33,5 @@
'//lib:gwtorm',
'//lib:truth',
],
- source_under_test = [':client'],
visibility = ['//tools/eclipse:classpath'],
)
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java
index 6a55965..309bda4 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java
@@ -22,6 +22,22 @@
/** Magical file name which represents the commit message. */
public static final String COMMIT_MSG = "/COMMIT_MSG";
+ /** Magical file name which represents the merge list of a merge commit. */
+ public static final String MERGE_LIST = "/MERGE_LIST";
+
+ /**
+ * Checks if the given path represents a magic file. A magic file is a
+ * generated file that is automatically included into changes. It does not
+ * exist in the commit of the patch set.
+ *
+ * @param path the file path
+ * @return {@code true} if the path represents a magic file, otherwise
+ * {@code false}.
+ */
+ public static boolean isMagic(String path) {
+ return COMMIT_MSG.equals(path) || MERGE_LIST.equals(path);
+ }
+
public static class Key extends StringKey<PatchSet.Id> {
private static final long serialVersionUID = 1L;
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java
index 42d0993..7e2a9b0 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ReviewDbUtil.java
@@ -14,41 +14,37 @@
package com.google.gerrit.reviewdb.server;
-import com.google.common.base.Function;
import com.google.common.collect.Ordering;
-import com.google.gerrit.reviewdb.client.Change;
import com.google.gwtorm.client.IntKey;
/** Static utilities for ReviewDb types. */
public class ReviewDbUtil {
- public static final Function<IntKey<?>, Integer> INT_KEY_FUNCTION =
- new Function<IntKey<?>, Integer>() {
- @Override
- public Integer apply(IntKey<?> in) {
- return in.get();
- }
- };
-
- private static final Function<Change, Change.Id> CHANGE_ID_FUNCTION =
- new Function<Change, Change.Id>() {
- @Override
- public Change.Id apply(Change in) {
- return in.getId();
- }
- };
-
private static final Ordering<? extends IntKey<?>> INT_KEY_ORDERING =
- Ordering.natural().nullsFirst().onResultOf(INT_KEY_FUNCTION).nullsFirst();
+ Ordering.natural()
+ .nullsFirst()
+ .<IntKey<?>>onResultOf(IntKey::get)
+ .nullsFirst();
+ /**
+ * Null-safe ordering over arbitrary subclass of {@code IntKey}.
+ * <p>
+ * In some cases, {@code Comparator.comparing(Change.Id::get)} may be shorter
+ * and cleaner. However, this method may be preferable in some cases:
+ * <ul>
+ * <li>This ordering is null-safe over both input and the result of {@link
+ * IntKey#get()}; {@code comparing} is only a good idea if all inputs are
+ * obviously non-null.</li>
+ * <li>{@code intKeyOrdering().sortedCopy(iterable)} is shorter than the
+ * stream equivalent.</li>
+ * <li>Creating derived comparators may be more readable with {@link Ordering}
+ * method chaining rather than static {@code Comparator} methods.
+ * </ul>
+ */
@SuppressWarnings("unchecked")
public static <K extends IntKey<?>> Ordering<K> intKeyOrdering() {
return (Ordering<K>) INT_KEY_ORDERING;
}
- public static Function<Change, Change.Id> changeIdFunction() {
- return CHANGE_ID_FUNCTION;
- }
-
public static ReviewDb unwrapDb(ReviewDb db) {
if (db instanceof DisabledChangesReviewDbWrapper) {
return ((DisabledChangesReviewDbWrapper) db).unsafeGetDelegate();
diff --git a/gerrit-server/BUCK b/gerrit-server/BUCK
index 080b52b..66fc545 100644
--- a/gerrit-server/BUCK
+++ b/gerrit-server/BUCK
@@ -181,7 +181,6 @@
'//gerrit-server/src/main/prolog:common',
'//lib/antlr:java_runtime',
],
- source_under_test = [':server'],
)
java_test(
@@ -208,6 +207,5 @@
'//lib/guice:guice-assistedinject',
'//lib/prolog:runtime',
],
- source_under_test = [':server'],
visibility = ['//tools/eclipse:classpath'],
)
diff --git a/gerrit-server/BUILD b/gerrit-server/BUILD
index a591fba..6c7ab3e 100644
--- a/gerrit-server/BUILD
+++ b/gerrit-server/BUILD
@@ -208,3 +208,12 @@
],
visibility = ['//visibility:public'],
)
+
+load('//tools/bzl:javadoc.bzl', 'java_doc')
+
+java_doc(
+ name = 'doc',
+ title = 'Gerrit Review Server Documentation',
+ libs = [':server'],
+ pkgs = ['com.google.gerrit'],
+)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/Field.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/Field.java
index 364f4f8..95fbf04 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/Field.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/Field.java
@@ -161,17 +161,10 @@
private static <T> Function<T, String> initFormatter(Class<T> keyType) {
if (keyType == String.class) {
return (Function<T, String>) Functions.<String> identity();
-
} else if (keyType == Integer.class || keyType == Boolean.class) {
return (Function<T, String>) Functions.toStringFunction();
-
} else if (Enum.class.isAssignableFrom(keyType)) {
- return new Function<T, String>() {
- @Override
- public String apply(T in) {
- return ((Enum<?>) in).name();
- }
- };
+ return in -> ((Enum<?>) in).name();
}
throw new IllegalStateException("unsupported type " + keyType.getName());
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java
index e7ab75c..d3fe6ed 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCallback.java
@@ -14,7 +14,6 @@
package com.google.gerrit.metrics.dropwizard;
-import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import com.google.gerrit.metrics.Description;
@@ -124,14 +123,7 @@
@Override
public Map<Object, Metric> getCells() {
- return Maps.transformValues(
- cells,
- new Function<ValueGauge, Metric> () {
- @Override
- public Metric apply(ValueGauge in) {
- return in;
- }
- });
+ return Maps.transformValues(cells, in -> (Metric) in);
}
final class ValueGauge implements Gauge<V> {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCounter.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCounter.java
index 10b92e6..7894a84 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCounter.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedCounter.java
@@ -14,7 +14,6 @@
package com.google.gerrit.metrics.dropwizard;
-import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import com.google.gerrit.metrics.Description;
@@ -98,13 +97,6 @@
@Override
public Map<Object, Metric> getCells() {
- return Maps.transformValues(
- cells,
- new Function<CounterImpl, Metric> () {
- @Override
- public Metric apply(CounterImpl in) {
- return in.metric;
- }
- });
+ return Maps.transformValues(cells, c -> c.metric);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedHistogram.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedHistogram.java
index 071c678..ff38cd4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedHistogram.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedHistogram.java
@@ -14,7 +14,6 @@
package com.google.gerrit.metrics.dropwizard;
-import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import com.google.gerrit.metrics.Description;
@@ -96,13 +95,6 @@
@Override
public Map<Object, Metric> getCells() {
- return Maps.transformValues(
- cells,
- new Function<HistogramImpl, Metric> () {
- @Override
- public Metric apply(HistogramImpl in) {
- return in.metric;
- }
- });
+ return Maps.transformValues(cells, h -> h.metric);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java
index 6981ef1..aff6c4a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/BucketedTimer.java
@@ -14,7 +14,6 @@
package com.google.gerrit.metrics.dropwizard;
-import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import com.google.gerrit.metrics.Description;
@@ -96,13 +95,6 @@
@Override
public Map<Object, Metric> getCells() {
- return Maps.transformValues(
- cells,
- new Function<TimerImpl, Metric> () {
- @Override
- public Metric apply(TimerImpl in) {
- return in.metric;
- }
- });
+ return Maps.transformValues(cells, t -> t.metric);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java
index e159c82..ee2ce29 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/metrics/dropwizard/DropWizardMetricMaker.java
@@ -18,7 +18,6 @@
import static com.google.gerrit.metrics.dropwizard.MetricResource.METRIC_KIND;
import static com.google.gerrit.server.config.ConfigResource.CONFIG_KIND;
-import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
@@ -304,14 +303,8 @@
@Override
public synchronized RegistrationHandle newTrigger(
Set<CallbackMetric<?>> metrics, Runnable trigger) {
- final ImmutableSet<CallbackMetricGlue> all = FluentIterable.from(metrics)
- .transform(
- new Function<CallbackMetric<?>, CallbackMetricGlue>() {
- @Override
- public CallbackMetricGlue apply(CallbackMetric<?> input) {
- return (CallbackMetricGlue) input;
- }
- })
+ ImmutableSet<CallbackMetricGlue> all = FluentIterable.from(metrics)
+ .transform(m -> (CallbackMetricGlue) m)
.toSet();
trigger = new CallbackGroup(trigger, all);
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 5c0723a..97af09e 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
@@ -16,10 +16,9 @@
import static com.google.gerrit.server.notedb.ReviewerStateInternal.CC;
import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
+import static java.util.Comparator.comparing;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.Iterables;
@@ -52,7 +51,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -81,14 +79,7 @@
LoggerFactory.getLogger(ApprovalsUtil.class);
private static final Ordering<PatchSetApproval> SORT_APPROVALS =
- Ordering.natural()
- .onResultOf(
- new Function<PatchSetApproval, Timestamp>() {
- @Override
- public Timestamp apply(PatchSetApproval a) {
- return a.getGranted();
- }
- });
+ Ordering.from(comparing(PatchSetApproval::getGranted));
public static List<PatchSetApproval> sortApprovals(
Iterable<PatchSetApproval> approvals) {
@@ -97,12 +88,8 @@
private static Iterable<PatchSetApproval> filterApprovals(
Iterable<PatchSetApproval> psas, final Account.Id accountId) {
- return Iterables.filter(psas, new Predicate<PatchSetApproval>() {
- @Override
- public boolean apply(PatchSetApproval input) {
- return Objects.equals(input.getAccountId(), accountId);
- }
- });
+ return Iterables.filter(
+ psas, a -> Objects.equals(a.getAccountId(), accountId));
}
private final NotesMigration migration;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
index 11a3d81..7866ed3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
@@ -14,7 +14,8 @@
package com.google.gerrit.server;
-import com.google.common.base.Function;
+import static java.util.Comparator.comparingInt;
+
import com.google.common.collect.Ordering;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.server.ReviewDb;
@@ -40,16 +41,8 @@
private static final String SUBJECT_CROP_APPENDIX = "...";
private static final int SUBJECT_CROP_RANGE = 10;
- public static final Function<PatchSet, Integer> TO_PS_ID =
- new Function<PatchSet, Integer>() {
- @Override
- public Integer apply(PatchSet in) {
- return in.getId().get();
- }
- };
-
- public static final Ordering<PatchSet> PS_ID_ORDER = Ordering.natural()
- .onResultOf(TO_PS_ID);
+ public static final Ordering<PatchSet> PS_ID_ORDER =
+ Ordering.from(comparingInt(PatchSet::getPatchSetId));
/**
* Generate a new unique identifier for change message entities.
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/OptionUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/OptionUtil.java
index 24d10f7..c050a61 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/OptionUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/OptionUtil.java
@@ -15,7 +15,6 @@
package com.google.gerrit.server;
import com.google.common.base.CharMatcher;
-import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
@@ -24,16 +23,10 @@
private static final Splitter COMMA_OR_SPACE =
Splitter.on(CharMatcher.anyOf(", ")).omitEmptyStrings().trimResults();
- private static final Function<String, String> TO_LOWER_CASE =
- new Function<String, String>() {
- @Override
- public String apply(String input) {
- return input.toLowerCase();
- }
- };
-
public static Iterable<String> splitOptionValue(String value) {
- return Iterables.transform(COMMA_OR_SPACE.split(value), TO_LOWER_CASE);
+ return Iterables.transform(
+ COMMA_OR_SPACE.split(value),
+ String::toLowerCase);
}
private OptionUtil() {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/PatchLineCommentsUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/PatchLineCommentsUtil.java
index 603f528..68065cb 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/PatchLineCommentsUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/PatchLineCommentsUtil.java
@@ -16,9 +16,9 @@
import static com.google.common.base.MoreObjects.firstNonNull;
import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.stream.Collectors.toList;
import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Iterables;
@@ -28,6 +28,7 @@
import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
import com.google.gerrit.reviewdb.client.PatchSet;
@@ -38,7 +39,6 @@
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.notedb.ChangeUpdate;
-import com.google.gerrit.server.notedb.DraftCommentNotes;
import com.google.gerrit.server.notedb.NotesMigration;
import com.google.gerrit.server.patch.PatchListCache;
import com.google.gerrit.server.patch.PatchListNotAvailableException;
@@ -60,6 +60,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.stream.StreamSupport;
/**
* Utility functions to manipulate PatchLineComments.
@@ -112,17 +113,14 @@
private final GitRepositoryManager repoManager;
private final AllUsersName allUsers;
- private final DraftCommentNotes.Factory draftFactory;
private final NotesMigration migration;
@Inject
PatchLineCommentsUtil(GitRepositoryManager repoManager,
AllUsersName allUsers,
- DraftCommentNotes.Factory draftFactory,
NotesMigration migration) {
this.repoManager = repoManager;
this.allUsers = allUsers;
- this.draftFactory = draftFactory;
this.migration = migration;
}
@@ -178,13 +176,7 @@
ResultSet<PatchLineComment> comments,
final PatchLineComment.Status status) {
return Lists.newArrayList(
- Iterables.filter(comments, new Predicate<PatchLineComment>() {
- @Override
- public boolean apply(PatchLineComment input) {
- return (input.getStatus() == status);
- }
- })
- );
+ Iterables.filter(comments, c -> c.getStatus() == status));
}
public List<PatchLineComment> byPatchSet(ReviewDb db,
@@ -216,10 +208,27 @@
public List<PatchLineComment> publishedByPatchSet(ReviewDb db,
ChangeNotes notes, PatchSet.Id psId) throws OrmException {
if (!migration.readChanges()) {
- return sort(
- db.patchComments().publishedByPatchSet(psId).toList());
+ return removeCommentsOnAncestorOfCommitMessage(sort(
+ db.patchComments().publishedByPatchSet(psId).toList()));
}
- return commentsOnPatchSet(notes.load().getComments().values(), psId);
+ return removeCommentsOnAncestorOfCommitMessage(
+ commentsOnPatchSet(notes.load().getComments().values(), psId));
+ }
+
+ /**
+ * For the commit message the A side in a diff view is always empty when a
+ * comparison against an ancestor is done, so there can't be any comments on
+ * this ancestor. However earlier we showed the auto-merge commit message on
+ * side A when for a merge commit a comparison against the auto-merge was
+ * done. From that time there may still be comments on the auto-merge commit
+ * message and those we want to filter out.
+ */
+ private List<PatchLineComment> removeCommentsOnAncestorOfCommitMessage(
+ List<PatchLineComment> list) {
+ return list.stream()
+ .filter(c -> c.getSide() != 0
+ || !Patch.COMMIT_MSG.equals(c.getKey().getParentKey().get()))
+ .collect(toList());
}
public List<PatchLineComment> draftByPatchSetAuthor(ReviewDb db,
@@ -251,16 +260,11 @@
throws OrmException {
if (!migration.readChanges()) {
final Change.Id matchId = notes.getChangeId();
- return FluentIterable
- .from(db.patchComments().draftByAuthor(author))
- .filter(new Predicate<PatchLineComment>() {
- @Override
- public boolean apply(PatchLineComment in) {
- Change.Id changeId =
- in.getKey().getParentKey().getParentKey().getParentKey();
- return changeId.equals(matchId);
- }
- }).toSortedList(PLC_ORDER);
+ return StreamSupport.stream(
+ db.patchComments().draftByAuthor(author).spliterator(), false)
+ .filter(c -> c.getPatchSetId().getParentKey().equals(matchId))
+ .sorted(PLC_ORDER)
+ .collect(toList());
}
List<PatchLineComment> comments = new ArrayList<>();
comments.addAll(notes.getDraftComments(author).values());
@@ -268,13 +272,14 @@
}
@Deprecated // To be used only by HasDraftByLegacyPredicate.
- public List<PatchLineComment> draftByAuthor(ReviewDb db,
+ public List<Change.Id> changesWithDraftsByAuthor(ReviewDb db,
Account.Id author) throws OrmException {
if (!migration.readChanges()) {
- return sort(db.patchComments().draftByAuthor(author).toList());
+ return FluentIterable.from(db.patchComments().draftByAuthor(author))
+ .transform(plc -> plc.getPatchSetId().getParentKey()).toList();
}
- List<PatchLineComment> comments = new ArrayList<>();
+ List<Change.Id> changes = new ArrayList<>();
try (Repository repo = repoManager.openRepository(allUsers)) {
for (String refName : repo.getRefDatabase()
.getRefs(RefNames.REFS_DRAFT_COMMENTS).keySet()) {
@@ -283,17 +288,12 @@
if (accountId == null || changeId == null) {
continue;
}
- // Avoid loading notes for all affected changes just to be able to auto-
- // rebuild. This is only used in a corner case in the search codepath,
- // so returning slightly stale values is ok.
- DraftCommentNotes notes =
- draftFactory.createWithAutoRebuildingDisabled(changeId, author);
- comments.addAll(notes.load().getComments().values());
+ changes.add(changeId);
}
} catch (IOException e) {
throw new OrmException(e);
}
- return sort(comments);
+ return changes;
}
public void putComments(ReviewDb db, ChangeUpdate update,
@@ -359,7 +359,7 @@
return sort(result);
}
- public static RevId setCommentRevId(PatchLineComment c,
+ public static void setCommentRevId(PatchLineComment c,
PatchListCache cache, Change change, PatchSet ps) throws OrmException {
checkArgument(c.getPatchSetId().equals(ps.getId()),
"cannot set RevId for patch set %s on comment %s", ps.getId(), c);
@@ -380,7 +380,6 @@
throw new OrmException(e);
}
}
- return c.getRevId();
}
public Collection<Ref> getDraftRefs(Change.Id changeId)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java
index e1f786b..5941c10 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java
@@ -14,14 +14,14 @@
package com.google.gerrit.server;
-import com.google.common.base.Function;
+import static java.util.Comparator.comparing;
+
import com.google.common.base.MoreObjects;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
-import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.GroupReference;
import com.google.gerrit.common.errors.NoSuchGroupException;
import com.google.gerrit.extensions.common.AccountInfo;
@@ -68,19 +68,17 @@
public class ReviewersUtil {
private static final String MAX_SUFFIX = "\u9fa5";
private static final Ordering<SuggestedReviewerInfo> ORDERING =
- Ordering.natural().onResultOf(new Function<SuggestedReviewerInfo, String>() {
- @Nullable
- @Override
- public String apply(@Nullable SuggestedReviewerInfo suggestedReviewerInfo) {
- if (suggestedReviewerInfo == null) {
- return null;
- }
- return suggestedReviewerInfo.account != null
- ? MoreObjects.firstNonNull(suggestedReviewerInfo.account.email,
- Strings.nullToEmpty(suggestedReviewerInfo.account.name))
- : Strings.nullToEmpty(suggestedReviewerInfo.group.name);
- }
- });
+ Ordering.<SuggestedReviewerInfo> from(comparing(
+ suggestedReviewerInfo -> {
+ if (suggestedReviewerInfo == null) {
+ return null;
+ }
+ return suggestedReviewerInfo.account != null
+ ? MoreObjects.firstNonNull(suggestedReviewerInfo.account.email,
+ Strings.nullToEmpty(suggestedReviewerInfo.account.name))
+ : Strings.nullToEmpty(suggestedReviewerInfo.group.name);
+ }));
+
private final AccountLoader accountLoader;
private final AccountCache accountCache;
private final AccountIndexCollection indexes;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/StarredChangesUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/StarredChangesUtil.java
index 5a89afa..8f25e43 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/StarredChangesUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/StarredChangesUtil.java
@@ -15,14 +15,12 @@
package com.google.gerrit.server;
import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toSet;
import com.google.auto.value.AutoValue;
import com.google.common.base.CharMatcher;
-import com.google.common.base.Function;
import com.google.common.base.Joiner;
-import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
-import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
@@ -249,29 +247,11 @@
public Set<Account.Id> byChange(final Change.Id changeId,
final String label) throws OrmException {
try (final Repository repo = repoManager.openRepository(allUsers)) {
- return FluentIterable
- .from(getRefNames(repo, RefNames.refsStarredChangesPrefix(changeId)))
- .transform(new Function<String, Account.Id>() {
- @Override
- public Account.Id apply(String refPart) {
- return Account.Id.parse(refPart);
- }
- })
- .filter(new Predicate<Account.Id>() {
- @Override
- public boolean apply(Account.Id accountId) {
- try {
- return readLabels(repo,
- RefNames.refsStarredChanges(changeId, accountId))
- .contains(label);
- } catch (IOException e) {
- log.error(String.format(
- "Cannot query stars by account %d on change %d",
- accountId.get(), changeId.get()), e);
- return false;
- }
- }
- }).toSet();
+ return getRefNames(repo, RefNames.refsStarredChangesPrefix(changeId))
+ .stream()
+ .map(Account.Id::parse)
+ .filter(accountId -> hasStar(repo, changeId, accountId, label))
+ .collect(toSet());
} catch (IOException e) {
throw new OrmException(
String.format("Get accounts that starred change %d failed",
@@ -283,36 +263,12 @@
// To be used only for IsStarredByLegacyPredicate.
public Set<Change.Id> byAccount(final Account.Id accountId,
final String label) throws OrmException {
- try (final Repository repo = repoManager.openRepository(allUsers)) {
- return FluentIterable
- .from(getRefNames(repo, RefNames.REFS_STARRED_CHANGES))
- .filter(new Predicate<String>() {
- @Override
- public boolean apply(String refPart) {
- return refPart.endsWith("/" + accountId.get());
- }
- })
- .transform(new Function<String, Change.Id>() {
- @Override
- public Change.Id apply(String refPart) {
- return Change.Id.fromRefPart(refPart);
- }
- })
- .filter(new Predicate<Change.Id>() {
- @Override
- public boolean apply(Change.Id changeId) {
- try {
- return readLabels(repo,
- RefNames.refsStarredChanges(changeId, accountId))
- .contains(label);
- } catch (IOException e) {
- log.error(String.format(
- "Cannot query stars by account %d on change %d",
- accountId.get(), changeId.get()), e);
- return false;
- }
- }
- }).toSet();
+ try (Repository repo = repoManager.openRepository(allUsers)) {
+ return getRefNames(repo, RefNames.REFS_STARRED_CHANGES).stream()
+ .filter(refPart -> refPart.endsWith("/" + accountId.get()))
+ .map(Change.Id::fromRefPart)
+ .filter(changeId -> hasStar(repo, changeId, accountId, label))
+ .collect(toSet());
} catch (IOException e) {
throw new OrmException(
String.format("Get changes that were starred by %d failed",
@@ -320,6 +276,20 @@
}
}
+ private boolean hasStar(Repository repo, Change.Id changeId,
+ Account.Id accountId, String label) {
+ try {
+ return readLabels(repo,
+ RefNames.refsStarredChanges(changeId, accountId))
+ .contains(label);
+ } catch (IOException e) {
+ log.error(String.format(
+ "Cannot query stars by account %d on change %d",
+ accountId.get(), changeId.get()), e);
+ return false;
+ }
+ }
+
public ImmutableMultimap<Account.Id, String> byChangeFromIndex(
Change.Id changeId) throws OrmException, NoSuchChangeException {
Set<String> fields = ImmutableSet.of(
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java b/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java
index 761f2a3..6dccbc2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java
@@ -39,37 +39,31 @@
@Singleton
public class WebLinks {
private static final Logger log = LoggerFactory.getLogger(WebLinks.class);
+
private static final Predicate<WebLinkInfo> INVALID_WEBLINK =
- new Predicate<WebLinkInfo>() {
-
- @Override
- public boolean apply(WebLinkInfo link) {
- if (link == null) {
- return false;
- } else if (Strings.isNullOrEmpty(link.name)
- || Strings.isNullOrEmpty(link.url)) {
- log.warn(String.format("%s is missing name and/or url",
- link.getClass().getName()));
- return false;
- }
- return true;
+ link -> {
+ if (link == null) {
+ return false;
+ } else if (Strings.isNullOrEmpty(link.name)
+ || Strings.isNullOrEmpty(link.url)) {
+ log.warn(String.format("%s is missing name and/or url",
+ link.getClass().getName()));
+ return false;
}
+ return true;
};
- private static final Predicate<WebLinkInfoCommon> INVALID_WEBLINK_COMMON =
- new Predicate<WebLinkInfoCommon>() {
- @Override
- public boolean apply(WebLinkInfoCommon link) {
- if (link == null) {
- return false;
- } else if (Strings.isNullOrEmpty(link.name)
- || Strings.isNullOrEmpty(link.url)) {
- log.warn(String.format("%s is missing name and/or url", link
- .getClass().getName()));
- return false;
- }
- return true;
+ private static final Predicate<WebLinkInfoCommon> INVALID_WEBLINK_COMMON =
+ link -> {
+ if (link == null) {
+ return false;
+ } else if (Strings.isNullOrEmpty(link.name)
+ || Strings.isNullOrEmpty(link.url)) {
+ log.warn(String.format("%s is missing name and/or url", link
+ .getClass().getName()));
+ return false;
}
+ return true;
};
private final DynamicSet<PatchSetWebLink> patchSetLinks;
@@ -85,8 +79,7 @@
DynamicSet<FileHistoryWebLink> fileLogLinks,
DynamicSet<DiffWebLink> diffLinks,
DynamicSet<ProjectWebLink> projectLinks,
- DynamicSet<BranchWebLink> branchLinks
- ) {
+ DynamicSet<BranchWebLink> branchLinks) {
this.patchSetLinks = patchSetLinks;
this.fileLinks = fileLinks;
this.fileHistoryLinks = fileLogLinks;
@@ -101,15 +94,11 @@
* @param commit SHA1 of commit.
* @return Links for patch sets.
*/
- public FluentIterable<WebLinkInfo> getPatchSetLinks(final Project.NameKey project,
- final String commit) {
- return filterLinks(patchSetLinks, new Function<WebLink, WebLinkInfo>() {
-
- @Override
- public WebLinkInfo apply(WebLink webLink) {
- return ((PatchSetWebLink)webLink).getPatchSetWebLink(project.get(), commit);
- }
- });
+ public FluentIterable<WebLinkInfo> getPatchSetLinks(Project.NameKey project,
+ String commit) {
+ return filterLinks(
+ patchSetLinks,
+ webLink -> webLink.getPatchSetWebLink(project.get(), commit));
}
/**
@@ -119,15 +108,11 @@
* @param file File name.
* @return Links for files.
*/
- public FluentIterable<WebLinkInfo> getFileLinks(final String project, final String revision,
- final String file) {
- return filterLinks(fileLinks, new Function<WebLink, WebLinkInfo>() {
-
- @Override
- public WebLinkInfo apply(WebLink webLink) {
- return ((FileWebLink)webLink).getFileWebLink(project, revision, file);
- }
- });
+ public FluentIterable<WebLinkInfo> getFileLinks(String project,
+ String revision, String file) {
+ return filterLinks(
+ fileLinks,
+ webLink -> webLink.getFileWebLink(project, revision, file));
}
/**
@@ -137,39 +122,31 @@
* @param file File name.
* @return Links for file history
*/
- public FluentIterable<WebLinkInfo> getFileHistoryLinks(final String project,
- final String revision, final String file) {
- return filterLinks(fileHistoryLinks, new Function<WebLink, WebLinkInfo>() {
-
- @Override
- public WebLinkInfo apply(WebLink webLink) {
- return ((FileHistoryWebLink) webLink).getFileHistoryWebLink(project,
- revision, file);
- }
- });
+ public FluentIterable<WebLinkInfo> getFileHistoryLinks(String project,
+ String revision, String file) {
+ return filterLinks(
+ fileHistoryLinks,
+ webLink -> webLink.getFileHistoryWebLink(project, revision, file));
}
public FluentIterable<WebLinkInfoCommon> getFileHistoryLinksCommon(
- final String project, final String revision, final String file) {
+ String project, String revision, String file) {
return FluentIterable
.from(fileHistoryLinks)
- .transform(new Function<WebLink, WebLinkInfoCommon>() {
- @Override
- public WebLinkInfoCommon apply(WebLink webLink) {
- WebLinkInfo info =
- ((FileHistoryWebLink) webLink).getFileHistoryWebLink(project,
- revision, file);
- if (info == null) {
- return null;
- }
- WebLinkInfoCommon commonInfo = new WebLinkInfoCommon();
- commonInfo.name = info.name;
- commonInfo.imageUrl = info.imageUrl;
- commonInfo.url = info.url;
- commonInfo.target = info.target;
- return commonInfo;
- }
- })
+ .transform(
+ webLink -> {
+ WebLinkInfo info =
+ webLink.getFileHistoryWebLink(project, revision, file);
+ if (info == null) {
+ return null;
+ }
+ WebLinkInfoCommon commonInfo = new WebLinkInfoCommon();
+ commonInfo.name = info.name;
+ commonInfo.imageUrl = info.imageUrl;
+ commonInfo.url = info.url;
+ commonInfo.target = info.target;
+ return commonInfo;
+ })
.filter(INVALID_WEBLINK_COMMON);
}
@@ -190,14 +167,10 @@
final int patchSetIdB, final String revisionB, final String fileB) {
return FluentIterable
.from(diffLinks)
- .transform(new Function<WebLink, DiffWebLinkInfo>() {
- @Override
- public DiffWebLinkInfo apply(WebLink webLink) {
- return ((DiffWebLink) webLink).getDiffLink(project, changeId,
+ .transform(webLink ->
+ webLink.getDiffLink(project, changeId,
patchSetIdA, revisionA, fileA,
- patchSetIdB, revisionB, fileB);
- }
- })
+ patchSetIdB, revisionB, fileB))
.filter(INVALID_WEBLINK);
}
@@ -207,13 +180,9 @@
* @return Links for projects.
*/
public FluentIterable<WebLinkInfo> getProjectLinks(final String project) {
- return filterLinks(projectLinks, new Function<WebLink, WebLinkInfo>() {
-
- @Override
- public WebLinkInfo apply(WebLink webLink) {
- return ((ProjectWebLink)webLink).getProjectWeblink(project);
- }
- });
+ return filterLinks(
+ projectLinks,
+ webLink -> webLink.getProjectWeblink(project));
}
/**
@@ -223,17 +192,13 @@
* @return Links for branches.
*/
public FluentIterable<WebLinkInfo> getBranchLinks(final String project, final String branch) {
- return filterLinks(branchLinks, new Function<WebLink, WebLinkInfo>() {
-
- @Override
- public WebLinkInfo apply(WebLink webLink) {
- return ((BranchWebLink)webLink).getBranchWebLink(project, branch);
- }
- });
+ return filterLinks(
+ branchLinks,
+ webLink -> webLink.getBranchWebLink(project, branch));
}
- private FluentIterable<WebLinkInfo> filterLinks(DynamicSet<? extends WebLink> links,
- Function<WebLink, WebLinkInfo> transformer) {
+ private <T extends WebLink> FluentIterable<WebLinkInfo> filterLinks(DynamicSet<T> links,
+ Function<T, WebLinkInfo> transformer) {
return FluentIterable
.from(links)
.transform(transformer)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountControl.java
index c5b0699..db2a98f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountControl.java
@@ -14,8 +14,8 @@
package com.google.gerrit.server.account;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Sets;
+import static java.util.stream.Collectors.toSet;
+
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.common.errors.NoSuchGroupException;
import com.google.gerrit.reviewdb.client.Account;
@@ -28,7 +28,6 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
-import java.util.HashSet;
import java.util.Set;
/** Access control management for one account's access to other accounts. */
@@ -186,14 +185,9 @@
}
private Set<AccountGroup.UUID> groupsOf(IdentifiedUser user) {
- return new HashSet<>(Sets.filter(
- user.getEffectiveGroups().getKnownGroups(),
- new Predicate<AccountGroup.UUID>() {
- @Override
- public boolean apply(AccountGroup.UUID in) {
- return !SystemGroupBackend.isSystemGroup(in);
- }
- }));
+ return user.getEffectiveGroups().getKnownGroups().stream()
+ .filter(a -> !SystemGroupBackend.isSystemGroup(a))
+ .collect(toSet());
}
private abstract static class OtherUser {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountJson.java
new file mode 100644
index 0000000..7193564
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountJson.java
@@ -0,0 +1,33 @@
+// 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.account;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.reviewdb.client.Account;
+
+public class AccountJson {
+
+ public static AccountInfo toAccountInfo(Account account) {
+ if (account == null || account.getId() == null) {
+ return null;
+ }
+ AccountInfo accountInfo = new AccountInfo(account.getId().get());
+ accountInfo.email = account.getPreferredEmail();
+ accountInfo.name = account.getFullName();
+ accountInfo.username = account.getUserName();
+ return accountInfo;
+ }
+
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java
index 5a18269..b400eb7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java
@@ -14,8 +14,8 @@
package com.google.gerrit.server.account;
-import com.google.common.base.Function;
-import com.google.common.collect.FluentIterable;
+import static java.util.stream.Collectors.toSet;
+
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountExternalId;
import com.google.gerrit.reviewdb.server.ReviewDb;
@@ -191,14 +191,9 @@
// At this point we have no clue. Just perform a whole bunch of suggestions
// and pray we come up with a reasonable result list.
- return FluentIterable
- .from(accountQueryProvider.get().byDefault(nameOrEmail))
- .transform(new Function<AccountState, Account.Id>() {
- @Override
- public Account.Id apply(AccountState accountState) {
- return accountState.getAccount().getId();
- }
- }).toSet();
+ return accountQueryProvider.get().byDefault(nameOrEmail).stream()
+ .map(a -> a.getAccount().getId())
+ .collect(toSet());
}
List<Account> m = db.accounts().byFullName(nameOrEmail).toList();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountState.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountState.java
index 05a7179..ed99266 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountState.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountState.java
@@ -36,12 +36,7 @@
public class AccountState {
public static final Function<AccountState, Account.Id> ACCOUNT_ID_FUNCTION =
- new Function<AccountState, Account.Id>() {
- @Override
- public Account.Id apply(AccountState in) {
- return in.getAccount().getId();
- }
- };
+ a -> a.getAccount().getId();
private final Account account;
private final Set<AccountGroup.UUID> internalGroups;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java
index e348e73..d86d27c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java
@@ -14,15 +14,14 @@
package com.google.gerrit.server.account;
-import com.google.common.base.Function;
+import static com.google.common.base.Predicates.not;
+
import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.collect.Iterables;
+import com.google.common.collect.FluentIterable;
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.common.data.PermissionRange;
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.common.data.PermissionRule.Action;
-import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.PeerDaemonUser;
import com.google.gerrit.server.git.QueueProvider;
@@ -32,6 +31,7 @@
import com.google.inject.assistedinject.Assisted;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -98,7 +98,7 @@
if (canEmailReviewers == null) {
canEmailReviewers =
matchAny(capabilities.emailReviewers, ALLOWED_RULE)
- || !matchAny(capabilities.emailReviewers, Predicates.not(ALLOWED_RULE));
+ || !matchAny(capabilities.emailReviewers, not(ALLOWED_RULE));
}
return canEmailReviewers;
@@ -279,23 +279,16 @@
return mine;
}
- private static final Predicate<PermissionRule> ALLOWED_RULE = new Predicate<PermissionRule>() {
- @Override
- public boolean apply(PermissionRule rule) {
- return rule.getAction() == Action.ALLOW;
- }
- };
+ private static final Predicate<PermissionRule> ALLOWED_RULE =
+ r -> r.getAction() == Action.ALLOW;
- private boolean matchAny(Iterable<PermissionRule> rules, Predicate<PermissionRule> predicate) {
- Iterable<AccountGroup.UUID> ids = Iterables.transform(
- Iterables.filter(rules, predicate),
- new Function<PermissionRule, AccountGroup.UUID>() {
- @Override
- public AccountGroup.UUID apply(PermissionRule rule) {
- return rule.getGroup().getUUID();
- }
- });
- return user.getEffectiveGroups().containsAnyOf(ids);
+ private boolean matchAny(Collection<PermissionRule> rules,
+ Predicate<PermissionRule> predicate) {
+ return user.getEffectiveGroups()
+ .containsAnyOf(
+ FluentIterable.from(rules)
+ .filter(predicate)
+ .transform(r -> r.getGroup().getUUID()));
}
private static boolean match(GroupMembership groups,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteWatchedProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteWatchedProjects.java
index e2fbc3c..0e9bc2e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteWatchedProjects.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteWatchedProjects.java
@@ -14,8 +14,8 @@
package com.google.gerrit.server.account;
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
+import static java.util.stream.Collectors.toList;
+
import com.google.gerrit.extensions.client.ProjectWatchInfo;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.Response;
@@ -105,13 +105,10 @@
private void deleteFromGit(Account.Id accountId, List<ProjectWatchInfo> input)
throws IOException, ConfigInvalidException {
- watchConfig.deleteProjectWatches(accountId, Lists.transform(input,
- new Function<ProjectWatchInfo, ProjectWatchKey>() {
- @Override
- public ProjectWatchKey apply(ProjectWatchInfo info) {
- return ProjectWatchKey.create(new Project.NameKey(info.project),
- info.filter);
- }
- }));
+ watchConfig.deleteProjectWatches(
+ accountId,
+ input.stream().map(w -> ProjectWatchKey.create(
+ new Project.NameKey(w.project), w.filter))
+ .collect(toList()));
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKeys.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKeys.java
index bf1a3af..df125e0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKeys.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetSshKeys.java
@@ -14,7 +14,6 @@
package com.google.gerrit.server.account;
-import com.google.common.base.Function;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.gerrit.extensions.common.SshKeyInfo;
@@ -60,13 +59,9 @@
public List<SshKeyInfo> apply(IdentifiedUser user)
throws RepositoryNotFoundException, IOException, ConfigInvalidException {
- return Lists.transform(authorizedKeys.getKeys(user.getAccountId()),
- new Function<AccountSshKey, SshKeyInfo>() {
- @Override
- public SshKeyInfo apply(AccountSshKey key) {
- return newSshKeyInfo(key);
- }
- });
+ return Lists.transform(
+ authorizedKeys.getKeys(user.getAccountId()),
+ GetSshKeys::newSshKeyInfo);
}
public static SshKeyInfo newSshKeyInfo(AccountSshKey sshKey) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java
index c47d6f8..84660ec 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/InternalGroupBackend.java
@@ -14,10 +14,8 @@
package com.google.gerrit.server.account;
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
+import static java.util.stream.Collectors.toList;
+
import com.google.gerrit.common.data.GroupDescription;
import com.google.gerrit.common.data.GroupDescriptions;
import com.google.gerrit.common.data.GroupReference;
@@ -30,18 +28,11 @@
import org.eclipse.jgit.lib.ObjectId;
import java.util.Collection;
+import java.util.stream.StreamSupport;
/** Implementation of GroupBackend for the internal group system. */
@Singleton
public class InternalGroupBackend implements GroupBackend {
- private static final Function<AccountGroup, GroupReference> ACT_GROUP_TO_GROUP_REF =
- new Function<AccountGroup, GroupReference>() {
- @Override
- public GroupReference apply(AccountGroup group) {
- return GroupReference.forGroup(group);
- }
- };
-
private final GroupControl.Factory groupControlFactory;
private final GroupCache groupCache;
private final IncludingGroupMembership.Factory groupMembershipFactory;
@@ -77,16 +68,13 @@
@Override
public Collection<GroupReference> suggest(final String name,
final ProjectControl project) {
- Iterable<AccountGroup> filtered = Iterables.filter(groupCache.all(),
- new Predicate<AccountGroup>() {
- @Override
- public boolean apply(AccountGroup group) {
+ return StreamSupport.stream(groupCache.all().spliterator(), false)
+ .filter(group ->
// startsWithIgnoreCase && isVisible
- return group.getName().regionMatches(true, 0, name, 0, name.length())
- && groupControlFactory.controlFor(group).isVisible();
- }
- });
- return Lists.newArrayList(Iterables.transform(filtered, ACT_GROUP_TO_GROUP_REF));
+ group.getName().regionMatches(true, 0, name, 0, name.length())
+ && groupControlFactory.controlFor(group).isVisible())
+ .map(GroupReference::forGroup)
+ .collect(toList());
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java
index 30a3bdf..871b1cd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAuthorizedKeys.java
@@ -15,8 +15,8 @@
package com.google.gerrit.server.account;
import static com.google.common.base.Preconditions.checkState;
+import static java.util.Comparator.comparing;
-import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
@@ -278,13 +278,7 @@
* @param newKeys the new public SSH keys
*/
public void setKeys(Collection<AccountSshKey> newKeys) {
- Ordering<AccountSshKey> o =
- Ordering.natural().onResultOf(new Function<AccountSshKey, Integer>() {
- @Override
- public Integer apply(AccountSshKey sshKey) {
- return sshKey.getKey().get();
- }
- });
+ Ordering<AccountSshKey> o = Ordering.from(comparing(k -> k.getKey().get()));
keys = new ArrayList<>(Collections.nCopies(o.max(newKeys).getKey().get(),
Optional.<AccountSshKey> absent()));
for (AccountSshKey key : newKeys) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
index 9bfb342..9c12348 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
@@ -61,6 +61,7 @@
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
+import com.google.inject.Provider;
import com.google.inject.assistedinject.Assisted;
import java.io.IOException;
@@ -84,7 +85,7 @@
private final Abandon abandon;
private final Revert revert;
private final Restore restore;
- private final SubmittedTogether submittedTogether;
+ private final Provider<SubmittedTogether> submittedTogether;
private final PublishDraftPatchSet.CurrentRevision
publishDraftChange;
private final DeleteDraftChange deleteDraftChange;
@@ -111,7 +112,7 @@
Abandon abandon,
Revert revert,
Restore restore,
- SubmittedTogether submittedTogether,
+ Provider<SubmittedTogether> submittedTogether,
PublishDraftPatchSet.CurrentRevision publishDraftChange,
DeleteDraftChange deleteDraftChange,
GetTopic getTopic,
@@ -248,21 +249,29 @@
}
}
- @SuppressWarnings("unchecked")
@Override
public List<ChangeInfo> submittedTogether() throws RestApiException {
- try {
- return (List<ChangeInfo>) submittedTogether.apply(change);
- } catch (IOException | OrmException e) {
- throw new RestApiException("Cannot query submittedTogether", e);
- }
+ SubmittedTogetherInfo info = submittedTogether(
+ EnumSet.noneOf(ListChangesOption.class),
+ EnumSet.noneOf(SubmittedTogetherOption.class));
+ return info.changes;
}
@Override
public SubmittedTogetherInfo submittedTogether(
EnumSet<SubmittedTogetherOption> options) throws RestApiException {
+ return submittedTogether(EnumSet.noneOf(ListChangesOption.class), options);
+ }
+
+ @Override
+ public SubmittedTogetherInfo submittedTogether(
+ EnumSet<ListChangesOption> listOptions,
+ EnumSet<SubmittedTogetherOption> submitOptions) throws RestApiException {
try {
- return submittedTogether.apply(change, options);
+ return submittedTogether.get()
+ .addListChangesOption(listOptions)
+ .addSubmittedTogetherOption(submitOptions)
+ .applyInfo(change);
} catch (IOException | OrmException e) {
throw new RestApiException("Cannot query submittedTogether", e);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/AllowedFormats.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/AllowedFormats.java
index 3a1e0f4..756ce88 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/AllowedFormats.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/AllowedFormats.java
@@ -14,8 +14,9 @@
package com.google.gerrit.server.change;
-import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.google.gerrit.server.config.DownloadConfig;
import com.google.inject.Inject;
@@ -28,7 +29,7 @@
@Singleton
public class AllowedFormats {
final ImmutableMap<String, ArchiveFormat> extensions;
- final Set<ArchiveFormat> allowed;
+ final ImmutableSet<ArchiveFormat> allowed;
@Inject
AllowedFormats(DownloadConfig cfg) {
@@ -43,14 +44,8 @@
// Zip is not supported because it may be interpreted by a Java plugin as a
// valid JAR file, whose code would have access to cookies on the domain.
- allowed = Sets.filter(
- cfg.getArchiveFormats(),
- new Predicate<ArchiveFormat>() {
- @Override
- public boolean apply(ArchiveFormat format) {
- return (format != ArchiveFormat.ZIP);
- }
- });
+ allowed = Sets.immutableEnumSet(
+ Iterables.filter(cfg.getArchiveFormats(), f -> f != ArchiveFormat.ZIP));
}
public Set<ArchiveFormat> getAllowed() {
@@ -60,4 +55,4 @@
public ImmutableMap<String, ArchiveFormat> getExtensions() {
return extensions;
}
-}
\ No newline at end of file
+}
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 a3c992f..6906fb2 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
@@ -17,10 +17,9 @@
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.gerrit.reviewdb.client.Change.INITIAL_PATCH_SET_ID;
+import static java.util.stream.Collectors.toSet;
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;
@@ -377,21 +376,23 @@
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;
- }
- }
- });
+ return accounts.stream()
+ .filter(
+ 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;
+ }
+ })
+ .collect(toSet());
}
@Override
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 e950d99..d8078ca 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
@@ -34,9 +34,9 @@
import static com.google.gerrit.extensions.client.ListChangesOption.REVIEWER_UPDATES;
import static com.google.gerrit.extensions.client.ListChangesOption.WEB_LINKS;
import static com.google.gerrit.server.CommonConverters.toGitPerson;
+import static java.util.stream.Collectors.toList;
import com.google.auto.value.AutoValue;
-import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.MoreObjects;
import com.google.common.base.Optional;
@@ -298,13 +298,8 @@
public List<List<ChangeInfo>> formatQueryResults(
List<QueryResult<ChangeData>> in) throws OrmException {
accountLoader = accountLoaderFactory.create(has(DETAILED_ACCOUNTS));
- ensureLoaded(FluentIterable.from(in).transformAndConcat(
- new Function<QueryResult<ChangeData>, List<ChangeData>>() {
- @Override
- public List<ChangeData> apply(QueryResult<ChangeData> in) {
- return in.entities();
- }
- }));
+ ensureLoaded(
+ FluentIterable.from(in).transformAndConcat(QueryResult::entities));
List<List<ChangeInfo>> res = Lists.newArrayListWithCapacity(in.size());
Map<Change.Id, ChangeInfo> out = new HashMap<>();
@@ -599,7 +594,7 @@
? labelsForOpenChange(ctl, cd, labelTypes, standard, detailed)
: labelsForClosedChange(cd, labelTypes, standard, detailed);
return ImmutableMap.copyOf(
- Maps.transformValues(withStatus, LabelWithStatus.TO_LABEL_INFO));
+ Maps.transformValues(withStatus, LabelWithStatus::label));
}
private Map<String, LabelWithStatus> labelsForOpenChange(ChangeControl ctl,
@@ -952,14 +947,10 @@
private Collection<AccountInfo> toAccountInfo(
Collection<Account.Id> accounts) {
- return FluentIterable.from(accounts)
- .transform(new Function<Account.Id, AccountInfo>() {
- @Override
- public AccountInfo apply(Account.Id id) {
- return accountLoader.get(id);
- }
- })
- .toSortedList(AccountInfoComparator.ORDER_NULLS_FIRST);
+ return accounts.stream()
+ .map(accountLoader::get)
+ .sorted(AccountInfoComparator.ORDER_NULLS_FIRST)
+ .collect(toList());
}
@Nullable
@@ -1064,6 +1055,7 @@
if (has(ALL_FILES) || (out.isCurrent && has(CURRENT_FILES))) {
out.files = fileInfoJson.toFileInfoMap(c, in);
out.files.remove(Patch.COMMIT_MSG);
+ out.files.remove(Patch.MERGE_LIST);
}
if ((out.isCurrent || (out.draft != null && out.draft))
@@ -1185,14 +1177,6 @@
@AutoValue
abstract static class LabelWithStatus {
- private static final Function<LabelWithStatus, LabelInfo> TO_LABEL_INFO =
- new Function<LabelWithStatus, LabelInfo>() {
- @Override
- public LabelInfo apply(LabelWithStatus in) {
- return in.label();
- }
- };
-
private static LabelWithStatus create(LabelInfo label,
SubmitRecord.Label.Status status) {
return new AutoValue_ChangeJson_LabelWithStatus(label, status);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentJson.java
index d1ce453..2948fa6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentJson.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CommentJson.java
@@ -16,7 +16,6 @@
import static com.google.gerrit.server.PatchLineCommentsUtil.COMMENT_INFO_ORDER;
-import com.google.common.base.Function;
import com.google.common.base.Strings;
import com.google.common.collect.FluentIterable;
import com.google.gerrit.extensions.client.Comment.Range;
@@ -100,17 +99,13 @@
List<CommentInfo> formatAsList(Iterable<PatchLineComment> l)
throws OrmException {
- final AccountLoader accountLoader = fillAccounts
+ AccountLoader accountLoader = fillAccounts
? accountLoaderFactory.create(true)
: null;
List<CommentInfo> out = FluentIterable
.from(l)
- .transform(new Function<PatchLineComment, CommentInfo>() {
- @Override
- public CommentInfo apply(PatchLineComment c) {
- return toCommentInfo(c, accountLoader);
- }
- }).toSortedList(COMMENT_INFO_ORDER);
+ .transform(c -> toCommentInfo(c, accountLoader))
+ .toSortedList(COMMENT_INFO_ORDER);
if (accountLoader != null) {
accountLoader.fill();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ConsistencyChecker.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ConsistencyChecker.java
index 66ef731a..30ed82f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ConsistencyChecker.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ConsistencyChecker.java
@@ -19,13 +19,10 @@
import static com.google.gerrit.reviewdb.client.RefNames.REFS_CHANGES;
import static com.google.gerrit.reviewdb.server.ReviewDbUtil.intKeyOrdering;
import static com.google.gerrit.server.ChangeUtil.PS_ID_ORDER;
-import static com.google.gerrit.server.ChangeUtil.TO_PS_ID;
import com.google.auto.value.AutoValue;
-import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.MultimapBuilder;
import com.google.gerrit.common.FooterConstants;
@@ -255,13 +252,10 @@
Map<String, Ref> refs;
try {
- refs = repo.getRefDatabase().exactRef(
- Lists.transform(all, new Function<PatchSet, String>() {
- @Override
- public String apply(PatchSet ps) {
- return ps.getId().toRefName();
- }
- }).toArray(new String[all.size()]));
+ refs = repo.getRefDatabase().exactRef(
+ all.stream()
+ .map(ps -> ps.getId().toRefName())
+ .toArray(String[]::new));
} catch (IOException e) {
error("error reading refs", e);
refs = Collections.emptyMap();
@@ -319,7 +313,7 @@
if (e.getValue().size() > 1) {
problem(String.format("Multiple patch sets pointing to %s: %s",
e.getKey().name(),
- Collections2.transform(e.getValue(), TO_PS_ID)));
+ Collections2.transform(e.getValue(), PatchSet::getPatchSetId)));
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraftComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraftComment.java
index 7cb2aac..1af87b3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraftComment.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraftComment.java
@@ -15,7 +15,6 @@
package com.google.gerrit.server.change;
import static com.google.gerrit.server.PatchLineCommentsUtil.setCommentRevId;
-import static com.google.gerrit.server.change.PutDraftComment.side;
import com.google.common.base.Strings;
import com.google.gerrit.common.TimeUtil;
@@ -119,7 +118,7 @@
ChangeUtil.messageUUID(ctx.getDb())),
line, ctx.getAccountId(), Url.decode(in.inReplyTo),
ctx.getWhen());
- comment.setSide(side(in));
+ comment.setSide(in.side());
comment.setMessage(in.message.trim());
comment.setRange(in.range);
comment.setTag(in.tag);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java
index 18b7023..099f8e0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java
@@ -14,7 +14,6 @@
package com.google.gerrit.server.change;
-import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.gerrit.common.TimeUtil;
@@ -210,7 +209,7 @@
}
private Iterable<PatchSetApproval> approvals(ChangeContext ctx,
- final Account.Id accountId) throws OrmException {
+ Account.Id accountId) throws OrmException {
Change.Id changeId = ctx.getNotes().getChangeId();
Iterable<PatchSetApproval> approvals;
@@ -230,13 +229,7 @@
}
return Iterables.filter(
- approvals,
- new Predicate<PatchSetApproval>() {
- @Override
- public boolean apply(PatchSetApproval input) {
- return accountId.equals(input.getAccountId());
- }
- });
+ approvals, psa -> accountId.equals(psa.getAccountId()));
}
private String formatLabelValue(short value) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/FileContentUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/FileContentUtil.java
index d145ddf..d617a70 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/FileContentUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/FileContentUtil.java
@@ -54,6 +54,7 @@
@Singleton
public class FileContentUtil {
public static final String TEXT_X_GERRIT_COMMIT_MESSAGE = "text/x-gerrit-commit-message";
+ public static final String TEXT_X_GERRIT_MERGE_LIST = "text/x-gerrit-merge-list";
private static final String X_GIT_SYMLINK = "x-git/symlink";
private static final String X_GIT_GITLINK = "x-git/gitlink";
private static final int MAX_SIZE = 5 << 20;
@@ -264,6 +265,9 @@
if (Patch.COMMIT_MSG.equals(path)) {
return TEXT_X_GERRIT_COMMIT_MESSAGE;
}
+ if (Patch.MERGE_LIST.equals(path)) {
+ return TEXT_X_GERRIT_MERGE_LIST;
+ }
if (project != null) {
for (ProjectState p : project.tree()) {
String t = p.getConfig().getMimeTypes().getMimeType(path);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetContent.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetContent.java
index 5a546f3..c7044e1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetContent.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetContent.java
@@ -24,6 +24,8 @@
import com.google.gerrit.server.PatchSetUtil;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.patch.ComparisonType;
+import com.google.gerrit.server.patch.Text;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@@ -68,6 +70,12 @@
return BinaryResult.create(msg)
.setContentType(FileContentUtil.TEXT_X_GERRIT_COMMIT_MESSAGE)
.base64();
+ } else if (Patch.MERGE_LIST.equals(path)) {
+ byte[] mergeList = getMergeList(
+ rsrc.getRevision().getChangeResource().getNotes());
+ return BinaryResult.create(mergeList)
+ .setContentType(FileContentUtil.TEXT_X_GERRIT_MERGE_LIST)
+ .base64();
}
return fileContentUtil.getContent(
rsrc.getRevision().getControl().getProjectControl().getProjectState(),
@@ -92,4 +100,22 @@
throw new NoSuchChangeException(changeId, e);
}
}
+
+ private byte[] getMergeList(ChangeNotes notes)
+ throws NoSuchChangeException, OrmException, IOException {
+ Change.Id changeId = notes.getChangeId();
+ PatchSet ps = psUtil.current(db.get(), notes);
+ if (ps == null) {
+ throw new NoSuchChangeException(changeId);
+ }
+
+ try (Repository git = gitManager.openRepository(notes.getProjectName());
+ RevWalk revWalk = new RevWalk(git)) {
+ return Text.forMergeList(ComparisonType.againstAutoMerge(),
+ revWalk.getObjectReader(),
+ ObjectId.fromString(ps.getRevision().get())).getContent();
+ } catch (RepositoryNotFoundException e) {
+ throw new NoSuchChangeException(changeId, e);
+ }
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetMergeList.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetMergeList.java
index 4e94935..b15810c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetMergeList.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetMergeList.java
@@ -22,6 +22,7 @@
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.patch.MergeListBuilder;
import com.google.inject.Inject;
import org.eclipse.jgit.lib.ObjectId;
@@ -46,7 +47,8 @@
private boolean addLinks;
@Inject
- GetMergeList(GitRepositoryManager repoManager, ChangeJson.Factory json) {
+ GetMergeList(GitRepositoryManager repoManager,
+ ChangeJson.Factory json) {
this.repoManager = repoManager;
this.json = json;
}
@@ -62,7 +64,6 @@
@Override
public Response<List<CommitInfo>> apply(RevisionResource rsrc)
throws BadRequestException, IOException {
- List<CommitInfo> result = new ArrayList<>();
Project.NameKey p = rsrc.getChange().getProject();
try (Repository repo = repoManager.openRepository(p);
RevWalk rw = new RevWalk(repo)) {
@@ -76,26 +77,22 @@
}
if (commit.getParentCount() < 2) {
- return Response.<List<CommitInfo>> ok(ImmutableList.<CommitInfo> of());
+ return createResponse(rsrc, ImmutableList.<CommitInfo> of());
}
- for (int parent = 0; parent < commit.getParentCount(); parent++) {
- if (parent == uninterestingParent - 1) {
- rw.markUninteresting(commit.getParent(parent));
- } else {
- rw.markStart(commit.getParent(parent));
- }
- }
-
+ List<RevCommit> commits =
+ MergeListBuilder.build(rw, commit, uninterestingParent);
+ List<CommitInfo> result = new ArrayList<>(commits.size());
ChangeJson changeJson = json.create(ChangeJson.NO_OPTIONS);
- RevCommit c;
- while ((c = rw.next()) != null) {
- CommitInfo info =
- changeJson.toCommit(rsrc.getControl(), rw, c, addLinks, true);
- result.add(info);
+ for (RevCommit c : commits) {
+ result.add(changeJson.toCommit(rsrc.getControl(), rw, c, addLinks, true));
}
+ return createResponse(rsrc, result);
}
+ }
+ private static Response<List<CommitInfo>> createResponse(
+ RevisionResource rsrc, List<CommitInfo> result) {
Response<List<CommitInfo>> r = Response.ok(result);
if (rsrc.isCacheable()) {
r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
index 3828041..d6819ba 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReview.java
@@ -17,7 +17,6 @@
import static com.google.common.base.MoreObjects.firstNonNull;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.gerrit.server.PatchLineCommentsUtil.setCommentRevId;
-import static com.google.gerrit.server.change.PutDraftComment.side;
import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
import static java.nio.charset.StandardCharsets.UTF_8;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
@@ -324,11 +323,19 @@
while (mapItr.hasNext()) {
Map.Entry<String, List<CommentInput>> ent = mapItr.next();
String path = ent.getKey();
- if (!filePaths.contains(path) && !Patch.COMMIT_MSG.equals(path)) {
+ if (!filePaths.contains(path) && !Patch.isMagic(path)) {
throw new BadRequestException(String.format(
"file %s not found in revision %s",
path, revision.getChange().currentPatchSetId()));
}
+ if (Patch.isMagic(path)) {
+ for (CommentInput comment : ent.getValue()) {
+ if (comment.side == Side.PARENT && comment.parent == null) {
+ throw new BadRequestException(
+ String.format("cannot comment on %s on auto-merge", path));
+ }
+ }
+ }
List<CommentInput> list = ent.getValue();
if (list == null) {
@@ -476,7 +483,7 @@
}
e.setStatus(PatchLineComment.Status.PUBLISHED);
e.setWrittenOn(ctx.getWhen());
- e.setSide(side(c));
+ e.setSide(c.side());
setCommentRevId(e, patchListCache, ctx.getChange(), ps);
e.setMessage(c.message);
e.setTag(in.tag);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java
index be94d5d..b64b5a2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PostReviewers.java
@@ -17,7 +17,6 @@
import static com.google.gerrit.extensions.client.ReviewerState.CC;
import static com.google.gerrit.extensions.client.ReviewerState.REVIEWER;
-import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
@@ -357,13 +356,8 @@
}
emailReviewers(rsrc.getChange(), addedReviewers, addedCCs);
if (!addedReviewers.isEmpty()) {
- List<Account.Id> reviewers = Lists.transform(addedReviewers,
- new Function<PatchSetApproval, Account.Id>() {
- @Override
- public Account.Id apply(PatchSetApproval psa) {
- return psa.getAccountId();
- }
- });
+ List<Account.Id> reviewers =
+ Lists.transform(addedReviewers, PatchSetApproval::getAccountId);
reviewerAdded.fire(rsrc.getChange(), patchSet, reviewers,
ctx.getAccount(), ctx.getWhen());
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDraftComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDraftComment.java
index 655e07d..e817d93 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDraftComment.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDraftComment.java
@@ -19,8 +19,6 @@
import com.google.common.base.Optional;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.extensions.api.changes.DraftInput;
-import com.google.gerrit.extensions.client.Comment;
-import com.google.gerrit.extensions.client.Side;
import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
@@ -164,7 +162,7 @@
private static PatchLineComment update(PatchLineComment e, DraftInput in,
Timestamp when) {
if (in.side != null) {
- e.setSide(side(in));
+ e.setSide(in.side());
}
if (in.inReplyTo != null) {
e.setParentUuid(Url.decode(in.inReplyTo));
@@ -181,11 +179,4 @@
}
return e;
}
-
- static short side(Comment c) {
- if (c.side == Side.PARENT) {
- return (short) (c.parent == null ? 0 : -c.parent.shortValue());
- }
- return 1;
- }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java
index 8fe778b..b8443be 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java
@@ -14,15 +14,13 @@
package com.google.gerrit.server.change;
+import static java.util.stream.Collectors.joining;
+
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
import com.google.common.base.MoreObjects;
-import com.google.common.base.Predicate;
import com.google.common.base.Strings;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import com.google.gerrit.common.data.ParameterizedString;
@@ -282,14 +280,10 @@
return CHANGE_UNMERGEABLE;
}
}
- return CHANGES_NOT_MERGEABLE + Joiner.on(", ").join(
- Iterables.transform(unmergeable,
- new Function<ChangeData, String>() {
- @Override
- public String apply(ChangeData cd) {
- return String.valueOf(cd.getId().get());
- }
- }));
+ return CHANGES_NOT_MERGEABLE +
+ unmergeable.stream()
+ .map(c -> c.getId().toString())
+ .collect(joining(", "));
}
} catch (ResourceConflictException e) {
return BLOCKED_SUBMIT_TOOLTIP;
@@ -405,14 +399,10 @@
*/
public ChangeMessage getConflictMessage(RevisionResource rsrc)
throws OrmException {
- return FluentIterable.from(cmUtil.byPatchSet(dbProvider.get(), rsrc.getNotes(),
- rsrc.getPatchSet().getId()))
- .filter(new Predicate<ChangeMessage>() {
- @Override
- public boolean apply(ChangeMessage input) {
- return input.getAuthor() == null;
- }
- })
+ return FluentIterable.from(
+ cmUtil.byPatchSet(
+ dbProvider.get(), rsrc.getNotes(), rsrc.getPatchSet().getId()))
+ .filter(cm -> cm.getAuthor() == null)
.last()
.orNull();
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java
index 351ebf9..908929a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/SubmittedTogether.java
@@ -14,6 +14,8 @@
package com.google.gerrit.server.change;
+import static com.google.gerrit.extensions.api.changes.SubmittedTogetherOption.NON_VISIBLE_CHANGES;
+
import com.google.gerrit.extensions.api.changes.SubmittedTogetherInfo;
import com.google.gerrit.extensions.api.changes.SubmittedTogetherOption;
import com.google.gerrit.extensions.client.ChangeStatus;
@@ -32,7 +34,6 @@
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
-import com.google.inject.Singleton;
import org.kohsuke.args4j.Option;
import org.slf4j.Logger;
@@ -44,13 +45,17 @@
import java.util.EnumSet;
import java.util.List;
-@Singleton
public class SubmittedTogether implements RestReadView<ChangeResource> {
private static final Logger log = LoggerFactory.getLogger(
SubmittedTogether.class);
private final EnumSet<SubmittedTogetherOption> options =
EnumSet.noneOf(SubmittedTogetherOption.class);
+
+ private final EnumSet<ListChangesOption> jsonOpt = EnumSet.of(
+ ListChangesOption.CURRENT_REVISION,
+ ListChangesOption.CURRENT_COMMIT);
+
private final ChangeJson.Factory json;
private final Provider<ReviewDb> dbProvider;
private final Provider<InternalChangeQuery> queryProvider;
@@ -58,8 +63,22 @@
private final Provider<WalkSorter> sorter;
@Option(name = "-o", usage = "Output options")
- void addOption(SubmittedTogetherOption o) {
- options.add(o);
+ void addOption(String option) {
+ for (ListChangesOption o : ListChangesOption.values()) {
+ if (o.name().equalsIgnoreCase(option)) {
+ jsonOpt.add(o);
+ return;
+ }
+ }
+
+ for (SubmittedTogetherOption o : SubmittedTogetherOption.values()) {
+ if (o.name().equalsIgnoreCase(option)) {
+ options.add(o);
+ return;
+ }
+ }
+
+ throw new IllegalArgumentException("option not recognized: " + option);
}
@Inject
@@ -75,19 +94,29 @@
this.sorter = sorter;
}
+ public SubmittedTogether addListChangesOption(EnumSet<ListChangesOption> o) {
+ jsonOpt.addAll(o);
+ return this;
+ }
+
+ public SubmittedTogether addSubmittedTogetherOption(
+ EnumSet<SubmittedTogetherOption> o) {
+ options.addAll(o);
+ return this;
+ }
+
@Override
public Object apply(ChangeResource resource)
throws AuthException, BadRequestException,
ResourceConflictException, IOException, OrmException {
- SubmittedTogetherInfo info = apply(resource, options);
+ SubmittedTogetherInfo info = applyInfo(resource);
if (options.isEmpty()) {
return info.changes;
}
return info;
}
- public SubmittedTogetherInfo apply(ChangeResource resource,
- EnumSet<SubmittedTogetherOption> options)
+ public SubmittedTogetherInfo applyInfo(ChangeResource resource)
throws AuthException, IOException, OrmException {
Change c = resource.getChange();
try {
@@ -109,7 +138,7 @@
}
if (hidden != 0
- && !options.contains(SubmittedTogetherOption.NON_VISIBLE_CHANGES)) {
+ && !options.contains(NON_VISIBLE_CHANGES)) {
throw new AuthException(
"change would be submitted with a change that you cannot see");
}
@@ -123,9 +152,7 @@
}
SubmittedTogetherInfo info = new SubmittedTogetherInfo();
- info.changes = json.create(EnumSet.of(
- ListChangesOption.CURRENT_REVISION,
- ListChangesOption.CURRENT_COMMIT))
+ info.changes = json.create(jsonOpt)
.includeSubmittable(true)
.formatChangeDatas(cds);
info.nonVisibleChanges = hidden;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/WalkSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/WalkSorter.java
index d31805d..e0959f5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/WalkSorter.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/WalkSorter.java
@@ -18,7 +18,6 @@
import com.google.auto.value.AutoValue;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
@@ -72,21 +71,17 @@
LoggerFactory.getLogger(WalkSorter.class);
private static final Ordering<List<PatchSetData>> PROJECT_LIST_SORTER =
- Ordering.natural().nullsFirst()
- .onResultOf(
- new Function<List<PatchSetData>, Project.NameKey>() {
- @Override
- public Project.NameKey apply(List<PatchSetData> in) {
- if (in == null || in.isEmpty()) {
- return null;
- }
- try {
- return in.get(0).data().change().getProject();
- } catch (OrmException e) {
- throw new IllegalStateException(e);
- }
- }
- });
+ Ordering.natural().nullsFirst().onResultOf(
+ (List<PatchSetData> in) -> {
+ if (in == null || in.isEmpty()) {
+ return null;
+ }
+ try {
+ return in.get(0).data().change().getProject();
+ } catch (OrmException e) {
+ throw new IllegalStateException(e);
+ }
+ });
private final GitRepositoryManager repoManager;
private final Set<PatchSet.Id> includePatchSets;
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritOptions.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritOptions.java
similarity index 77%
rename from gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritOptions.java
rename to gerrit-server/src/main/java/com/google/gerrit/server/config/GerritOptions.java
index f6e375f..c181f79 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritOptions.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritOptions.java
@@ -12,28 +12,22 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.httpd;
+package com.google.gerrit.server.config;
import static com.google.common.base.MoreObjects.firstNonNull;
import static com.google.common.base.Preconditions.checkArgument;
-import com.google.common.base.Enums;
+import com.google.gerrit.extensions.client.UiType;
import org.eclipse.jgit.lib.Config;
public class GerritOptions {
- public enum UiPreference {
- NONE,
- GWT,
- POLYGERRIT;
- }
-
private final boolean headless;
private final boolean slave;
private final boolean enablePolyGerrit;
private final boolean enableGwtUi;
private final boolean forcePolyGerritDev;
- private final UiPreference defaultUi;
+ private final UiType defaultUi;
public GerritOptions(Config cfg, boolean headless, boolean slave,
boolean forcePolyGerritDev) {
@@ -44,24 +38,22 @@
this.forcePolyGerritDev = forcePolyGerritDev;
this.headless = headless || (!enableGwtUi && !enablePolyGerrit);
- UiPreference defaultUi = enablePolyGerrit && !enableGwtUi
- ? UiPreference.POLYGERRIT
- : UiPreference.GWT;
+ UiType defaultUi = enablePolyGerrit && !enableGwtUi
+ ? UiType.POLYGERRIT
+ : UiType.GWT;
String uiStr = firstNonNull(
cfg.getString("gerrit", null, "ui"),
- defaultUi.name().toUpperCase());
- this.defaultUi =
- Enums.getIfPresent(UiPreference.class, uiStr).or(UiPreference.NONE);
- uiStr = defaultUi.name().toLowerCase();
+ defaultUi.name());
+ this.defaultUi = firstNonNull(UiType.parse(uiStr), UiType.NONE);
switch (defaultUi) {
case GWT:
checkArgument(enableGwtUi,
- "gerrit.ui = %s but GWT UI is disabled", uiStr);
+ "gerrit.ui = %s but GWT UI is disabled", defaultUi);
break;
case POLYGERRIT:
checkArgument(enablePolyGerrit,
- "gerrit.ui = %s but PolyGerrit is disabled", uiStr);
+ "gerrit.ui = %s but PolyGerrit is disabled", defaultUi);
break;
case NONE:
default:
@@ -89,7 +81,7 @@
return !headless && forcePolyGerritDev;
}
- public UiPreference defaultUi() {
+ public UiType defaultUi() {
return defaultUi;
}
}
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 14c6da7..83e1419 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
@@ -14,13 +14,14 @@
package com.google.gerrit.server.config;
+import static java.util.stream.Collectors.toList;
+
import com.google.common.base.CharMatcher;
-import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.gerrit.common.data.ContributorAgreement;
+import com.google.gerrit.extensions.client.UiType;
import com.google.gerrit.extensions.common.AuthInfo;
import com.google.gerrit.extensions.common.ChangeConfigInfo;
import com.google.gerrit.extensions.common.DownloadInfo;
@@ -56,6 +57,7 @@
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@@ -82,6 +84,7 @@
private final NotesMigration migration;
private final ProjectCache projectCache;
private final AgreementJson agreementJson;
+ private final GerritOptions gerritOptions;
@Inject
public GetServerInfo(
@@ -101,7 +104,8 @@
QueryDocumentationExecutor docSearcher,
NotesMigration migration,
ProjectCache projectCache,
- AgreementJson agreementJson) {
+ AgreementJson agreementJson,
+ GerritOptions gerritOptions) {
this.config = config;
this.authConfig = authConfig;
this.realm = realm;
@@ -119,6 +123,7 @@
this.migration = migration;
this.projectCache = projectCache;
this.agreementJson = agreementJson;
+ this.gerritOptions = gerritOptions;
}
@Override
@@ -225,14 +230,8 @@
getDownloadSchemeInfo(scheme, downloadCommands, cloneCommands));
}
}
- info.archives = Lists.newArrayList(Iterables.transform(
- archiveFormats.getAllowed(),
- new Function<ArchiveFormat, String>() {
- @Override
- public String apply(ArchiveFormat in) {
- return in.getShortName();
- }
- }));
+ info.archives = archiveFormats.getAllowed().stream()
+ .map(ArchiveFormat::getShortName).collect(toList());
return info;
}
@@ -280,6 +279,13 @@
info.docSearch = docSearcher.isAvailable();
info.editGpgKeys = toBoolean(enableSignedPush
&& cfg.getBoolean("gerrit", null, "editGpgKeys", true));
+ info.webUis = EnumSet.noneOf(UiType.class);
+ if (gerritOptions.enableGwtUi()) {
+ info.webUis.add(UiType.GWT);
+ }
+ if (gerritOptions.enablePolyGerrit()) {
+ info.webUis.add(UiType.POLYGERRIT);
+ }
return info;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectConfigEntry.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectConfigEntry.java
index cc7857c..7d11ff4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectConfigEntry.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ProjectConfigEntry.java
@@ -14,8 +14,8 @@
package com.google.gerrit.server.config;
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
+import static java.util.stream.Collectors.toList;
+
import com.google.gerrit.extensions.annotations.ExtensionPoint;
import com.google.gerrit.extensions.api.projects.ConfigValue;
import com.google.gerrit.extensions.api.projects.ProjectConfigEntryType;
@@ -137,14 +137,9 @@
T defaultValue, Class<T> permittedValues, boolean inheritable,
String description) {
this(displayName, defaultValue.name(), ProjectConfigEntryType.LIST,
- Lists.transform(
- Arrays.asList(permittedValues.getEnumConstants()),
- new Function<Enum<?>, String>() {
- @Override
- public String apply(Enum<?> e) {
- return e.name();
- }
- }), inheritable, description);
+ Arrays.stream(permittedValues.getEnumConstants())
+ .map(Enum::name).collect(toList()),
+ inheritable, description);
}
public ProjectConfigEntry(String displayName, String defaultValue,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
index 56daccc..44b5979 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
@@ -15,11 +15,10 @@
package com.google.gerrit.server.events;
import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Comparator.comparing;
-import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
-import com.google.common.collect.Ordering;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.LabelType;
import com.google.gerrit.common.data.LabelTypes;
@@ -298,22 +297,21 @@
}
}
// Sort by original parent order.
- Collections.sort(ca.dependsOn, Ordering.natural().onResultOf(
- new Function<DependencyAttribute, Integer>() {
- @Override
- public Integer apply(DependencyAttribute d) {
- for (int i = 0; i < parentNames.size(); i++) {
- if (parentNames.get(i).equals(d.revision)) {
- return i;
+ Collections.sort(
+ ca.dependsOn,
+ comparing(
+ (DependencyAttribute d) -> {
+ for (int i = 0; i < parentNames.size(); i++) {
+ if (parentNames.get(i).equals(d.revision)) {
+ return i;
+ }
}
- }
- return parentNames.size() + 1;
- }
- }));
+ return parentNames.size() + 1;
+ }));
}
- private void addNeededBy(RevWalk rw, ChangeAttribute ca, Change change,
- PatchSet currentPs) throws OrmException, IOException {
+ private void addNeededBy(RevWalk rw, ChangeAttribute ca, Change change, PatchSet currentPs)
+ throws OrmException, IOException {
if (currentPs.getGroups().isEmpty()) {
return;
}
@@ -500,7 +498,7 @@
List<Patch> list =
patchListCache.get(change, patchSet).toPatchList(pId);
for (Patch pe : list) {
- if (!Patch.COMMIT_MSG.equals(pe.getFileName())) {
+ if (!Patch.isMagic(pe.getFileName())) {
p.sizeDeletions -= pe.getDeletions();
p.sizeInsertions += pe.getInsertions();
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java
index 114338d..1c8782b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java
@@ -26,6 +26,7 @@
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.GpgException;
import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountJson;
import com.google.gerrit.server.change.ChangeJson;
import com.google.gerrit.server.patch.PatchListNotAvailableException;
import com.google.gerrit.server.project.ChangeControl;
@@ -82,11 +83,7 @@
if (a == null || a.getId() == null) {
return null;
}
- AccountInfo ai = new AccountInfo(a.getId().get());
- ai.email = a.getPreferredEmail();
- ai.name = a.getFullName();
- ai.username = a.getUserName();
- return ai;
+ return AccountJson.toAccountInfo(a);
}
public AccountInfo accountInfo(Account.Id accountId) {
@@ -97,7 +94,7 @@
Map<String, Short> approvals, Timestamp ts) {
Map<String, ApprovalInfo> result = new HashMap<>();
for (Map.Entry<String, Short> e : approvals.entrySet()) {
- Integer value = e.getValue() != null ? new Integer(e.getValue()) : null;
+ Integer value = e.getValue() != null ? Integer.valueOf(e.getValue()) : null;
result.put(e.getKey(),
ChangeJson.getApprovalInfo(a.getId(), value, null, ts));
}
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 35b14dc..9dbbeef 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,7 +14,6 @@
package com.google.gerrit.server.extensions.events;
-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;
@@ -72,18 +71,10 @@
return;
}
- List<AccountInfo> transformed = Lists.transform(reviewers,
- new Function<Account.Id, AccountInfo>() {
- @Override
- public AccountInfo apply(Account.Id account) {
- return util.accountInfo(account);
- }
- });
-
try {
fire(util.changeInfo(change),
util.revisionInfo(change.getProject(), patchSet),
- transformed,
+ Lists.transform(reviewers, util::accountInfo),
util.accountInfo(adder),
when);
} catch (PatchListNotAvailableException | GpgException | IOException
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/webui/UiActions.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/webui/UiActions.java
index 601bcc6..3dbd1e3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/webui/UiActions.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/webui/UiActions.java
@@ -14,11 +14,8 @@
package com.google.gerrit.server.extensions.webui;
-import com.google.common.base.Function;
import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.collect.Iterables;
-import com.google.gerrit.common.Nullable;
+import com.google.common.collect.FluentIterable;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.RestCollection;
@@ -33,16 +30,13 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.Objects;
+
public class UiActions {
private static final Logger log = LoggerFactory.getLogger(UiActions.class);
public static Predicate<UiAction.Description> enabled() {
- return new Predicate<UiAction.Description>() {
- @Override
- public boolean apply(UiAction.Description input) {
- return input.isEnabled();
- }
- };
+ return UiAction.Description::isEnabled;
}
public static <R extends RestResource> Iterable<UiAction.Description> from(
@@ -56,58 +50,52 @@
DynamicMap<RestView<R>> views,
final R resource,
final Provider<CurrentUser> userProvider) {
- return Iterables.filter(
- Iterables.transform(
- views,
- new Function<DynamicMap.Entry<RestView<R>>, UiAction.Description> () {
- @Override
- @Nullable
- public UiAction.Description apply(DynamicMap.Entry<RestView<R>> e) {
- int d = e.getExportName().indexOf('.');
- if (d < 0) {
- return null;
- }
+ return FluentIterable.from(views)
+ .transform((DynamicMap.Entry<RestView<R>> e) -> {
+ int d = e.getExportName().indexOf('.');
+ if (d < 0) {
+ return null;
+ }
- RestView<R> view;
- try {
- view = e.getProvider().get();
- } catch (RuntimeException err) {
- log.error(String.format(
- "error creating view %s.%s",
- e.getPluginName(), e.getExportName()), err);
- return null;
- }
+ RestView<R> view;
+ try {
+ view = e.getProvider().get();
+ } catch (RuntimeException err) {
+ log.error(String.format(
+ "error creating view %s.%s",
+ e.getPluginName(), e.getExportName()), err);
+ return null;
+ }
- if (!(view instanceof UiAction)) {
- return null;
- }
+ if (!(view instanceof UiAction)) {
+ return null;
+ }
- try {
- CapabilityUtils.checkRequiresCapability(userProvider,
- e.getPluginName(), view.getClass());
- } catch (AuthException exc) {
- return null;
- }
+ try {
+ CapabilityUtils.checkRequiresCapability(userProvider,
+ e.getPluginName(), view.getClass());
+ } catch (AuthException exc) {
+ return null;
+ }
- UiAction.Description dsc =
- ((UiAction<R>) view).getDescription(resource);
- if (dsc == null || !dsc.isVisible()) {
- return null;
- }
+ UiAction.Description dsc =
+ ((UiAction<R>) view).getDescription(resource);
+ if (dsc == null || !dsc.isVisible()) {
+ return null;
+ }
- String name = e.getExportName().substring(d + 1);
- PrivateInternals_UiActionDescription.setMethod(
- dsc,
- e.getExportName().substring(0, d));
- PrivateInternals_UiActionDescription.setId(
- dsc,
- "gerrit".equals(e.getPluginName())
- ? name
- : e.getPluginName() + '~' + name);
- return dsc;
- }
- }),
- Predicates.notNull());
+ String name = e.getExportName().substring(d + 1);
+ PrivateInternals_UiActionDescription.setMethod(
+ dsc,
+ e.getExportName().substring(0, d));
+ PrivateInternals_UiActionDescription.setId(
+ dsc,
+ "gerrit".equals(e.getPluginName())
+ ? name
+ : e.getPluginName() + '~' + name);
+ return dsc;
+ })
+ .filter(Objects::nonNull);
}
private UiActions() {
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 3855b8f..8e98562 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
@@ -17,6 +17,7 @@
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
+import static java.util.Comparator.comparing;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
@@ -226,7 +227,7 @@
this.dbWrapper = dbWrapper;
this.threadLocalRepo = repo;
this.threadLocalRevWalk = rw;
- updates = new TreeMap<>(ReviewDbUtil.intKeyOrdering());
+ updates = new TreeMap<>(comparing(PatchSet.Id::get));
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/CodeReviewCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/CodeReviewCommit.java
index f07b922..27767c0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/CodeReviewCommit.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/CodeReviewCommit.java
@@ -16,7 +16,6 @@
import static com.google.common.base.Preconditions.checkArgument;
-import com.google.common.base.Function;
import com.google.common.collect.Ordering;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
@@ -46,14 +45,11 @@
* AnyObjectId} and only orders on SHA-1.
*/
public static final Ordering<CodeReviewCommit> ORDER = Ordering.natural()
- .onResultOf(new Function<CodeReviewCommit, Integer>() {
- @Override
- public Integer apply(CodeReviewCommit in) {
- return in.getPatchsetId() != null
- ? in.getPatchsetId().getParentKey().get()
- : null;
- }
- }).nullsFirst();
+ .onResultOf((CodeReviewCommit c) ->
+ c.getPatchsetId() != null
+ ? c.getPatchsetId().getParentKey().get()
+ : null)
+ .nullsFirst();
public static CodeReviewRevWalk newRevWalk(Repository repo) {
return new CodeReviewRevWalk(repo);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupCollector.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupCollector.java
index d832260..795a838 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupCollector.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GroupCollector.java
@@ -18,7 +18,6 @@
import static org.eclipse.jgit.revwalk.RevFlag.UNINTERESTING;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableList;
@@ -158,13 +157,7 @@
private static Multimap<ObjectId, PatchSet.Id> transformRefs(
Multimap<ObjectId, Ref> refs) {
return Multimaps.transformValues(
- refs,
- new Function<Ref, PatchSet.Id>() {
- @Override
- public PatchSet.Id apply(Ref in) {
- return PatchSet.Id.fromRef(in.getName());
- }
- });
+ refs, r -> PatchSet.Id.fromRef(r.getName()));
}
@VisibleForTesting
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
index 093d036b..ad5cf20 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
@@ -31,6 +31,7 @@
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryCache;
import org.eclipse.jgit.lib.RepositoryCache.FileKey;
+import org.eclipse.jgit.lib.RepositoryCacheConfig;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.storage.file.WindowCacheConfig;
import org.eclipse.jgit.util.FS;
@@ -84,6 +85,10 @@
@Override
public void start() {
+ RepositoryCacheConfig repoCacheCfg = new RepositoryCacheConfig();
+ repoCacheCfg.fromConfig(serverConfig);
+ repoCacheCfg.install();
+
WindowCacheConfig cfg = new WindowCacheConfig();
cfg.fromConfig(serverConfig);
if (serverConfig.getString("core", null, "streamFileThreshold") == null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
index 39ad6ee..71bc9f4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
@@ -17,12 +17,11 @@
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
+import static java.util.Comparator.comparing;
import com.google.auto.value.AutoValue;
-import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
@@ -31,7 +30,6 @@
import com.google.common.collect.Iterables;
import com.google.common.collect.Multimap;
import com.google.common.collect.MultimapBuilder;
-import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.TimeUtil;
@@ -122,13 +120,10 @@
}
byBranch = bb.build();
commits = new HashMap<>();
- problems = MultimapBuilder.treeKeys(
- Ordering.natural().onResultOf(new Function<Change.Id, Integer>() {
- @Override
- public Integer apply(Change.Id in) {
- return in.get();
- }
- })).arrayListValues(1).build();
+ problems = MultimapBuilder
+ .treeKeys(comparing(Change.Id::get))
+ .arrayListValues(1)
+ .build();
}
public ImmutableSet<Change.Id> getChangeIds() {
@@ -264,12 +259,7 @@
if (in == null) {
return Optional.absent();
}
- return Iterables.tryFind(in, new Predicate<SubmitRecord>() {
- @Override
- public boolean apply(SubmitRecord input) {
- return input.status == SubmitRecord.Status.OK;
- }
- });
+ return Iterables.tryFind(in, r -> r.status == SubmitRecord.Status.OK);
}
public static void checkSubmitRule(ChangeData cd)
@@ -550,6 +540,10 @@
submitting.submitType(), ob.oldTip, submoduleOp, dryrun);
strategies.add(strategy);
strategy.addOps(or.getUpdate(), commitsToSubmit);
+ if (submitting.submitType().equals(SubmitType.FAST_FORWARD_ONLY) &&
+ submoduleOp.hasSubscription(branch)) {
+ submoduleOp.addOp(or.getUpdate(), branch);
+ }
} else {
// no open change for this branch
// add submodule triggered op into BatchUpdate
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java
index 44fe101..0667e14 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeUtil.java
@@ -16,9 +16,9 @@
import static com.google.common.base.Preconditions.checkArgument;
-import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Strings;
+import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
@@ -599,14 +599,10 @@
Joiner.on("', '").join(topics));
} else {
return String.format("Merge changes %s%s",
- Joiner.on(',').join(Iterables.transform(
- Iterables.limit(merged, 5),
- new Function<CodeReviewCommit, String>() {
- @Override
- public String apply(CodeReviewCommit in) {
- return in.change().getKey().abbreviate();
- }
- })),
+ FluentIterable.from(merged)
+ .limit(5)
+ .transform(c -> c.change().getKey().abbreviate())
+ .join(Joiner.on(',')),
merged.size() > 5 ? ", ..." : "");
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
index 014b28d..c2c12f0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
@@ -21,6 +21,9 @@
import static com.google.gerrit.server.change.HashtagsUtil.cleanupHashtag;
import static com.google.gerrit.server.git.MultiProgressMonitor.UNKNOWN;
import static com.google.gerrit.server.mail.MailUtil.getRecipientsFromFooters;
+import static java.util.Comparator.comparingInt;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
import static org.eclipse.jgit.lib.Constants.R_HEADS;
import static org.eclipse.jgit.lib.RefDatabase.ALL;
import static org.eclipse.jgit.transport.ReceiveCommand.Result.NOT_ATTEMPTED;
@@ -30,15 +33,11 @@
import static org.eclipse.jgit.transport.ReceiveCommand.Result.REJECTED_OTHER_REASON;
import com.google.common.base.Function;
-import com.google.common.base.Joiner;
import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.BiMap;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.FluentIterable;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableList;
@@ -48,7 +47,6 @@
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import com.google.common.collect.Ordering;
import com.google.common.collect.SetMultimap;
import com.google.common.collect.Sets;
import com.google.common.collect.SortedSetMultimap;
@@ -681,14 +679,9 @@
}
private void reportMessages() {
- Iterable<CreateRequest> created =
- Iterables.filter(newChanges, new Predicate<CreateRequest>() {
- @Override
- public boolean apply(CreateRequest input) {
- return input.change != null;
- }
- });
- if (!Iterables.isEmpty(created)) {
+ List<CreateRequest> created =
+ newChanges.stream().filter(r -> r.change != null).collect(toList());
+ if (!created.isEmpty()) {
addMessage("");
addMessage("New Changes:");
for (CreateRequest c : created) {
@@ -699,21 +692,10 @@
addMessage("");
}
- List<ReplaceRequest> updated = FluentIterable
- .from(replaceByChange.values())
- .filter(new Predicate<ReplaceRequest>() {
- @Override
- public boolean apply(ReplaceRequest input) {
- return !input.skip && input.inputCommand.getResult() == OK;
- }
- })
- .toSortedList(Ordering.natural().onResultOf(
- new Function<ReplaceRequest, Integer>() {
- @Override
- public Integer apply(ReplaceRequest in) {
- return in.notes.getChangeId().get();
- }
- }));
+ List<ReplaceRequest> updated = replaceByChange.values().stream()
+ .filter(r -> !r.skip && r.inputCommand.getResult() == OK)
+ .sorted(comparingInt(r -> r.notes.getChangeId().get()))
+ .collect(toList());
if (!updated.isEmpty()) {
addMessage("");
addMessage("Updated Changes:");
@@ -831,7 +813,7 @@
// One or more new references failed to create. Assume the
// system isn't working correctly anymore and abort.
reject(magicBranch.cmd, "Unable to create changes: "
- + Joiner.on(' ').join(lastCreateChangeErrors));
+ + lastCreateChangeErrors.stream().collect(joining(" ")));
logError(String.format(
"Only %d of %d new change refs created in %s; aborting",
okToInsert, replaceCount + newChanges.size(), project.getName()));
@@ -1056,11 +1038,12 @@
.getPluginConfig(e.getPluginName())
.getString(e.getExportName());
if (configEntry.getType() == ProjectConfigEntryType.ARRAY) {
- List<String> l =
- Arrays.asList(projectControl.getProjectState()
- .getConfig().getPluginConfig(e.getPluginName())
- .getStringList(e.getExportName()));
- oldValue = Joiner.on("\n").join(l);
+ oldValue =
+ Arrays.stream(
+ projectControl.getProjectState()
+ .getConfig().getPluginConfig(e.getPluginName())
+ .getStringList(e.getExportName()))
+ .collect(joining("\n"));
}
if ((value == null ? oldValue != null : !value.equals(oldValue)) &&
@@ -1796,14 +1779,10 @@
List<ChangeData> changes = p.destChanges;
if (changes.size() > 1) {
logDebug("Multiple changes in project with Change-Id {}: {}",
- p.changeKey, Lists.transform(
- changes,
- new Function<ChangeData, String>() {
- @Override
- public String apply(ChangeData in) {
- return in.getId().toString();
- }
- }));
+ p.changeKey,
+ changes.stream()
+ .map(cd -> cd.getId().toString())
+ .collect(joining()));
// WTF, multiple changes in this project have the same key?
// Since the commit is new, the user should recreate it with
// a different Change-Id. In practice, we should never see
@@ -2188,14 +2167,8 @@
Collection<ChangeNotes> allNotes =
notesFactory.create(
db,
- Collections2.transform(
- replaceByChange.values(),
- new Function<ReplaceRequest, Change.Id>() {
- @Override
- public Change.Id apply(ReplaceRequest in) {
- return in.ontoChange;
- }
- }));
+ replaceByChange.values().stream()
+ .map(r -> r.ontoChange).collect(toList()));
for (ChangeNotes notes : allNotes) {
replaceByChange.get(notes.getChangeId()).notes = notes;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
index ced6ca0..a1578ce 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
@@ -354,12 +354,16 @@
}
CodeReviewCommit currentCommit;
- Ref r = or.repo.exactRef(subscriber.get());
- if (r == null) {
- throw new SubmoduleException(
- "The branch was probably deleted from the subscriber repository");
+ if (branchTips.containsKey(subscriber)) {
+ currentCommit = branchTips.get(subscriber);
+ } else {
+ Ref r = or.repo.exactRef(subscriber.get());
+ if (r == null) {
+ throw new SubmoduleException(
+ "The branch was probably deleted from the subscriber repository");
+ }
+ currentCommit = or.rw.parseCommit(r.getObjectId());
}
- currentCommit = or.rw.parseCommit(r.getObjectId());
StringBuilder msgbuf = new StringBuilder("");
PersonIdent author = null;
@@ -436,7 +440,9 @@
commit.setAuthor(currentCommit.getAuthorIdent());
commit.setCommitter(myIdent);
ObjectId id = or.ins.insert(commit);
- return or.rw.parseCommit(id);
+ CodeReviewCommit newCommit = or.rw.parseCommit(id);
+ newCommit.copyFrom(currentCommit);
+ return newCommit;
}
private RevCommit updateSubmodule(DirCache dc, DirCacheEditor ed,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSetHolder.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSetHolder.java
index 5260aab..ad650c3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSetHolder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSetHolder.java
@@ -14,8 +14,8 @@
package com.google.gerrit.server.git;
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
+import static java.util.stream.Collectors.toList;
+
import com.google.gerrit.reviewdb.client.Project;
import org.eclipse.jgit.lib.Ref;
@@ -45,12 +45,7 @@
}
TagMatcher matcher(TagCache cache, Repository db, Collection<Ref> include) {
- include = FluentIterable.from(include).filter(new Predicate<Ref>() {
- @Override
- public boolean apply(Ref ref) {
- return !TagSet.skip(ref);
- }
- }).toList();
+ include = include.stream().filter(r -> !TagSet.skip(r)).collect(toList());
TagSet tags = this.tags;
if (tags == null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java
index 4a5e94d..31da05c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/CherryPick.java
@@ -48,14 +48,14 @@
@Override
public List<SubmitStrategyOp> buildOps(
- Collection<CodeReviewCommit> toMerge) {
+ Collection<CodeReviewCommit> toMerge) throws IntegrationException {
List<CodeReviewCommit> sorted = CodeReviewCommit.ORDER.sortedCopy(toMerge);
List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
boolean first = true;
while (!sorted.isEmpty()) {
CodeReviewCommit n = sorted.remove(0);
if (first && args.mergeTip.getInitialTip() == null) {
- ops.add(new CherryPickUnbornRootOp(n));
+ ops.add(new FastForwardOp(args, n));
} else if (n.getParentCount() == 0) {
ops.add(new CherryPickRootOp(n));
} else if (n.getParentCount() == 1) {
@@ -68,21 +68,6 @@
return ops;
}
- private class CherryPickUnbornRootOp extends SubmitStrategyOp {
- private CherryPickUnbornRootOp(CodeReviewCommit toMerge) {
- super(CherryPick.this.args, toMerge);
- }
-
- @Override
- protected void updateRepoImpl(RepoContext ctx) throws IntegrationException {
- // The branch is unborn. Take fast-forward resolution to create the
- // branch.
- CodeReviewCommit newCommit = amendGitlink(toMerge);
- args.mergeTip.moveTipTo(newCommit, toMerge);
- newCommit.setStatusCode(CommitMergeStatus.CLEAN_MERGE);
- }
- }
-
private class CherryPickRootOp extends SubmitStrategyOp {
private CherryPickRootOp(CodeReviewCommit toMerge) {
super(CherryPick.this.args, toMerge);
@@ -191,8 +176,9 @@
// different first parent. So instead behave as though MERGE_IF_NECESSARY
// was configured.
MergeTip mergeTip = args.mergeTip;
- if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge)) {
- mergeTip.moveTipTo(amendGitlink(toMerge), toMerge);
+ if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge) &&
+ !args.submoduleOp.hasSubscription(args.destBranch)) {
+ mergeTip.moveTipTo(toMerge, toMerge);
} else {
PersonIdent myIdent = new PersonIdent(args.serverIdent, ctx.getWhen());
CodeReviewCommit result = args.mergeUtil.mergeOneCommit(myIdent,
@@ -200,9 +186,9 @@
mergeTip.getCurrentTip(), toMerge);
result = amendGitlink(result);
mergeTip.moveTipTo(result, toMerge);
+ args.mergeUtil.markCleanMerges(args.rw, args.canMergeFlag,
+ mergeTip.getCurrentTip(), args.alreadyAccepted);
}
- args.mergeUtil.markCleanMerges(args.rw, args.canMergeFlag,
- mergeTip.getCurrentTip(), args.alreadyAccepted);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOp.java
index 0e69128..bb58540 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/FastForwardOp.java
@@ -25,6 +25,6 @@
@Override
protected void updateRepoImpl(RepoContext ctx) throws IntegrationException {
- args.mergeTip.moveTipTo(amendGitlink(toMerge), toMerge);
+ args.mergeTip.moveTipTo(toMerge, toMerge);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeIfNecessary.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeIfNecessary.java
index 0e2cbd7..5b2e213 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeIfNecessary.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/MergeIfNecessary.java
@@ -32,11 +32,15 @@
List<CodeReviewCommit> sorted =
args.mergeUtil.reduceToMinimalMerge(args.mergeSorter, toMerge);
List<SubmitStrategyOp> ops = new ArrayList<>(sorted.size());
- CodeReviewCommit firstFastForward = args.mergeUtil.getFirstFastForward(
+
+ if (args.mergeTip.getInitialTip() == null || !args.submoduleOp
+ .hasSubscription(args.destBranch)) {
+ CodeReviewCommit firstFastForward = args.mergeUtil.getFirstFastForward(
args.mergeTip.getInitialTip(), args.rw, sorted);
- if (firstFastForward != null &&
- !firstFastForward.equals(args.mergeTip.getInitialTip())) {
- ops.add(new FastForwardOp(args, firstFastForward));
+ if (firstFastForward != null &&
+ !firstFastForward.equals(args.mergeTip.getInitialTip())) {
+ ops.add(new FastForwardOp(args, firstFastForward));
+ }
}
// For every other commit do a pair-wise merge.
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseIfNecessary.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseIfNecessary.java
index f183772d..3270fc3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseIfNecessary.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/RebaseIfNecessary.java
@@ -63,7 +63,7 @@
while (!sorted.isEmpty()) {
CodeReviewCommit n = sorted.remove(0);
if (first && args.mergeTip.getInitialTip() == null) {
- ops.add(new RebaseUnbornRootOp(n));
+ ops.add(new FastForwardOp(args, n));
} else if (n.getParentCount() == 0) {
ops.add(new RebaseRootOp(n));
} else if (n.getParentCount() == 1) {
@@ -76,22 +76,6 @@
return ops;
}
- private class RebaseUnbornRootOp extends SubmitStrategyOp {
- private RebaseUnbornRootOp(CodeReviewCommit toMerge) {
- super(RebaseIfNecessary.this.args, toMerge);
- }
-
- @Override
- public void updateRepoImpl(RepoContext ctx) throws IntegrationException {
- // The branch is unborn. Take fast-forward resolution to create the
- // branch.
- toMerge.setStatusCode(CommitMergeStatus.CLEAN_MERGE);
- CodeReviewCommit newCommit = amendGitlink(toMerge);
- args.mergeTip.moveTipTo(newCommit, toMerge);
- acceptMergeTip(args.mergeTip);
- }
- }
-
private class RebaseRootOp extends SubmitStrategyOp {
private RebaseRootOp(CodeReviewCommit toMerge) {
super(RebaseIfNecessary.this.args, toMerge);
@@ -120,9 +104,11 @@
// TODO(dborowitz): args.rw is needed because it's a CodeReviewRevWalk.
// When hoisting BatchUpdate into MergeOp, we will need to teach
// BatchUpdate how to produce CodeReviewRevWalks.
- if (args.mergeUtil.canFastForward(args.mergeSorter,
- args.mergeTip.getCurrentTip(), args.rw, toMerge)) {
+ if (args.mergeUtil
+ .canFastForward(args.mergeSorter, args.mergeTip.getCurrentTip(),
+ args.rw, toMerge)) {
args.mergeTip.moveTipTo(amendGitlink(toMerge), toMerge);
+ toMerge.setStatusCode(CommitMergeStatus.CLEAN_MERGE);
acceptMergeTip(args.mergeTip);
return;
}
@@ -193,9 +179,9 @@
// first parent. So instead behave as though MERGE_IF_NECESSARY was
// configured.
MergeTip mergeTip = args.mergeTip;
- if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge)) {
- mergeTip.moveTipTo(amendGitlink(toMerge), toMerge);
- acceptMergeTip(mergeTip);
+ if (args.rw.isMergedInto(mergeTip.getCurrentTip(), toMerge) &&
+ !args.submoduleOp.hasSubscription(args.destBranch)) {
+ mergeTip.moveTipTo(toMerge, toMerge);
} else {
CodeReviewCommit newTip = args.mergeUtil.mergeOneCommit(
args.serverIdent, args.serverIdent, args.repo, args.rw,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitDryRun.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitDryRun.java
index c784379..e60b947 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitDryRun.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitDryRun.java
@@ -14,7 +14,6 @@
package com.google.gerrit.server.git.strategy;
-import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import com.google.gerrit.extensions.client.SubmitType;
import com.google.gerrit.reviewdb.client.Branch;
@@ -70,12 +69,7 @@
return FluentIterable
.from(repo.getRefDatabase().getRefs(Constants.R_HEADS).values())
.append(repo.getRefDatabase().getRefs(Constants.R_TAGS).values())
- .transform(new Function<Ref, ObjectId>() {
- @Override
- public ObjectId apply(Ref r) {
- return r.getObjectId();
- }
- });
+ .transform(Ref::getObjectId);
}
public static Set<RevCommit> getAlreadyAccepted(Repository repo, RevWalk rw)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyOp.java
index ed08a19..b35de7b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyOp.java
@@ -182,13 +182,7 @@
}
}
Collections.sort(commits, ReviewDbUtil.intKeyOrdering().reverse()
- .onResultOf(
- new Function<CodeReviewCommit, PatchSet.Id>() {
- @Override
- public PatchSet.Id apply(CodeReviewCommit in) {
- return in.getPatchsetId();
- }
- }));
+ .onResultOf(c -> c.getPatchsetId()));
CodeReviewCommit result = MergeUtil.findAnyMergedInto(rw, commits, tip);
if (result == null) {
return null;
@@ -385,14 +379,11 @@
private static Function<PatchSetApproval, PatchSetApproval>
convertPatchSet(final PatchSet.Id psId) {
- return new Function<PatchSetApproval, PatchSetApproval>() {
- @Override
- public PatchSetApproval apply(PatchSetApproval in) {
- if (in.getPatchSetId().equals(psId)) {
- return in;
- }
- return new PatchSetApproval(psId, in);
+ return psa -> {
+ if (psa.getPatchSetId().equals(psId)) {
+ return psa;
}
+ return new PatchSetApproval(psId, psa);
};
}
@@ -403,14 +394,12 @@
private static Iterable<PatchSetApproval> zero(
Iterable<PatchSetApproval> approvals) {
- return Iterables.transform(approvals,
- new Function<PatchSetApproval, PatchSetApproval>() {
- @Override
- public PatchSetApproval apply(PatchSetApproval in) {
- PatchSetApproval copy = new PatchSetApproval(in.getPatchSetId(), in);
- copy.setValue((short) 0);
- return copy;
- }
+ return Iterables.transform(
+ approvals,
+ a -> {
+ PatchSetApproval copy = new PatchSetApproval(a.getPatchSetId(), a);
+ copy.setValue((short) 0);
+ return copy;
});
}
@@ -564,26 +553,18 @@
*/
protected CodeReviewCommit amendGitlink(CodeReviewCommit commit)
throws IntegrationException {
- CodeReviewCommit newCommit = commit;
- // Modify the commit with gitlink update
- if (args.submoduleOp.hasSubscription(args.destBranch)) {
- try {
- newCommit =
- args.submoduleOp.composeGitlinksCommit(args.destBranch, commit);
- newCommit.copyFrom(commit);
- if (commit.equals(toMerge)) {
- newCommit.setPatchsetId(ChangeUtil.nextPatchSetId(
- args.repo, toMerge.change().currentPatchSetId()));
- args.commits.put(newCommit);
- }
- } catch (SubmoduleException | IOException e) {
- throw new IntegrationException(
- "cannot update gitlink for the commit at branch: "
- + args.destBranch);
- }
+ if (!args.submoduleOp.hasSubscription(args.destBranch)) {
+ return commit;
}
- return newCommit;
+ // Modify the commit with gitlink update
+ try {
+ return args.submoduleOp.composeGitlinksCommit(args.destBranch, commit);
+ } catch (SubmoduleException | IOException e) {
+ throw new IntegrationException(
+ "cannot update gitlink for the commit at branch: "
+ + args.destBranch);
+ }
}
protected final void logDebug(String msg, Object... args) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java
index d5d90d3..6a25862 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java
@@ -17,7 +17,6 @@
import static com.google.gerrit.server.git.QueueProvider.QueueType.BATCH;
import static com.google.gerrit.server.git.QueueProvider.QueueType.INTERACTIVE;
-import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
@@ -110,19 +109,11 @@
accounts,
changes);
Set<String> expected = FluentIterable.from(ALL_SCHEMA_DEFS)
- .transform(new Function<SchemaDefinitions<?>, String>() {
- @Override
- public String apply(SchemaDefinitions<?> in) {
- return in.getName();
- }
- }).toSet();
+ .transform(SchemaDefinitions::getName)
+ .toSet();
Set<String> actual = FluentIterable.from(result)
- .transform(new Function<IndexDefinition<?, ?, ?>, String>() {
- @Override
- public String apply(IndexDefinition<?, ?, ?> in) {
- return in.getName();
- }
- }).toSet();
+ .transform(IndexDefinition::getName)
+ .toSet();
if (!expected.equals(actual)) {
throw new ProvisionException(
"need index definitions for all schemas: "
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountField.java
index 824739e..afe3f70 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountField.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/account/AccountField.java
@@ -14,14 +14,12 @@
package com.google.gerrit.server.index.account;
-import com.google.common.base.Function;
import com.google.common.base.Predicates;
import com.google.common.base.Strings;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Iterables;
import com.google.gerrit.reviewdb.client.AccountExternalId;
import com.google.gerrit.server.account.AccountState;
-import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
import com.google.gerrit.server.index.FieldDef;
import com.google.gerrit.server.index.FieldType;
import com.google.gerrit.server.index.SchemaUtil;
@@ -47,13 +45,7 @@
@Override
public Iterable<String> get(AccountState input, FillArgs args) {
return Iterables.transform(
- input.getExternalIds(),
- new Function<AccountExternalId, String>() {
- @Override
- public String apply(AccountExternalId in) {
- return in.getKey().get();
- }
- });
+ input.getExternalIds(), id -> id.getKey().get());
}
};
@@ -68,12 +60,7 @@
fullName,
Iterables.transform(
input.getExternalIds(),
- new Function<AccountExternalId, String>() {
- @Override
- public String apply(AccountExternalId in) {
- return in.getEmailAddress();
- }
- }));
+ AccountExternalId::getEmailAddress));
// Additional values not currently added by getPersonParts.
// TODO(dborowitz): Move to getPersonParts and remove this hack.
@@ -108,23 +95,11 @@
@Override
public Iterable<String> get(AccountState input, FillArgs args) {
return FluentIterable.from(input.getExternalIds())
- .transform(
- new Function<AccountExternalId, String>() {
- @Override
- public String apply(AccountExternalId in) {
- return in.getEmailAddress();
- }
- })
+ .transform(AccountExternalId::getEmailAddress)
.append(
Collections.singleton(input.getAccount().getPreferredEmail()))
.filter(Predicates.notNull())
- .transform(
- new Function<String, String>() {
- @Override
- public String apply(String in) {
- return in.toLowerCase();
- }
- })
+ .transform(String::toLowerCase)
.toSet();
}
};
@@ -153,12 +128,8 @@
@Override
public Iterable<String> get(AccountState input, FillArgs args) {
return FluentIterable.from(input.getProjectWatches().keySet())
- .transform(new Function<ProjectWatchKey, String>() {
- @Override
- public String apply(ProjectWatchKey in) {
- return in.project().get();
- }
- }).toSet();
+ .transform(k -> k.project().get())
+ .toSet();
}
};
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java
index fe448c6..891a8da 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java
@@ -16,9 +16,9 @@
import static com.google.common.base.MoreObjects.firstNonNull;
import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toSet;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
@@ -34,7 +34,6 @@
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
import com.google.gerrit.server.ReviewerSet;
import com.google.gerrit.server.StarredChangesUtil;
import com.google.gerrit.server.index.FieldDef;
@@ -247,13 +246,9 @@
@Override
public Iterable<String> get(ChangeData input, FillArgs args)
throws OrmException {
- return ImmutableSet.copyOf(Iterables.transform(input.hashtags(),
- new Function<String, String>() {
- @Override
- public String apply(String input) {
- return input.toLowerCase();
- }
- }));
+ return input.hashtags().stream()
+ .map(String::toLowerCase)
+ .collect(toSet());
}
};
@@ -264,13 +259,9 @@
@Override
public Iterable<byte[]> get(ChangeData input, FillArgs args)
throws OrmException {
- return ImmutableSet.copyOf(Iterables.transform(input.hashtags(),
- new Function<String, byte[]>() {
- @Override
- public byte[] apply(String hashtag) {
- return hashtag.getBytes(UTF_8);
- }
- }));
+ return input.hashtags().stream()
+ .map(t -> t.getBytes(UTF_8))
+ .collect(toSet());
}
};
@@ -657,13 +648,7 @@
@Override
public Iterable<Integer> get(ChangeData input, FillArgs args)
throws OrmException {
- return Iterables.transform(input.starredBy(),
- new Function<Account.Id, Integer>() {
- @Override
- public Integer apply(Account.Id accountId) {
- return accountId.get();
- }
- });
+ return Iterables.transform(input.starredBy(), Account.Id::get);
}
};
@@ -676,14 +661,12 @@
@Override
public Iterable<String> get(ChangeData input, FillArgs args)
throws OrmException {
- return Iterables.transform(input.stars().entries(),
- new Function<Map.Entry<Account.Id, String>, String>() {
- @Override
- public String apply(Map.Entry<Account.Id, String> e) {
- return StarredChangesUtil.StarField.create(
- e.getKey(), e.getValue()).toString();
- }
- });
+ return Iterables.transform(
+ input.stars().entries(),
+ (Map.Entry<Account.Id, String> e) -> {
+ return StarredChangesUtil.StarField.create(
+ e.getKey(), e.getValue()).toString();
+ });
}
};
@@ -694,8 +677,7 @@
@Override
public Iterable<Integer> get(ChangeData input, FillArgs args)
throws OrmException {
- return Iterables.transform(input.stars().keySet(),
- ReviewDbUtil.INT_KEY_FUNCTION);
+ return Iterables.transform(input.stars().keySet(), Account.Id::get);
}
};
@@ -740,13 +722,9 @@
@Override
public Iterable<Integer> get(ChangeData input, FillArgs args)
throws OrmException {
- return ImmutableSet.copyOf(Iterables.transform(input.editsByUser(),
- new Function<Account.Id, Integer>() {
- @Override
- public Integer apply(Account.Id account) {
- return account.get();
- }
- }));
+ return input.editsByUser().stream()
+ .map(Account.Id::get)
+ .collect(toSet());
}
};
@@ -758,13 +736,9 @@
@Override
public Iterable<Integer> get(ChangeData input, FillArgs args)
throws OrmException {
- return ImmutableSet.copyOf(Iterables.transform(input.draftsByUser(),
- new Function<Account.Id, Integer>() {
- @Override
- public Integer apply(Account.Id account) {
- return account.get();
- }
- }));
+ return input.draftsByUser().stream()
+ .map(Account.Id::get)
+ .collect(toSet());
}
};
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java
index 996caa7..3e0678d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/IndexedChangeQuery.java
@@ -19,7 +19,6 @@
import static com.google.gerrit.server.index.change.ChangeField.PROJECT;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.gerrit.reviewdb.client.Change;
@@ -94,12 +93,9 @@
public Iterator<ChangeData> iterator() {
return Iterables.transform(
rs,
- new Function<ChangeData, ChangeData>() {
- @Override
- public ChangeData apply(ChangeData cd) {
- fromSource.put(cd, currSource);
- return cd;
- }
+ cd -> {
+ fromSource.put(cd, currSource);
+ return cd;
}).iterator();
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ReindexAfterUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ReindexAfterUpdate.java
index e446f9a..942ce88 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ReindexAfterUpdate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ReindexAfterUpdate.java
@@ -127,7 +127,7 @@
if (ref.equals(RefNames.REFS_CONFIG)) {
return asChanges(queryProvider.get().byProjectOpen(project));
}
- return asChanges(queryProvider.get().byBranchOpen(
+ return asChanges(queryProvider.get().byBranchNew(
new Branch.NameKey(project, ref)));
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/AbandonedSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/AbandonedSender.java
index a828098..f1e609e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/AbandonedSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/AbandonedSender.java
@@ -51,11 +51,13 @@
@Override
protected void formatChange() throws EmailException {
appendText(textTemplate("Abandoned"));
- appendHtml(soyHtmlTemplate("AbandonedHtml"));
+ if (useHtml()) {
+ appendHtml(soyHtmlTemplate("AbandonedHtml"));
+ }
}
@Override
- protected boolean useHtml() {
+ protected boolean supportsHtml() {
return true;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/AddKeySender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/AddKeySender.java
index 61ef92d..40492bd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/AddKeySender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/AddKeySender.java
@@ -81,7 +81,9 @@
@Override
protected void format() throws EmailException {
appendText(textTemplate("AddKey"));
- appendHtml(soyHtmlTemplate("AddKeyHtml"));
+ if (useHtml()) {
+ appendHtml(soyHtmlTemplate("AddKeyHtml"));
+ }
}
public String getEmail() {
@@ -123,7 +125,7 @@
}
@Override
- protected boolean useHtml() {
+ protected boolean supportsHtml() {
return true;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ChangeEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ChangeEmail.java
index cbd2ec9..df0f018 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ChangeEmail.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ChangeEmail.java
@@ -259,7 +259,7 @@
detail.append("---\n");
PatchList patchList = getPatchList();
for (PatchListEntry p : patchList.getPatches()) {
- if (Patch.COMMIT_MSG.equals(p.getNewName())) {
+ if (Patch.isMagic(p.getNewName())) {
continue;
}
detail.append(p.getChangeType().getCode())
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java
index 2424a6d..c4b6869 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java
@@ -75,7 +75,7 @@
Set<String> paths = new HashSet<>();
for (PatchLineComment c : plc) {
Patch.Key p = c.getKey().getParentKey();
- if (!Patch.COMMIT_MSG.equals(p.getFileName())) {
+ if (!Patch.isMagic(p.getFileName())) {
paths.add(p.getFileName());
}
}
@@ -137,6 +137,8 @@
}
if (Patch.COMMIT_MSG.equals(pk.get())) {
cmts.append("Commit Message:\n\n");
+ } else if (Patch.MERGE_LIST.equals(pk.get())) {
+ cmts.append("Merge List:\n\n");
} else {
cmts.append("File ").append(pk.get()).append(":\n\n");
}
@@ -144,8 +146,7 @@
if (patchList != null) {
try {
- currentFileData =
- new PatchFile(repo, patchList, pk.get());
+ currentFileData = new PatchFile(repo, patchList, pk.get());
} catch (IOException e) {
log.warn(String.format(
"Cannot load %s from %s in %s",
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/DeleteReviewerSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/DeleteReviewerSender.java
index 008f343..ec4a728 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/DeleteReviewerSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/DeleteReviewerSender.java
@@ -66,7 +66,9 @@
@Override
protected void formatChange() throws EmailException {
appendText(textTemplate("DeleteReviewer"));
- appendHtml(soyHtmlTemplate("DeleteReviewerHtml"));
+ if (useHtml()) {
+ appendHtml(soyHtmlTemplate("DeleteReviewerHtml"));
+ }
}
public List<String> getReviewerNames() {
@@ -87,7 +89,7 @@
}
@Override
- protected boolean useHtml() {
+ protected boolean supportsHtml() {
return true;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/DeleteVoteSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/DeleteVoteSender.java
index 214c655..6257deb 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/DeleteVoteSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/DeleteVoteSender.java
@@ -50,11 +50,13 @@
@Override
protected void formatChange() throws EmailException {
appendText(textTemplate("DeleteVote"));
- appendHtml(soyHtmlTemplate("DeleteVoteHtml"));
+ if (useHtml()) {
+ appendHtml(soyHtmlTemplate("DeleteVoteHtml"));
+ }
}
@Override
- protected boolean useHtml() {
+ protected boolean supportsHtml() {
return true;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailSettings.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailSettings.java
index 3c14f2f..2f2fd8c5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailSettings.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailSettings.java
@@ -22,11 +22,13 @@
@Singleton
public class EmailSettings {
+ public final boolean html;
public final boolean includeDiff;
public final int maximumDiffSize;
@Inject
EmailSettings(@GerritServerConfig Config cfg) {
+ html = cfg.getBoolean("sendemail", "html", true);
includeDiff = cfg.getBoolean("sendemail", "includeDiff", false);
maximumDiffSize = cfg.getInt("sendemail", "maximumDiffSize", 256 << 10);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/NewChangeSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/NewChangeSender.java
index 6adbdb4..05a709d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/NewChangeSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/NewChangeSender.java
@@ -68,7 +68,9 @@
@Override
protected void formatChange() throws EmailException {
appendText(textTemplate("NewChange"));
- appendHtml(soyHtmlTemplate("NewChangeHtml"));
+ if (useHtml()) {
+ appendHtml(soyHtmlTemplate("NewChangeHtml"));
+ }
}
public List<String> getReviewerNames() {
@@ -89,7 +91,7 @@
}
@Override
- protected boolean useHtml() {
+ protected boolean supportsHtml() {
return true;
}
}
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 772752a..c3b69e3 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
@@ -631,8 +631,12 @@
return obj != null ? obj.toString() : "";
}
+ protected final boolean useHtml() {
+ return args.settings.html && supportsHtml();
+ }
+
/** Override this method to enable HTML in a subclass. */
- protected boolean useHtml() {
+ protected boolean supportsHtml() {
return false;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ReplacePatchSetSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ReplacePatchSetSender.java
index 916e0da..3f1e356 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ReplacePatchSetSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ReplacePatchSetSender.java
@@ -73,7 +73,9 @@
@Override
protected void formatChange() throws EmailException {
appendText(textTemplate("ReplacePatchSet"));
- appendHtml(soyHtmlTemplate("ReplacePatchSetHtml"));
+ if (useHtml()) {
+ appendHtml(soyHtmlTemplate("ReplacePatchSetHtml"));
+ }
}
public List<String> getReviewerNames() {
@@ -97,7 +99,7 @@
}
@Override
- protected boolean useHtml() {
+ protected boolean supportsHtml() {
return true;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/RestoredSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/RestoredSender.java
index 10564cf..45a45c7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/RestoredSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/RestoredSender.java
@@ -50,11 +50,13 @@
@Override
protected void formatChange() throws EmailException {
appendText(textTemplate("Restored"));
- appendHtml(soyHtmlTemplate("RestoredHtml"));
+ if (useHtml()) {
+ appendHtml(soyHtmlTemplate("RestoredHtml"));
+ }
}
@Override
- protected boolean useHtml() {
+ protected boolean supportsHtml() {
return true;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/RevertedSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/RevertedSender.java
index e383d31..0734a3c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/RevertedSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/RevertedSender.java
@@ -48,11 +48,13 @@
@Override
protected void formatChange() throws EmailException {
appendText(textTemplate("Reverted"));
- appendHtml(soyHtmlTemplate("RevertedHtml"));
+ if (useHtml()) {
+ appendHtml(soyHtmlTemplate("RevertedHtml"));
+ }
}
@Override
- protected boolean useHtml() {
+ protected boolean supportsHtml() {
return true;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundle.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundle.java
index ee9745c..fd931f5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundle.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundle.java
@@ -50,7 +50,6 @@
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.ReviewerSet;
import com.google.gerrit.server.notedb.rebuild.ChangeRebuilderImpl;
@@ -84,25 +83,6 @@
REVIEW_DB, NOTE_DB;
}
- public static ChangeBundle fromReviewDb(ReviewDb db, Change.Id id)
- throws OrmException {
- db.changes().beginTransaction(id);
- try {
- List<PatchSetApproval> approvals =
- db.patchSetApprovals().byChange(id).toList();
- return new ChangeBundle(
- db.changes().get(id),
- db.changeMessages().byChange(id),
- db.patchSets().byChange(id),
- approvals,
- db.patchComments().byChange(id),
- ReviewerSet.fromApprovals(approvals),
- Source.REVIEW_DB);
- } finally {
- db.rollback();
- }
- }
-
public static ChangeBundle fromNotes(PatchLineCommentsUtil plcUtil,
ChangeNotes notes) throws OrmException {
return new ChangeBundle(
@@ -365,54 +345,36 @@
private Map<PatchSetApproval.Key, PatchSetApproval>
filterPatchSetApprovals() {
- return limitToValidPatchSets(patchSetApprovals,
- new Function<PatchSetApproval.Key, PatchSet.Id>() {
- @Override
- public PatchSet.Id apply(PatchSetApproval.Key in) {
- return in.getParentKey();
- }
- });
+ return limitToValidPatchSets(
+ patchSetApprovals, PatchSetApproval.Key::getParentKey);
}
private Map<PatchLineComment.Key, PatchLineComment>
filterPatchLineComments() {
- return limitToValidPatchSets(patchLineComments,
- new Function<PatchLineComment.Key, PatchSet.Id>() {
- @Override
- public PatchSet.Id apply(PatchLineComment.Key in) {
- return in.getParentKey().getParentKey();
- }
- });
+ return limitToValidPatchSets(
+ patchLineComments,
+ k -> k.getParentKey().getParentKey());
}
private <K, V> Map<K, V> limitToValidPatchSets(Map<K, V> in,
- final Function<K, PatchSet.Id> func) {
+ Function<K, PatchSet.Id> func) {
return Maps.filterKeys(
in, Predicates.compose(validPatchSetPredicate(), func));
}
private Predicate<PatchSet.Id> validPatchSetPredicate() {
- final Predicate<PatchSet.Id> upToCurrent = upToCurrentPredicate();
- return new Predicate<PatchSet.Id>() {
- @Override
- public boolean apply(PatchSet.Id in) {
- return upToCurrent.apply(in) && patchSets.containsKey(in);
- }
- };
+ Predicate<PatchSet.Id> upToCurrent = upToCurrentPredicate();
+ return p -> upToCurrent.apply(p) && patchSets.containsKey(p);
}
private Collection<ChangeMessage> filterChangeMessages() {
final Predicate<PatchSet.Id> validPatchSet = validPatchSetPredicate();
- return Collections2.filter(changeMessages,
- new Predicate<ChangeMessage>() {
- @Override
- public boolean apply(ChangeMessage in) {
- PatchSet.Id psId = in.getPatchSetId();
- if (psId == null) {
- return true;
- }
- return validPatchSet.apply(psId);
+ return Collections2.filter(changeMessages, m -> {
+ PatchSet.Id psId = m.getPatchSetId();
+ if (psId == null) {
+ return true;
}
+ return validPatchSet.apply(psId);
});
}
@@ -421,13 +383,8 @@
if (current == null) {
return Predicates.alwaysFalse();
}
- final int max = current.get();
- return new Predicate<PatchSet.Id>() {
- @Override
- public boolean apply(PatchSet.Id in) {
- return in.get() <= max;
- }
- };
+ int max = current.get();
+ return p -> p.get() <= max;
}
private Map<PatchSet.Id, PatchSet> filterPatchSets() {
@@ -667,17 +624,31 @@
List<String> tempDiffs = new ArrayList<>();
String temp = "temp";
+ // ReviewDb allows timestamps before patch set was created, but NoteDb
+ // truncates this to the patch set creation timestamp.
+ Timestamp ta = a.getWrittenOn();
+ Timestamp tb = b.getWrittenOn();
+ PatchSet psa = bundleA.patchSets.get(a.getPatchSetId());
+ PatchSet psb = bundleB.patchSets.get(b.getPatchSetId());
boolean excludePatchSet = false;
+ boolean excludeWrittenOn = false;
if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) {
excludePatchSet = a.getPatchSetId() == null;
+ excludeWrittenOn = psa != null && psb != null
+ && ta.before(psa.getCreatedOn()) && tb.equals(psb.getCreatedOn());
} else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) {
excludePatchSet = b.getPatchSetId() == null;
+ excludeWrittenOn = psa != null && psb != null
+ && tb.before(psb.getCreatedOn()) && ta.equals(psa.getCreatedOn());
}
List<String> exclude = Lists.newArrayList("key");
if (excludePatchSet) {
exclude.add("patchset");
}
+ if (excludeWrittenOn) {
+ exclude.add("writtenOn");
+ }
diffColumnsExcluding(
tempDiffs, ChangeMessage.class, temp, bundleA, a, bundleB, b, exclude);
@@ -716,7 +687,28 @@
PatchSetApproval a = as.get(k);
PatchSetApproval b = bs.get(k);
String desc = describe(k);
- diffColumns(diffs, PatchSetApproval.class, desc, bundleA, a, bundleB, b);
+
+ // ReviewDb allows timestamps before patch set was created, but NoteDb
+ // truncates this to the patch set creation timestamp.
+ Timestamp ta = a.getGranted();
+ Timestamp tb = b.getGranted();
+ PatchSet psa = checkNotNull(bundleA.patchSets.get(a.getPatchSetId()));
+ PatchSet psb = checkNotNull(bundleB.patchSets.get(b.getPatchSetId()));
+ boolean excludeGranted = false;
+ List<String> exclude = new ArrayList<>(1);
+ if (bundleA.source == REVIEW_DB && bundleB.source == NOTE_DB) {
+ excludeGranted =
+ ta.before(psa.getCreatedOn()) && tb.equals(psb.getCreatedOn());
+ } else if (bundleA.source == NOTE_DB && bundleB.source == REVIEW_DB) {
+ excludeGranted =
+ tb.before(psb.getCreatedOn()) && ta.equals(psa.getCreatedOn());
+ }
+ if (excludeGranted) {
+ exclude.add("granted");
+ }
+
+ diffColumnsExcluding(
+ diffs, PatchSetApproval.class, desc, bundleA, a, bundleB, b, exclude);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundleReader.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundleReader.java
new file mode 100644
index 0000000..9e7a1fe1
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeBundleReader.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.server.notedb;
+
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gwtorm.server.OrmException;
+
+public interface ChangeBundleReader {
+ ChangeBundle fromReviewDb(ReviewDb db, Change.Id id) throws OrmException;
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
index 56454b9..960962f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
@@ -65,6 +65,7 @@
import java.util.Set;
public class ChangeNoteUtil {
+ public static final FooterKey FOOTER_ASSIGNEE = new FooterKey("Assignee");
public static final FooterKey FOOTER_BRANCH = new FooterKey("Branch");
public static final FooterKey FOOTER_CHANGE_ID = new FooterKey("Change-id");
public static final FooterKey FOOTER_COMMIT = new FooterKey("Commit");
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
index 9ffc70a..9c50c27 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
@@ -19,10 +19,9 @@
import static com.google.common.base.Preconditions.checkState;
import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
+import static java.util.Comparator.comparing;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
@@ -70,7 +69,6 @@
import org.slf4j.LoggerFactory;
import java.io.IOException;
-import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
@@ -78,28 +76,17 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
/** View of a single {@link Change} based on the log of its notes branch. */
public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
private static final Logger log = LoggerFactory.getLogger(ChangeNotes.class);
static final Ordering<PatchSetApproval> PSA_BY_TIME =
- Ordering.natural().onResultOf(
- new Function<PatchSetApproval, Timestamp>() {
- @Override
- public Timestamp apply(PatchSetApproval input) {
- return input.getGranted();
- }
- });
+ Ordering.from(comparing(PatchSetApproval::getGranted));
public static final Ordering<ChangeMessage> MESSAGE_BY_TIME =
- Ordering.natural().onResultOf(
- new Function<ChangeMessage, Timestamp>() {
- @Override
- public Timestamp apply(ChangeMessage input) {
- return input.getWrittenOn();
- }
- });
+ Ordering.from(comparing(ChangeMessage::getWrittenOn));
public static ConfigInvalidException parseException(Change.Id changeId,
String fmt, Object... args) {
@@ -249,7 +236,7 @@
if (args.migration.enabled()) {
for (Change.Id cid : changeIds) {
ChangeNotes cn = create(db, project, cid);
- if (cn.getChange() != null && predicate.apply(cn)) {
+ if (cn.getChange() != null && predicate.test(cn)) {
notes.add(cn);
}
}
@@ -259,7 +246,7 @@
for (Change c : ReviewDbUtil.unwrapDb(db).changes().get(changeIds)) {
if (c != null && project.equals(c.getDest().getParentKey())) {
ChangeNotes cn = createFromChangeOnlyWhenNoteDbDisabled(c);
- if (predicate.apply(cn)) {
+ if (predicate.test(cn)) {
notes.add(cn);
}
}
@@ -275,7 +262,7 @@
try (Repository repo = args.repoManager.openRepository(project)) {
List<ChangeNotes> changes = scanNoteDb(repo, db, project);
for (ChangeNotes cn : changes) {
- if (predicate.apply(cn)) {
+ if (predicate.test(cn)) {
m.put(project, cn);
}
}
@@ -284,7 +271,7 @@
} else {
for (Change change : ReviewDbUtil.unwrapDb(db).changes().all()) {
ChangeNotes notes = createFromChangeOnlyWhenNoteDbDisabled(change);
- if (predicate.apply(notes)) {
+ if (predicate.test(notes)) {
m.put(change.getProject(), notes);
}
}
@@ -400,6 +387,13 @@
}
/**
+ * @return an Account.Id of the user assigned to this change.
+ */
+ public Account.Id getAssignee() {
+ return state.assignee();
+ }
+
+ /**
*
* @return a ImmutableSet of all hashtags for this change sorted in alphabetical order.
*/
@@ -451,16 +445,13 @@
// failed.
Multimap<RevId, PatchLineComment> filtered = Multimaps.filterEntries(
draftCommentNotes.getComments(),
- new Predicate<Map.Entry<RevId, PatchLineComment>>() {
- @Override
- public boolean apply(Map.Entry<RevId, PatchLineComment> in) {
- for (PatchLineComment c : published.get(in.getKey())) {
- if (c.getKey().equals(in.getValue().getKey())) {
+ (Map.Entry<RevId, PatchLineComment> e) -> {
+ for (PatchLineComment c : published.get(e.getKey())) {
+ if (c.getKey().equals(e.getValue().getKey())) {
return false;
}
}
return true;
- }
});
return ImmutableListMultimap.copyOf(
filtered);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesParser.java
index 9efe842..8bf8ca1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesParser.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesParser.java
@@ -14,6 +14,7 @@
package com.google.gerrit.server.notedb;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_ASSIGNEE;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_BRANCH;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_CHANGE_ID;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_COMMIT;
@@ -28,11 +29,11 @@
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TAG;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TOPIC;
import static com.google.gerrit.server.notedb.NoteDbTable.CHANGES;
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.joining;
import com.google.auto.value.AutoValue;
import com.google.common.base.Enums;
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.base.Splitter;
import com.google.common.collect.ArrayListMultimap;
@@ -59,7 +60,6 @@
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
import com.google.gerrit.server.ReviewerSet;
import com.google.gerrit.server.ReviewerStatusUpdate;
import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk;
@@ -136,6 +136,7 @@
private String branch;
private Change.Status status;
private String topic;
+ private Account.Id assignee;
private Set<String> hashtags;
private Timestamp createdOn;
private Timestamp lastUpdatedOn;
@@ -163,7 +164,7 @@
allChangeMessages = new ArrayList<>();
changeMessagesByPatchSet = LinkedListMultimap.create();
comments = ArrayListMultimap.create();
- patchSets = Maps.newTreeMap(ReviewDbUtil.intKeyOrdering());
+ patchSets = Maps.newTreeMap(comparing(PatchSet.Id::get));
deletedPatchSets = new HashSet<>();
patchSetStates = new HashMap<>();
}
@@ -210,6 +211,7 @@
submissionId,
status,
+ assignee,
hashtags,
patchSets,
buildApprovals(),
@@ -317,6 +319,8 @@
parseHashtags(commit);
+ parseAssignee(commit);
+
if (submissionId == null) {
submissionId = parseSubmissionId(commit);
}
@@ -473,6 +477,18 @@
}
}
+ private void parseAssignee(ChangeNotesCommit commit)
+ throws ConfigInvalidException {
+ if (assignee != null) {
+ return;
+ }
+ String assigneeValue = parseOneFooter(commit, FOOTER_ASSIGNEE);
+ if (assigneeValue != null) {
+ PersonIdent ident = RawParseUtils.parsePersonIdent(assigneeValue);
+ assignee = noteUtil.parseIdent(ident, id);
+ }
+ }
+
private void parseTag(ChangeNotesCommit commit)
throws ConfigInvalidException {
tag = null;
@@ -866,13 +882,8 @@
missing.add(FOOTER_SUBJECT);
}
if (!missing.isEmpty()) {
- throw parseException("Missing footers: " + Joiner.on(", ")
- .join(Lists.transform(missing, new Function<FooterKey, String>() {
- @Override
- public String apply(FooterKey input) {
- return input.getName();
- }
- })));
+ throw parseException("Missing footers: "
+ + missing.stream().map(FooterKey::getName).collect(joining(", ")));
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesState.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesState.java
index 988184f..4abb8ac 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesState.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotesState.java
@@ -15,6 +15,7 @@
package com.google.gerrit.server.notedb;
import static com.google.common.base.Preconditions.checkNotNull;
+import static java.util.Comparator.comparing;
import com.google.auto.value.AutoValue;
import com.google.common.base.Strings;
@@ -33,7 +34,6 @@
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
import com.google.gerrit.server.ReviewerSet;
import com.google.gerrit.server.ReviewerStatusUpdate;
@@ -59,6 +59,7 @@
return new AutoValue_ChangeNotesState(
change.getId(),
null,
+ null,
ImmutableSet.<String>of(),
ImmutableSortedMap.<PatchSet.Id, PatchSet>of(),
ImmutableListMultimap.<PatchSet.Id, PatchSetApproval>of(),
@@ -84,6 +85,7 @@
@Nullable String originalSubject,
@Nullable String submissionId,
@Nullable Change.Status status,
+ @Nullable Account.Id assignee,
@Nullable Set<String> hashtags,
Map<PatchSet.Id, PatchSet> patchSets,
Multimap<PatchSet.Id, PatchSetApproval> approvals,
@@ -111,8 +113,9 @@
originalSubject,
submissionId,
status),
+ assignee,
ImmutableSet.copyOf(hashtags),
- ImmutableSortedMap.copyOf(patchSets, ReviewDbUtil.intKeyOrdering()),
+ ImmutableSortedMap.copyOf(patchSets, comparing(PatchSet.Id::get)),
ImmutableListMultimap.copyOf(approvals),
reviewers,
ImmutableList.copyOf(allPastReviewers),
@@ -153,6 +156,7 @@
@Nullable abstract ChangeColumns columns();
// Other related to this Change.
+ @Nullable abstract Account.Id assignee();
abstract ImmutableSet<String> hashtags();
abstract ImmutableSortedMap<PatchSet.Id, PatchSet> patchSets();
abstract ImmutableListMultimap<PatchSet.Id, PatchSetApproval> approvals();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeUpdate.java
index 426569e..39ca57c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeUpdate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeUpdate.java
@@ -19,6 +19,7 @@
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
+import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_ASSIGNEE;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_BRANCH;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_CHANGE_ID;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_COMMIT;
@@ -32,6 +33,7 @@
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_SUBMITTED_WITH;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TAG;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_TOPIC;
+import static java.util.Comparator.comparing;
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
import com.google.common.annotations.VisibleForTesting;
@@ -48,7 +50,6 @@
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RevId;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.config.AnonymousCowardName;
@@ -56,6 +57,7 @@
import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.util.LabelVote;
import com.google.gerrit.server.util.RequestId;
+import com.google.gwtorm.client.IntKey;
import com.google.gwtorm.server.OrmException;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
@@ -122,6 +124,7 @@
private String submissionId;
private String topic;
private String commit;
+ private Account.Id assignee;
private Set<String> hashtags;
private String changeMessage;
private String tag;
@@ -173,7 +176,7 @@
private static Table<String, Account.Id, Optional<Short>> approvals(
Comparator<String> nameComparator) {
- return TreeBasedTable.create(nameComparator, ReviewDbUtil.intKeyOrdering());
+ return TreeBasedTable.create(nameComparator, comparing(IntKey::get));
}
@AssistedInject
@@ -379,6 +382,10 @@
this.hashtags = hashtags;
}
+ public void setAssignee(Account.Id assignee) {
+ this.assignee = assignee;
+ }
+
public Map<Account.Id, ReviewerStateInternal> getReviewers() {
return reviewers;
}
@@ -547,6 +554,11 @@
addFooter(msg, FOOTER_COMMIT, commit);
}
+ if (assignee != null) {
+ addFooter(msg, FOOTER_ASSIGNEE);
+ addIdent(msg, assignee).append('\n');
+ }
+
Joiner comma = Joiner.on(',');
if (hashtags != null) {
addFooter(msg, FOOTER_HASHTAGS, comma.join(hashtags));
@@ -647,6 +659,7 @@
&& status == null
&& submissionId == null
&& submitRecords == null
+ && assignee == null
&& hashtags == null
&& topic == null
&& commit == null
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/GwtormChangeBundleReader.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/GwtormChangeBundleReader.java
new file mode 100644
index 0000000..e401a52
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/GwtormChangeBundleReader.java
@@ -0,0 +1,53 @@
+// 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.notedb;
+
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.notedb.ChangeBundle.Source;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import java.util.List;
+
+@Singleton
+public class GwtormChangeBundleReader implements ChangeBundleReader {
+ @Inject
+ GwtormChangeBundleReader() {
+ }
+
+ @Override
+ public ChangeBundle fromReviewDb(ReviewDb db, Change.Id id)
+ throws OrmException {
+ db.changes().beginTransaction(id);
+ try {
+ List<PatchSetApproval> approvals =
+ db.patchSetApprovals().byChange(id).toList();
+ return new ChangeBundle(
+ db.changes().get(id),
+ db.changeMessages().byChange(id),
+ db.patchSets().byChange(id),
+ approvals,
+ db.patchComments().byChange(id),
+ ReviewerSet.fromApprovals(approvals),
+ Source.REVIEW_DB);
+ } finally {
+ db.rollback();
+ }
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbChangeState.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbChangeState.java
index a56d02a..4aed71e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbChangeState.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbChangeState.java
@@ -18,6 +18,7 @@
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.gerrit.reviewdb.client.RefNames.changeMetaRef;
import static com.google.gerrit.reviewdb.client.RefNames.refsDraftComments;
+import static java.util.Comparator.comparing;
import com.google.auto.value.AutoValue;
import com.google.common.annotations.VisibleForTesting;
@@ -30,7 +31,6 @@
import com.google.gerrit.common.Nullable;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.server.ReviewDbUtil;
import com.google.gerrit.server.git.RefCache;
import org.eclipse.jgit.lib.ObjectId;
@@ -163,7 +163,7 @@
public static String toString(ObjectId changeMetaId,
Map<Account.Id, ObjectId> draftIds) {
List<Account.Id> accountIds = Lists.newArrayList(draftIds.keySet());
- Collections.sort(accountIds, ReviewDbUtil.intKeyOrdering());
+ Collections.sort(accountIds, comparing(Account.Id::get));
StringBuilder sb = new StringBuilder(changeMetaId.name());
for (Account.Id id : accountIds) {
sb.append(',')
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNote.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNote.java
index d93336a..4c9f702 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNote.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNote.java
@@ -83,7 +83,7 @@
if (isJson(raw, p.value)) {
RevisionNoteData data = parseJson(noteUtil, p.value);
- comments = data.exportComments(status);
+ comments = data.exportComments(changeId, status);
if (status == PatchLineComment.Status.PUBLISHED) {
pushCert = data.pushCert;
} else {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java
index af463d7..be0a689 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteBuilder.java
@@ -17,10 +17,9 @@
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.gerrit.server.PatchLineCommentsUtil.PLC_ORDER;
import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toList;
-import com.google.common.base.Function;
import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.FluentIterable;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.gerrit.reviewdb.client.PatchLineComment;
@@ -134,13 +133,10 @@
}
RevisionNoteData data = new RevisionNoteData();
- data.comments = FluentIterable.from(PLC_ORDER.sortedCopy(comments.values()))
- .transform(new Function<PatchLineComment, RevisionNoteData.Comment>() {
- @Override
- public RevisionNoteData.Comment apply(PatchLineComment plc) {
- return new RevisionNoteData.Comment(plc, noteUtil.getServerId());
- }
- }).toList();
+ data.comments = comments.values().stream()
+ .sorted(PLC_ORDER)
+ .map(plc -> new RevisionNoteData.Comment(plc, noteUtil.getServerId()))
+ .collect(toList());
data.pushCert = pushCert;
try (OutputStreamWriter osw = new OutputStreamWriter(out)) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteData.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteData.java
index f4c7d8a..73083b7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteData.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/RevisionNoteData.java
@@ -14,9 +14,9 @@
package com.google.gerrit.server.notedb;
-import com.google.common.base.Function;
+import static java.util.stream.Collectors.toList;
+
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Patch;
@@ -48,19 +48,17 @@
String uuid;
String filename;
int patchSetId;
- int changeId;
CommentKey(PatchLineComment.Key k) {
uuid = k.get();
filename = k.getParentKey().getFileName();
patchSetId = k.getParentKey().getParentKey().get();
- changeId = k.getParentKey().getParentKey().getParentKey().get();
}
- PatchLineComment.Key export() {
+ PatchLineComment.Key export(Change.Id changeId) {
return new PatchLineComment.Key(
new Patch.Key(
- new PatchSet.Id(new Change.Id(changeId), patchSetId),
+ new PatchSet.Id(changeId, patchSetId),
filename),
uuid);
}
@@ -90,7 +88,6 @@
int lineNbr;
Identity author;
Timestamp writtenOn;
- char status;
short side;
String message;
String parentUuid;
@@ -99,12 +96,11 @@
String revId;
String serverId;
- public Comment(PatchLineComment plc, String serverId) {
+ Comment(PatchLineComment plc, String serverId) {
key = new CommentKey(plc.getKey());
lineNbr = plc.getLine();
author = new Identity(plc.getAuthor());
writtenOn = plc.getWrittenOn();
- status = plc.getStatus().getCode();
side = plc.getSide();
message = plc.getMessage();
parentUuid = plc.getParentUuid();
@@ -114,17 +110,18 @@
this.serverId = serverId;
}
- PatchLineComment export() {
+ PatchLineComment export(Change.Id changeId,
+ PatchLineComment.Status status) {
PatchLineComment plc = new PatchLineComment(
- key.export(), lineNbr, author.export(), parentUuid, writtenOn);
+ key.export(changeId), lineNbr, author.export(), parentUuid, writtenOn);
plc.setSide(side);
- plc.setStatus(PatchLineComment.Status.forCode(status));
plc.setMessage(message);
if (range != null) {
plc.setRange(range.export());
}
plc.setTag(tag);
plc.setRevId(new RevId(revId));
+ plc.setStatus(status);
return plc;
}
}
@@ -133,16 +130,12 @@
String pushCert;
List<Comment> comments;
- ImmutableList<PatchLineComment> exportComments(
- final PatchLineComment.Status status) {
+
+ ImmutableList<PatchLineComment> exportComments(Change.Id changeId,
+ PatchLineComment.Status status) {
return ImmutableList.copyOf(
- Lists.transform(comments, new Function<Comment, PatchLineComment>() {
- @Override
- public PatchLineComment apply(Comment c) {
- PatchLineComment plc = c.export();
- plc.setStatus(status);
- return plc;
- }
- }));
+ comments.stream()
+ .map(c -> c.export(changeId, status))
+ .collect(toList()));
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeMessageEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeMessageEvent.java
index a990e19..bc8af82 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeMessageEvent.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeMessageEvent.java
@@ -31,11 +31,6 @@
private static final Pattern TOPIC_REMOVED_REGEXP =
Pattern.compile("^Topic (.+) removed$");
- private static final Pattern STATUS_ABANDONED_REGEXP =
- Pattern.compile("^Abandoned(\n.*)*$");
- private static final Pattern STATUS_RESTORED_REGEXP =
- Pattern.compile("^Restored(\n.*)*$");
-
private final ChangeMessage message;
private final Change noteDbChange;
@@ -57,7 +52,6 @@
checkUpdate(update);
update.setChangeMessage(message.getMessage());
setTopic(update);
- setStatus(update);
}
private void setTopic(ChangeUpdate update) {
@@ -86,21 +80,4 @@
noteDbChange.setTopic(null);
}
}
-
- private void setStatus(ChangeUpdate update) {
- String msg = message.getMessage();
- if (msg == null) {
- return;
- }
- if (STATUS_ABANDONED_REGEXP.matcher(msg).matches()) {
- update.setStatus(Change.Status.ABANDONED);
- noteDbChange.setStatus(Change.Status.ABANDONED);
- return;
- }
-
- if (STATUS_RESTORED_REGEXP.matcher(msg).matches()) {
- update.setStatus(Change.Status.NEW);
- noteDbChange.setStatus(Change.Status.NEW);
- }
- }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java
index 53d746e..3d240c6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java
@@ -21,14 +21,14 @@
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_HASHTAGS;
import static com.google.gerrit.server.notedb.ChangeNoteUtil.FOOTER_PATCH_SET;
import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.toList;
import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
@@ -53,6 +53,7 @@
import com.google.gerrit.server.config.AnonymousCowardName;
import com.google.gerrit.server.git.ChainedReceiveCommands;
import com.google.gerrit.server.notedb.ChangeBundle;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
import com.google.gerrit.server.notedb.ChangeDraftUpdate;
import com.google.gerrit.server.notedb.ChangeNoteUtil;
import com.google.gerrit.server.notedb.ChangeUpdate;
@@ -91,6 +92,7 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.Set;
@@ -116,6 +118,7 @@
static final long MAX_DELTA_MS = SECONDS.toMillis(1);
private final AccountCache accountCache;
+ private final ChangeBundleReader bundleReader;
private final ChangeDraftUpdate.Factory draftUpdateFactory;
private final ChangeNoteUtil changeNoteUtil;
private final ChangeUpdate.Factory updateFactory;
@@ -129,6 +132,7 @@
@Inject
ChangeRebuilderImpl(SchemaFactory<ReviewDb> schemaFactory,
AccountCache accountCache,
+ ChangeBundleReader bundleReader,
ChangeDraftUpdate.Factory draftUpdateFactory,
ChangeNoteUtil changeNoteUtil,
ChangeUpdate.Factory updateFactory,
@@ -140,6 +144,7 @@
@AnonymousCowardName String anonymousCowardName) {
super(schemaFactory);
this.accountCache = accountCache;
+ this.bundleReader = bundleReader;
this.draftUpdateFactory = draftUpdateFactory;
this.changeNoteUtil = changeNoteUtil;
this.updateFactory = updateFactory;
@@ -162,7 +167,7 @@
}
try (NoteDbUpdateManager manager =
updateManagerFactory.create(change.getProject())) {
- buildUpdates(manager, ChangeBundle.fromReviewDb(db, changeId));
+ buildUpdates(manager, bundleReader.fromReviewDb(db, changeId));
return execute(db, changeId, manager);
}
}
@@ -186,7 +191,7 @@
}
NoteDbUpdateManager manager =
updateManagerFactory.create(change.getProject());
- buildUpdates(manager, ChangeBundle.fromReviewDb(db, changeId));
+ buildUpdates(manager, bundleReader.fromReviewDb(db, changeId));
manager.stage();
return manager;
}
@@ -267,7 +272,7 @@
new ChainedReceiveCommands(allUsersRepo));
for (Change.Id changeId : allChanges.get(project)) {
try {
- buildUpdates(manager, ChangeBundle.fromReviewDb(db, changeId));
+ buildUpdates(manager, bundleReader.fromReviewDb(db, changeId));
} catch (NoPatchSetsException e) {
log.warn(e.getMessage());
} catch (Throwable t) {
@@ -305,8 +310,8 @@
deleteDraftRefs(change, manager.getAllUsersRepo());
Integer minPsNum = getMinPatchSetNum(bundle);
- Set<PatchSet.Id> psIds =
- Sets.newHashSetWithExpectedSize(bundle.getPatchSets().size());
+ Map<PatchSet.Id, PatchSetEvent> patchSetEvents =
+ Maps.newHashMapWithExpectedSize(bundle.getPatchSets().size());
for (PatchSet ps : bundle.getPatchSets()) {
if (ps.getId().get() > currPsId.get()) {
@@ -315,14 +320,15 @@
ps.getId(), currPsId);
continue;
}
- psIds.add(ps.getId());
- events.add(new PatchSetEvent(
- change, ps, manager.getChangeRepo().rw));
+ PatchSetEvent pse =
+ new PatchSetEvent(change, ps, manager.getChangeRepo().rw);
+ patchSetEvents.put(ps.getId(), pse);
+ events.add(pse);
for (PatchLineComment c : getPatchLineComments(bundle, ps)) {
PatchLineCommentEvent e =
new PatchLineCommentEvent(c, change, ps, patchListCache);
if (c.getStatus() == Status.PUBLISHED) {
- events.add(e);
+ events.add(e.addDep(pse));
} else {
draftCommentEvents.put(c.getAuthor(), e);
}
@@ -330,8 +336,9 @@
}
for (PatchSetApproval psa : bundle.getPatchSetApprovals()) {
- if (psIds.contains(psa.getPatchSetId())) {
- events.add(new ApprovalEvent(psa, change.getCreatedOn()));
+ PatchSetEvent pse = patchSetEvents.get(psa.getPatchSetId());
+ if (pse != null) {
+ events.add(new ApprovalEvent(psa, change.getCreatedOn()).addDep(pse));
}
}
@@ -342,10 +349,16 @@
Change noteDbChange = new Change(null, null, null, null, null);
for (ChangeMessage msg : bundle.getChangeMessages()) {
- if (msg.getPatchSetId() == null || psIds.contains(msg.getPatchSetId())) {
- events.add(
- new ChangeMessageEvent(msg, noteDbChange, change.getCreatedOn()));
+ List<Event> msgEvents = parseChangeMessage(msg, change, noteDbChange);
+ if (msg.getPatchSetId() != null) {
+ PatchSetEvent pse = patchSetEvents.get(msg.getPatchSetId());
+ if (pse != null) {
+ for (Event e : msgEvents) {
+ e.addDep(pse);
+ }
+ }
}
+ events.addAll(msgEvents);
}
sortAndFillEvents(change, noteDbChange, events, minPsNum);
@@ -374,6 +387,18 @@
}
}
+ private List<Event> parseChangeMessage(ChangeMessage msg, Change change,
+ Change noteDbChange) {
+ List<Event> events = new ArrayList<>(2);
+ events.add(new ChangeMessageEvent(msg, noteDbChange, change.getCreatedOn()));
+ Optional<StatusChangeEvent> sce =
+ StatusChangeEvent.parseFromMessage(msg, change, noteDbChange);
+ if (sce.isPresent()) {
+ events.add(sce.get());
+ }
+ return events;
+ }
+
private static Integer getMinPatchSetNum(ChangeBundle bundle) {
Integer minPsNum = null;
for (PatchSet ps : bundle.getPatchSets()) {
@@ -387,19 +412,16 @@
private static List<PatchLineComment> getPatchLineComments(ChangeBundle bundle,
final PatchSet ps) {
- return FluentIterable.from(bundle.getPatchLineComments())
- .filter(new Predicate<PatchLineComment>() {
- @Override
- public boolean apply(PatchLineComment in) {
- return in.getPatchSetId().equals(ps.getId());
- }
- }).toSortedList(PatchLineCommentsUtil.PLC_ORDER);
+ return bundle.getPatchLineComments().stream()
+ .filter(c -> c.getPatchSetId().equals(ps.getId()))
+ .sorted(PatchLineCommentsUtil.PLC_ORDER)
+ .collect(toList());
}
private void sortAndFillEvents(Change change, Change noteDbChange,
List<Event> events, Integer minPsNum) {
- Collections.sort(events);
events.add(new FinalUpdatesEvent(change, noteDbChange));
+ new EventSorter(events).sort();
// Ensure the first event in the list creates the change, setting the author
// and any required footers.
@@ -410,23 +432,39 @@
events.add(0, new CreateChangeEvent(change, minPsNum));
}
- // Fill in any missing patch set IDs using the latest patch set of the
- // change at the time of the event, because NoteDb can't represent actions
- // with no associated patch set ID. This workaround is as if a user added a
- // ChangeMessage on the change by replying from the latest patch set.
+ // Final pass to correct some inconsistencies.
+ //
+ // First, fill in any missing patch set IDs using the latest patch set of
+ // the change at the time of the event, because NoteDb can't represent
+ // actions with no associated patch set ID. This workaround is as if a user
+ // added a ChangeMessage on the change by replying from the latest patch
+ // set.
//
// Start with the first patch set that actually exists. If there are no
// patch sets at all, minPsNum will be null, so just bail and use 1 as the
// patch set ID. The corresponding patch set won't exist, but this change is
// probably corrupt anyway, as deleting the last draft patch set should have
// deleted the whole change.
+ //
+ // Second, ensure timestamps are nondecreasing, by copying the previous
+ // timestamp if this happens. This assumes that the only way this can happen
+ // is due to dependency constraints, and it is ok to give an event the same
+ // timestamp as one of its dependencies.
int ps = firstNonNull(minPsNum, 1);
- for (Event e : events) {
+ for (int i = 0; i < events.size(); i++) {
+ Event e = events.get(i);
if (e.psId == null) {
e.psId = new PatchSet.Id(change.getId(), ps);
} else {
ps = Math.max(ps, e.psId.get());
}
+
+ if (i > 0) {
+ Event p = events.get(i - 1);
+ if (e.when.before(p.when)) {
+ e.when = p.when;
+ }
+ }
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/Event.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/Event.java
index 18ce302..b7b08b0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/Event.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/Event.java
@@ -28,6 +28,8 @@
import java.io.IOException;
import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Objects;
abstract class Event implements Comparable<Event> {
@@ -35,9 +37,10 @@
// hierarchy.
final Account.Id who;
- final Timestamp when;
final String tag;
final boolean predatesChange;
+ final List<Event> deps;
+ Timestamp when;
PatchSet.Id psId;
protected Event(PatchSet.Id psId, Account.Id who, Timestamp when,
@@ -48,6 +51,7 @@
// Truncate timestamps at the change's createdOn timestamp.
predatesChange = when.before(changeCreatedOn);
this.when = predatesChange ? changeCreatedOn : when;
+ deps = new ArrayList<>();
}
protected void checkUpdate(AbstractChangeUpdate update) {
@@ -62,6 +66,11 @@
who, update.getNullableAccountId());
}
+ Event addDep(Event e) {
+ deps.add(e);
+ return this;
+ }
+
/**
* @return whether this event type must be unique per {@link ChangeUpdate},
* i.e. there may be at most one of this type.
@@ -70,10 +79,6 @@
abstract void apply(ChangeUpdate update) throws OrmException, IOException;
- protected boolean isPatchSet() {
- return false;
- }
-
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
@@ -86,6 +91,7 @@
@Override
public int compareTo(Event other) {
return ComparisonChain.start()
+ .compareFalseFirst(this.isFinalUpdates(), other.isFinalUpdates())
.compare(this.when, other.when)
.compareTrueFirst(isPatchSet(), isPatchSet())
.compareTrueFirst(this.predatesChange, other.predatesChange)
@@ -94,4 +100,12 @@
ReviewDbUtil.intKeyOrdering().nullsLast())
.result();
}
+
+ private boolean isPatchSet() {
+ return this instanceof PatchSetEvent;
+ }
+
+ private boolean isFinalUpdates() {
+ return this instanceof FinalUpdatesEvent;
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventSorter.java
new file mode 100644
index 0000000..2ab4c00
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/EventSorter.java
@@ -0,0 +1,107 @@
+// 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.notedb.rebuild;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.SetMultimap;
+
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.List;
+
+/**
+ * Helper to sort a list of events.
+ * <p>
+ * Events are sorted in two passes:
+ * <ol>
+ * <li>Sort by natural order (timestamp, patch set, author, etc.)</li>
+ * <li>Postpone any events with dependencies to occur only after all of their
+ * dependencies, where this violates natural order.</li>
+ * </ol>
+ *
+ * {@link #sort()} modifies the event list in place (similar to {@link
+ * Collections#sort(List)}), but does not modify any event. In particular,
+ * events might end up out of order with respect to timestamp; callers are
+ * responsible for adjusting timestamps later if they prefer monotonicity.
+ */
+class EventSorter {
+ private final List<Event> out;
+ private final LinkedHashSet<Event> sorted;
+ private ListMultimap<Event, Event> waiting;
+ private SetMultimap<Event, Event> deps;
+
+ EventSorter(List<Event> events) {
+ LinkedHashSet<Event> all = new LinkedHashSet<>(events);
+ out = events;
+
+ for (Event e : events) {
+ for (Event d : e.deps) {
+ checkArgument(all.contains(d), "dep %s of %s not in input list", d, e);
+ }
+ }
+
+ all.clear();
+ sorted = all; // Presized.
+ }
+
+ void sort() {
+ // First pass: sort by natural order.
+ Collections.sort(out);
+
+ // Populate waiting map after initial sort to preserve natural order.
+ waiting = ArrayListMultimap.create();
+ deps = HashMultimap.create();
+ for (Event e : out) {
+ for (Event d : e.deps) {
+ deps.put(e, d);
+ waiting.put(d, e);
+ }
+ }
+
+ // Second pass: enforce dependencies.
+ int size = out.size();
+ for (Event e : out) {
+ process(e);
+ }
+ checkState(sorted.size() == size,
+ "event sort expected %s elements, got %s", size, sorted.size());
+
+ // Modify out in-place a la Collections#sort.
+ out.clear();
+ out.addAll(sorted);
+ }
+
+ void process(Event e) {
+ if (sorted.contains(e)) {
+ return;
+ }
+ // If all events that e depends on have been emitted:
+ // - e can be emitted.
+ // - remove e from the dependency set of all events waiting on e, and then
+ // re-process those events in case they can now be emitted.
+ if (deps.get(e).isEmpty()) {
+ sorted.add(e);
+ for (Event w : waiting.get(e)) {
+ deps.get(w).remove(e);
+ process(w);
+ }
+ }
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java
index 3080be7..4e82635 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java
@@ -46,7 +46,8 @@
// TODO(dborowitz): Stamp approximate approvals at this time.
update.fixStatus(change.getStatus());
}
- if (change.getSubmissionId() != null) {
+ if (change.getSubmissionId() != null
+ && noteDbChange.getSubmissionId() == null) {
update.setSubmissionId(change.getSubmissionId());
}
if (!update.isEmpty()) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchSetEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchSetEvent.java
index 5baddd3..c3fb267 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchSetEvent.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchSetEvent.java
@@ -66,11 +66,6 @@
}
}
- @Override
- protected boolean isPatchSet() {
- return true;
- }
-
private void setRevision(ChangeUpdate update, PatchSet ps)
throws IOException {
String rev = ps.getRevision().get();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/StatusChangeEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/StatusChangeEvent.java
new file mode 100644
index 0000000..29e0868
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/StatusChangeEvent.java
@@ -0,0 +1,90 @@
+// 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.notedb.rebuild;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.ChangeMessage;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gwtorm.server.OrmException;
+
+import java.sql.Timestamp;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+class StatusChangeEvent extends Event {
+ private static final ImmutableMap<Change.Status, Pattern> PATTERNS =
+ ImmutableMap.of(
+ Change.Status.ABANDONED, Pattern.compile("^Abandoned(\n.*)*$"),
+ Change.Status.MERGED, Pattern.compile(
+ "^Change has been successfully"
+ + " (merged|cherry-picked|rebased|pushed).*$"),
+ Change.Status.NEW, Pattern.compile("^Restored(\n.*)*$"));
+
+ static Optional<StatusChangeEvent> parseFromMessage(ChangeMessage message,
+ Change change, Change noteDbChange) {
+ String msg = message.getMessage();
+ if (msg == null) {
+ return Optional.absent();
+ }
+ for (Map.Entry<Change.Status, Pattern> e : PATTERNS.entrySet()) {
+ if (e.getValue().matcher(msg).matches()) {
+ return Optional.of(new StatusChangeEvent(
+ message, change, noteDbChange, e.getKey()));
+ }
+ }
+ return Optional.absent();
+ }
+
+ private final Change change;
+ private final Change noteDbChange;
+ private final Change.Status status;
+
+ private StatusChangeEvent(ChangeMessage message, Change change,
+ Change noteDbChange, Change.Status status) {
+ this(message.getPatchSetId(), message.getAuthor(),
+ message.getWrittenOn(), change, noteDbChange, message.getTag(),
+ status);
+ }
+
+ private StatusChangeEvent(PatchSet.Id psId, Account.Id author,
+ Timestamp when, Change change, Change noteDbChange,
+ String tag, Change.Status status) {
+ super(psId, author, when, change.getCreatedOn(), tag);
+ this.change = change;
+ this.noteDbChange = noteDbChange;
+ this.status = status;
+ }
+
+ @Override
+ boolean uniquePerUpdate() {
+ return true;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ void apply(ChangeUpdate update) throws OrmException {
+ checkUpdate(update);
+ update.fixStatus(status);
+ noteDbChange.setStatus(status);
+ if (status == Change.Status.MERGED) {
+ update.setSubmissionId(change.getSubmissionId());
+ noteDbChange.setSubmissionId(change.getSubmissionId());
+ }
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/ComparisonType.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/ComparisonType.java
new file mode 100644
index 0000000..abbb680
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/ComparisonType.java
@@ -0,0 +1,77 @@
+// 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.patch;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.gerrit.server.ioutil.BasicSerialization.readVarInt32;
+import static com.google.gerrit.server.ioutil.BasicSerialization.writeVarInt32;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class ComparisonType {
+
+ /** 1-based parent */
+ private final Integer parentNum;
+
+ private final boolean autoMerge;
+
+ public static ComparisonType againstOtherPatchSet() {
+ return new ComparisonType(null, false);
+ }
+
+ public static ComparisonType againstParent(int parentNum) {
+ return new ComparisonType(parentNum, false);
+ }
+
+ public static ComparisonType againstAutoMerge() {
+ return new ComparisonType(null, true);
+ }
+
+ private ComparisonType(Integer parentNum, boolean autoMerge) {
+ this.parentNum = parentNum;
+ this.autoMerge = autoMerge;
+ }
+
+ public boolean isAgainstParentOrAutoMerge() {
+ return isAgainstParent() || isAgainstAutoMerge();
+ }
+
+ public boolean isAgainstParent() {
+ return parentNum != null;
+ }
+
+ public boolean isAgainstAutoMerge() {
+ return autoMerge;
+ }
+
+ public int getParentNum() {
+ checkNotNull(parentNum);
+ return parentNum;
+ }
+
+ void writeTo(OutputStream out) throws IOException {
+ writeVarInt32(out, parentNum != null ? parentNum : 0);
+ writeVarInt32(out, autoMerge ? 1 : 0);
+ }
+
+ static ComparisonType readFrom(InputStream in) throws IOException {
+ int p = readVarInt32(in);
+ Integer parentNum = p > 0 ? p : null;
+ boolean autoMerge = readVarInt32(in) != 0;
+ return new ComparisonType(parentNum, autoMerge);
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/MergeListBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/MergeListBuilder.java
new file mode 100644
index 0000000..8f54e48
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/MergeListBuilder.java
@@ -0,0 +1,52 @@
+// 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.patch;
+
+import com.google.common.collect.ImmutableList;
+
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MergeListBuilder {
+ public static List<RevCommit> build(RevWalk rw, RevCommit merge,
+ int uninterestingParent) throws IOException {
+ rw.reset();
+ rw.parseBody(merge);
+ if (merge.getParentCount() < 2) {
+ return ImmutableList.of();
+ }
+
+ for (int parent = 0; parent < merge.getParentCount(); parent++) {
+ RevCommit parentCommit = merge.getParent(parent);
+ rw.parseBody(parentCommit);
+ if (parent == uninterestingParent - 1) {
+ rw.markUninteresting(parentCommit);
+ } else {
+ rw.markStart(parentCommit);
+ }
+ }
+
+ List<RevCommit> result = new ArrayList<>();
+ RevCommit c;
+ while ((c = rw.next()) != null) {
+ result.add(c);
+ }
+ return result;
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java
index f8c8b49..d2a6d2b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java
@@ -44,9 +44,8 @@
private Text a;
private Text b;
- public PatchFile(final Repository repo, final PatchList patchList,
- final String fileName) throws MissingObjectException,
- IncorrectObjectTypeException, IOException {
+ public PatchFile(Repository repo, PatchList patchList, String fileName)
+ throws MissingObjectException, IncorrectObjectTypeException, IOException {
this.repo = repo;
this.entry = patchList.get(fileName);
@@ -55,7 +54,7 @@
final RevCommit bCommit = rw.parseCommit(patchList.getNewId());
if (Patch.COMMIT_MSG.equals(fileName)) {
- if (patchList.isAgainstParent()) {
+ if (patchList.getComparisonType().isAgainstParentOrAutoMerge()) {
a = Text.EMPTY;
} else {
// For the initial commit, we have an empty tree on Side A
@@ -68,7 +67,16 @@
aTree = null;
bTree = null;
+ } else if (Patch.MERGE_LIST.equals(fileName)) {
+ // For the initial commit, we have an empty tree on Side A
+ RevObject object = rw.parseAny(patchList.getOldId());
+ a = object instanceof RevCommit
+ ? Text.forMergeList(patchList.getComparisonType(), reader, object)
+ : Text.EMPTY;
+ b = Text.forMergeList(patchList.getComparisonType(), reader, bCommit);
+ aTree = null;
+ bTree = null;
} else {
if (patchList.getOldId() != null) {
aTree = rw.parseTree(patchList.getOldId());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java
index 2a4afb3..2cfd007 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchList.java
@@ -58,16 +58,19 @@
@Nullable
private transient ObjectId oldId;
private transient ObjectId newId;
- private transient boolean againstParent;
+ private transient boolean isMerge;
+ private transient ComparisonType comparisonType;
private transient int insertions;
private transient int deletions;
private transient PatchListEntry[] patches;
- public PatchList(@Nullable final AnyObjectId oldId, final AnyObjectId newId,
- final boolean againstParent, final PatchListEntry[] patches) {
+ public PatchList(@Nullable AnyObjectId oldId, AnyObjectId newId,
+ boolean isMerge, ComparisonType comparisonType,
+ PatchListEntry[] patches) {
this.oldId = oldId != null ? oldId.copy() : null;
this.newId = newId.copy();
- this.againstParent = againstParent;
+ this.isMerge = isMerge;
+ this.comparisonType = comparisonType;
// We assume index 0 contains the magic commit message entry.
if (patches.length > 1) {
@@ -97,9 +100,9 @@
return Collections.unmodifiableList(Arrays.asList(patches));
}
- /** @return true if {@link #getOldId} is {@link #getNewId}'s ancestor. */
- public boolean isAgainstParent() {
- return againstParent;
+ /** @return the comparison type */
+ public ComparisonType getComparisonType() {
+ return comparisonType;
}
/** @return total number of new lines added. */
@@ -144,9 +147,12 @@
if (Patch.COMMIT_MSG.equals(fileName)) {
return 0;
}
+ if (isMerge && Patch.MERGE_LIST.equals(fileName)) {
+ return 1;
+ }
int high = patches.length;
- int low = 1;
+ int low = isMerge ? 2 : 1;
while (low < high) {
final int mid = (low + high) >>> 1;
final int cmp = patches[mid].getNewName().compareTo(fileName);
@@ -166,7 +172,8 @@
try (DeflaterOutputStream out = new DeflaterOutputStream(buf)) {
writeCanBeNull(out, oldId);
writeNotNull(out, newId);
- writeVarInt32(out, againstParent ? 1 : 0);
+ writeVarInt32(out, isMerge ? 1 : 0);
+ comparisonType.writeTo(out);
writeVarInt32(out, insertions);
writeVarInt32(out, deletions);
writeVarInt32(out, patches.length);
@@ -182,7 +189,8 @@
try (InflaterInputStream in = new InflaterInputStream(buf)) {
oldId = readCanBeNull(in);
newId = readNotNull(in);
- againstParent = readVarInt32(in) != 0;
+ isMerge = readVarInt32(in) != 0;
+ comparisonType = ComparisonType.readFrom(in);
insertions = readVarInt32(in);
deletions = readVarInt32(in);
final int cnt = readVarInt32(in);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java
index 43e3dce..22f7bf3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListKey.java
@@ -35,7 +35,7 @@
import java.util.Objects;
public class PatchListKey implements Serializable {
- public static final long serialVersionUID = 22L;
+ public static final long serialVersionUID = 24L;
public static final BiMap<Whitespace, Character> WHITESPACE_TYPES = ImmutableBiMap.of(
Whitespace.IGNORE_NONE, 'N',
@@ -138,6 +138,10 @@
n.append("..");
n.append(newId.name());
n.append(" ");
+ if (parentNum != null) {
+ n.append(parentNum);
+ n.append(" ");
+ }
n.append(whitespace.name());
n.append("]");
return n.toString();
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 2fa43bb..9616fc8 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
@@ -17,11 +17,10 @@
import static com.google.common.base.Preconditions.checkArgument;
import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toSet;
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
-import com.google.common.base.Function;
import com.google.common.base.Throwables;
-import com.google.common.collect.FluentIterable;
import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.Project;
@@ -70,6 +69,7 @@
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import java.util.stream.Stream;
public class PatchListLoader implements Callable<PatchList> {
static final Logger log = LoggerFactory.getLogger(PatchListLoader.class);
@@ -155,14 +155,19 @@
if (a == null) {
// TODO(sop) Remove this case.
- // This is a merge commit, compared to its ancestor.
+ // This is an octopus merge commit which should be compared against the
+ // auto-merge. However since we don't support computing the auto-merge
+ // for octopus merge commits, we fall back to diffing against the first
+ // parent, even though this wasn't what was requested.
//
- PatchListEntry[] entries = new PatchListEntry[1];
+ ComparisonType comparisonType = ComparisonType.againstParent(1);
+ PatchListEntry[] entries = new PatchListEntry[2];
entries[0] = newCommitMessage(cmp, reader, null, b);
- return new PatchList(a, b, true, entries);
+ entries[1] = newMergeList(cmp, reader, null, b, comparisonType);
+ return new PatchList(a, b, true, comparisonType, entries);
}
- boolean againstParent = isAgainstParent(a, b);
+ ComparisonType comparisonType = getComparisonType(a, b);
RevCommit aCommit = a instanceof RevCommit ? (RevCommit) a : null;
RevTree aTree = rw.parseTree(a);
@@ -179,22 +184,23 @@
key.getNewId(), key.getWhitespace());
PatchListKey oldKey = PatchListKey.againstDefaultBase(
key.getOldId(), key.getWhitespace());
- paths = FluentIterable
- .from(patchListCache.get(newKey, project).getPatches())
- .append(patchListCache.get(oldKey, project).getPatches())
- .transform(new Function<PatchListEntry, String>() {
- @Override
- public String apply(PatchListEntry entry) {
- return entry.getNewName();
- }
- })
- .toSet();
+ paths = Stream.concat(
+ patchListCache.get(newKey, project).getPatches().stream(),
+ patchListCache.get(oldKey, project).getPatches().stream())
+ .map(PatchListEntry::getNewName)
+ .collect(toSet());
}
int cnt = diffEntries.size();
List<PatchListEntry> entries = new ArrayList<>();
entries.add(newCommitMessage(cmp, reader,
- againstParent ? null : aCommit, b));
+ comparisonType.isAgainstParentOrAutoMerge() ? null : aCommit, b));
+ boolean isMerge = b.getParentCount() > 1;
+ if (isMerge) {
+ entries.add(newMergeList(cmp, reader,
+ comparisonType.isAgainstParentOrAutoMerge() ? null : aCommit, b,
+ comparisonType));
+ }
for (int i = 0; i < cnt; i++) {
DiffEntry e = diffEntries.get(i);
if (paths == null || paths.contains(e.getNewPath())
@@ -208,19 +214,23 @@
entries.add(newEntry(aTree, fh, newSize, newSize - oldSize));
}
}
- return new PatchList(a, b, againstParent,
+ return new PatchList(a, b, isMerge, comparisonType,
entries.toArray(new PatchListEntry[entries.size()]));
}
}
- private boolean isAgainstParent(RevObject a, RevCommit b) {
+ private ComparisonType getComparisonType(RevObject a, RevCommit b) {
for (int i = 0; i < b.getParentCount(); i++) {
if (b.getParent(i).equals(a)) {
- return true;
+ return ComparisonType.againstParent(i + 1);
}
}
- return false;
+ if (key.getOldId() == null && b.getParentCount() > 0) {
+ return ComparisonType.againstAutoMerge();
+ }
+
+ return ComparisonType.againstOtherPatchSet();
}
private static long getFileSize(ObjectReader reader,
@@ -282,32 +292,30 @@
return diffFormatter.toFileHeader(diffEntry);
}
- private PatchListEntry newCommitMessage(final RawTextComparator cmp,
- final ObjectReader reader,
- final RevCommit aCommit, final RevCommit bCommit) throws IOException {
- StringBuilder hdr = new StringBuilder();
-
- hdr.append("diff --git");
- if (aCommit != null) {
- hdr.append(" a/").append(Patch.COMMIT_MSG);
- } else {
- hdr.append(" ").append(FileHeader.DEV_NULL);
- }
- hdr.append(" b/").append(Patch.COMMIT_MSG);
- hdr.append("\n");
-
- if (aCommit != null) {
- hdr.append("--- a/").append(Patch.COMMIT_MSG).append("\n");
- } else {
- hdr.append("--- ").append(FileHeader.DEV_NULL).append("\n");
- }
- hdr.append("+++ b/").append(Patch.COMMIT_MSG).append("\n");
-
- Text aText =
- aCommit != null ? Text.forCommit(reader, aCommit) : Text.EMPTY;
+ private PatchListEntry newCommitMessage(RawTextComparator cmp,
+ ObjectReader reader, RevCommit aCommit, RevCommit bCommit)
+ throws IOException {
+ Text aText = aCommit != null
+ ? Text.forCommit(reader, aCommit)
+ : Text.EMPTY;
Text bText = Text.forCommit(reader, bCommit);
+ return createPatchListEntry(cmp, aCommit, aText, bText, Patch.COMMIT_MSG);
+ }
- byte[] rawHdr = hdr.toString().getBytes(UTF_8);
+ private PatchListEntry newMergeList(RawTextComparator cmp,
+ ObjectReader reader, RevCommit aCommit, RevCommit bCommit,
+ ComparisonType comparisonType) throws IOException {
+ Text aText = aCommit != null
+ ? Text.forMergeList(comparisonType, reader, aCommit)
+ : Text.EMPTY;
+ Text bText =
+ Text.forMergeList(comparisonType, reader, bCommit);
+ return createPatchListEntry(cmp, aCommit, aText, bText, Patch.MERGE_LIST);
+ }
+
+ private static PatchListEntry createPatchListEntry(RawTextComparator cmp,
+ RevCommit aCommit, Text aText, Text bText, String fileName) {
+ byte[] rawHdr = getRawHeader(aCommit != null, fileName);
byte[] aContent = aText.getContent();
byte[] bContent = bText.getContent();
long size = bContent.length;
@@ -319,6 +327,26 @@
return new PatchListEntry(fh, edits, size, sizeDelta);
}
+ private static byte[] getRawHeader(boolean hasA, String fileName) {
+ StringBuilder hdr = new StringBuilder();
+ hdr.append("diff --git");
+ if (hasA) {
+ hdr.append(" a/").append(fileName);
+ } else {
+ hdr.append(" ").append(FileHeader.DEV_NULL);
+ }
+ hdr.append(" b/").append(fileName);
+ hdr.append("\n");
+
+ if (hasA) {
+ hdr.append("--- a/").append(fileName).append("\n");
+ } else {
+ hdr.append("--- ").append(FileHeader.DEV_NULL).append("\n");
+ }
+ hdr.append("+++ b/").append(fileName).append("\n");
+ return hdr.toString().getBytes(UTF_8);
+ }
+
private PatchListEntry newEntry(RevTree aTree, FileHeader fileHeader,
long size, long sizeDelta) {
if (aTree == null // want combined diff
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
index e09d26f..7eee6a3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptBuilder.java
@@ -66,7 +66,7 @@
private ObjectReader reader;
private Change change;
private DiffPreferencesInfo diffPrefs;
- private boolean againstParent;
+ private ComparisonType comparisonType;
private ObjectId aId;
private ObjectId bId;
@@ -79,7 +79,8 @@
private int context;
@Inject
- PatchScriptBuilder(final FileTypeRegistry ftr, final PatchListCache plc) {
+ PatchScriptBuilder(FileTypeRegistry ftr,
+ PatchListCache plc) {
a = new Side();
b = new Side();
registry = ftr;
@@ -106,8 +107,8 @@
}
}
- void setTrees(final boolean ap, final ObjectId a, final ObjectId b) {
- againstParent = ap;
+ void setTrees(final ComparisonType ct, final ObjectId a, final ObjectId b) {
+ comparisonType = ct;
aId = a;
bId = b;
}
@@ -435,7 +436,8 @@
try {
final boolean reuse;
if (Patch.COMMIT_MSG.equals(path)) {
- if (againstParent && (aId == within || within.equals(aId))) {
+ if (comparisonType.isAgainstParentOrAutoMerge()
+ && (aId == within || within.equals(aId))) {
id = ObjectId.zeroId();
src = Text.EMPTY;
srcContent = Text.NO_BYTES;
@@ -453,7 +455,26 @@
}
}
reuse = false;
-
+ } else if (Patch.MERGE_LIST.equals(path)) {
+ if (comparisonType.isAgainstParentOrAutoMerge()
+ && (aId == within || within.equals(aId))) {
+ id = ObjectId.zeroId();
+ src = Text.EMPTY;
+ srcContent = Text.NO_BYTES;
+ mode = FileMode.MISSING;
+ displayMethod = DisplayMethod.NONE;
+ } else {
+ id = within;
+ src = Text.forMergeList(comparisonType, reader, within);
+ srcContent = src.getContent();
+ if (src == Text.EMPTY) {
+ mode = FileMode.MISSING;
+ displayMethod = DisplayMethod.NONE;
+ } else {
+ mode = FileMode.REGULAR_FILE;
+ }
+ }
+ reuse = false;
} else {
final TreeWalk tw = find(within);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java
index 754d995..91f8cf8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchScriptFactory.java
@@ -260,7 +260,7 @@
b.setRepository(git, project);
b.setChange(change);
b.setDiffPrefs(diffPrefs);
- b.setTrees(list.isAgainstParent(), list.getOldId(), list.getNewId());
+ b.setTrees(list.getComparisonType(), list.getOldId(), list.getNewId());
return b;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java
index 7982479..a84dd92 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/Text.java
@@ -87,6 +87,36 @@
}
}
+ public static Text forMergeList(ComparisonType comparisonType,
+ ObjectReader reader, AnyObjectId commitId) throws IOException {
+ try (RevWalk rw = new RevWalk(reader)) {
+ RevCommit c = rw.parseCommit(commitId);
+ StringBuilder b = new StringBuilder();
+ switch (c.getParentCount()) {
+ case 0:
+ break;
+ case 1: {
+ break;
+ }
+ default:
+ int uniterestingParent = comparisonType.isAgainstParent()
+ ? comparisonType.getParentNum()
+ : 1;
+
+ b.append("Merge List:\n\n");
+ for (RevCommit commit : MergeListBuilder.build(rw, c,
+ uniterestingParent)) {
+ b.append("* ");
+ b.append(reader.abbreviate(commit, 8).name());
+ b.append(" ");
+ b.append(commit.getShortMessage());
+ b.append("\n");
+ }
+ }
+ return new Text(b.toString().getBytes(UTF_8));
+ }
+ }
+
private static void appendPersonIdent(StringBuilder b, String field,
PersonIdent person) {
if (person != null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
index 1f612a3..be9bbad 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarScanner.java
@@ -17,7 +17,6 @@
import static com.google.common.base.MoreObjects.firstNonNull;
import static com.google.common.collect.Iterables.transform;
-import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicates;
import com.google.common.base.Strings;
@@ -59,15 +58,6 @@
public class JarScanner implements PluginContentScanner {
private static final int SKIP_ALL = ClassReader.SKIP_CODE
| ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES;
- private static final Function<ClassData, ExtensionMetaData> CLASS_DATA_TO_EXTENSION_META_DATA =
- new Function<ClassData, ExtensionMetaData>() {
- @Override
- public ExtensionMetaData apply(ClassData classData) {
- return new ExtensionMetaData(classData.className,
- classData.annotationValue);
- }
- };
-
private final JarFile jarFile;
public JarScanner(Path src) throws IOException {
@@ -128,8 +118,11 @@
Collection<ClassData> values =
firstNonNull(discoverdData, Collections.<ClassData> emptySet());
- result.put(annotoation,
- transform(values, CLASS_DATA_TO_EXTENSION_META_DATA));
+ result.put(
+ annotoation,
+ transform(
+ values,
+ cd -> new ExtensionMetaData(cd.className, cd.annotationValue)));
}
return result.build();
@@ -307,15 +300,12 @@
public Enumeration<PluginEntry> entries() {
return Collections.enumeration(Lists.transform(
Collections.list(jarFile.entries()),
- new Function<JarEntry, PluginEntry>() {
- @Override
- public PluginEntry apply(JarEntry jarEntry) {
- try {
- return resourceOf(jarEntry);
- } catch (IOException e) {
- throw new IllegalArgumentException("Cannot convert jar entry "
- + jarEntry + " to a resource", e);
- }
+ jarEntry -> {
+ try {
+ return resourceOf(jarEntry);
+ } catch (IOException e) {
+ throw new IllegalArgumentException("Cannot convert jar entry "
+ + jarEntry + " to a resource", e);
}
}));
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java
index cf38310..e89eb7d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/MultipleProvidersForPluginException.java
@@ -14,11 +14,10 @@
package com.google.gerrit.server.plugins;
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.collect.Iterables;
+import static java.util.stream.Collectors.joining;
import java.nio.file.Path;
+import java.util.stream.StreamSupport;
class MultipleProvidersForPluginException extends IllegalArgumentException {
private static final long serialVersionUID = 1L;
@@ -32,14 +31,8 @@
private static String providersListToString(
Iterable<ServerPluginProvider> providersHandlers) {
- Iterable<String> providerNames =
- Iterables.transform(providersHandlers,
- new Function<ServerPluginProvider, String>() {
- @Override
- public String apply(ServerPluginProvider provider) {
- return provider.getProviderPluginName();
- }
- });
- return Joiner.on(", ").join(providerNames);
+ return StreamSupport.stream(providersHandlers.spliterator(), false)
+ .map(ServerPluginProvider::getProviderPluginName)
+ .collect(joining(", "));
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
index e170510..5667003 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
@@ -17,7 +17,6 @@
import com.google.common.base.CharMatcher;
import com.google.common.base.Joiner;
import com.google.common.base.MoreObjects;
-import com.google.common.base.Predicate;
import com.google.common.base.Strings;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.ImmutableList;
@@ -720,12 +719,9 @@
private static Iterable<Path> filterDisabledPlugins(
Collection<Path> paths) {
- return Iterables.filter(paths, new Predicate<Path>() {
- @Override
- public boolean apply(Path p) {
- return !p.getFileName().toString().endsWith(".disabled");
- }
- });
+ return Iterables.filter(
+ paths,
+ p -> !p.getFileName().toString().endsWith(".disabled"));
}
public String getGerritPluginName(Path srcPath) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/BanCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/BanCommit.java
index f0c2b78..ce97a83 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/BanCommit.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/BanCommit.java
@@ -14,7 +14,6 @@
package com.google.gerrit.server.project;
-import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.gerrit.common.errors.PermissionDeniedException;
import com.google.gerrit.extensions.restapi.AuthException;
@@ -91,14 +90,7 @@
if (commits == null || commits.isEmpty()) {
return null;
}
-
- return Lists.transform(commits,
- new Function<ObjectId, String>() {
- @Override
- public String apply(ObjectId id) {
- return id.getName();
- }
- });
+ return Lists.transform(commits, ObjectId::getName);
}
public static class BanResultInfo {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java
index 5bc7f40..d18ee66 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java
@@ -352,6 +352,16 @@
return false;
}
+ /** Is this user assigned to this change? */
+ public boolean isAssignee() {
+ Account.Id currentAssignee = notes.getAssignee();
+ if (currentAssignee != null && getUser().isIdentifiedUser()) {
+ Account.Id id = getUser().getAccountId();
+ return id.equals(currentAssignee);
+ }
+ return false;
+ }
+
/** Is this user a reviewer for the change? */
public boolean isReviewer(ReviewDb db) throws OrmException {
return isReviewer(db, null);
@@ -414,6 +424,13 @@
return getRefControl().canForceEditTopicName();
}
+ public boolean canEditAssignee() {
+ return isOwner()
+ || getProjectControl().isOwner()
+ || getRefControl().canEditAssignee()
+ || isAssignee();
+ }
+
/** Can this user edit the hashtag name? */
public boolean canEditHashtags() {
return isOwner() // owner (aka creator) of the change can edit hashtags
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 64a5fb2..0f44a48 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
@@ -47,7 +47,7 @@
@Override
public FileResource parse(CommitResource parent, IdString id)
throws ResourceNotFoundException, IOException {
- if (Patch.COMMIT_MSG.equals(id.get())) {
+ if (Patch.isMagic(id.get())) {
return new FileResource(parent.getProject(), parent.getCommit(),
id.get());
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java
index b957ba1..8718a9b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetReflog.java
@@ -14,7 +14,6 @@
package com.google.gerrit.server.project;
-import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.gerrit.extensions.common.GitPerson;
import com.google.gerrit.extensions.restapi.AuthException;
@@ -89,8 +88,8 @@
limit > 0 ? r.getReverseEntries(limit) : r.getReverseEntries();
} else {
entries = limit > 0
- ? new ArrayList<ReflogEntry>(limit)
- : new ArrayList<ReflogEntry>();
+ ? new ArrayList<>(limit)
+ : new ArrayList<>();
for (ReflogEntry e : r.getReverseEntries()) {
Timestamp timestamp = new Timestamp(e.getWho().getWhen().getTime());
if ((from == null || from.before(timestamp)) &&
@@ -102,12 +101,7 @@
}
}
}
- return Lists.transform(entries, new Function<ReflogEntry, ReflogEntryInfo>() {
- @Override
- public ReflogEntryInfo apply(ReflogEntry e) {
- return new ReflogEntryInfo(e);
- }
- });
+ return Lists.transform(entries, ReflogEntryInfo::new);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
index bf17a37..1ea0c62 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListProjects.java
@@ -16,7 +16,6 @@
import static java.nio.charset.StandardCharsets.UTF_8;
-import com.google.common.base.Predicate;
import com.google.common.base.Strings;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
@@ -445,13 +444,8 @@
} else if (matchSubstring != null) {
checkMatchOptions(matchPrefix == null && matchRegex == null);
return Iterables.filter(projectCache.all(),
- new Predicate<Project.NameKey>() {
- @Override
- public boolean apply(Project.NameKey in) {
- return in.get().toLowerCase(Locale.US)
- .contains(matchSubstring.toLowerCase(Locale.US));
- }
- });
+ p -> p.get().toLowerCase(Locale.US)
+ .contains(matchSubstring.toLowerCase(Locale.US)));
} else if (matchRegex != null) {
checkMatchOptions(matchPrefix == null && matchSubstring == null);
RegexListSearcher<Project.NameKey> searcher;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
index 68d236e..f4ef129 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
@@ -17,7 +17,7 @@
import static com.google.gerrit.common.data.PermissionRule.Action.ALLOW;
import static java.nio.charset.StandardCharsets.UTF_8;
-import com.google.common.base.Function;
+import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -72,6 +72,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.function.Function;
/** Cached information on a project. */
public class ProjectState {
@@ -365,8 +366,8 @@
* from the immediate parent of this project and progresses up the
* hierarchy to All-Projects.
*/
- public Iterable<ProjectState> parents() {
- return Iterables.skip(tree(), 1);
+ public FluentIterable<ProjectState> parents() {
+ return FluentIterable.from(tree()).skip(1);
}
public boolean isAllProjects() {
@@ -378,75 +379,35 @@
}
public boolean isUseContributorAgreements() {
- return getInheritableBoolean(new Function<Project, InheritableBoolean>() {
- @Override
- public InheritableBoolean apply(Project input) {
- return input.getUseContributorAgreements();
- }
- });
+ return getInheritableBoolean(Project::getUseContributorAgreements);
}
public boolean isUseContentMerge() {
- return getInheritableBoolean(new Function<Project, InheritableBoolean>() {
- @Override
- public InheritableBoolean apply(Project input) {
- return input.getUseContentMerge();
- }
- });
+ return getInheritableBoolean(Project::getUseContentMerge);
}
public boolean isUseSignedOffBy() {
- return getInheritableBoolean(new Function<Project, InheritableBoolean>() {
- @Override
- public InheritableBoolean apply(Project input) {
- return input.getUseSignedOffBy();
- }
- });
+ return getInheritableBoolean(Project::getUseSignedOffBy);
}
public boolean isRequireChangeID() {
- return getInheritableBoolean(new Function<Project, InheritableBoolean>() {
- @Override
- public InheritableBoolean apply(Project input) {
- return input.getRequireChangeID();
- }
- });
+ return getInheritableBoolean(Project::getRequireChangeID);
}
public boolean isCreateNewChangeForAllNotInTarget() {
- return getInheritableBoolean(new Function<Project, InheritableBoolean>() {
- @Override
- public InheritableBoolean apply(Project input) {
- return input.getCreateNewChangeForAllNotInTarget();
- }
- });
+ return getInheritableBoolean(Project::getCreateNewChangeForAllNotInTarget);
}
public boolean isEnableSignedPush() {
- return getInheritableBoolean(new Function<Project, InheritableBoolean>() {
- @Override
- public InheritableBoolean apply(Project input) {
- return input.getEnableSignedPush();
- }
- });
+ return getInheritableBoolean(Project::getEnableSignedPush);
}
public boolean isRequireSignedPush() {
- return getInheritableBoolean(new Function<Project, InheritableBoolean>() {
- @Override
- public InheritableBoolean apply(Project input) {
- return input.getRequireSignedPush();
- }
- });
+ return getInheritableBoolean(Project::getRequireSignedPush);
}
public boolean isRejectImplicitMerges() {
- return getInheritableBoolean(new Function<Project, InheritableBoolean>() {
- @Override
- public InheritableBoolean apply(Project input) {
- return input.getRejectImplicitMerges();
- }
- });
+ return getInheritableBoolean(Project::getRejectImplicitMerges);
}
public LabelTypes getLabelTypes() {
@@ -551,7 +512,8 @@
return Files.exists(p) ? new String(Files.readAllBytes(p), UTF_8) : null;
}
- private boolean getInheritableBoolean(Function<Project, InheritableBoolean> func) {
+ private boolean getInheritableBoolean(
+ Function<Project, InheritableBoolean> func) {
for (ProjectState s : tree()) {
switch (func.apply(s.getProject())) {
case TRUE:
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java
index 0365855..3314309 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java
@@ -447,6 +447,10 @@
return canPerform(Permission.EDIT_HASHTAGS);
}
+ public boolean canEditAssignee() {
+ return canPerform(Permission.EDIT_ASSIGNEE);
+ }
+
/** @return true if this user can force edit topic names. */
public boolean canForceEditTopicName() {
return canForcePerform(Permission.EDIT_TOPIC_NAME);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java
index 01aacfb..cc215d2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java
@@ -17,7 +17,6 @@
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.MoreObjects;
-import com.google.common.base.Predicate;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.gerrit.extensions.restapi.AuthException;
@@ -124,13 +123,10 @@
+ " not found");
}
- if (Iterables.tryFind(parent.tree(), new Predicate<ProjectState>() {
- @Override
- public boolean apply(ProjectState input) {
- return input.getProject().getNameKey()
- .equals(ctl.getProject().getNameKey());
- }
- }).isPresent()) {
+ if (Iterables.tryFind(parent.tree(), p -> {
+ return p.getProject().getNameKey()
+ .equals(ctl.getProject().getNameKey());
+ }).isPresent()) {
throw new ResourceConflictException("cycle exists between "
+ ctl.getProject().getName() + " and "
+ parent.getProject().getName());
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..9f0bf89 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
@@ -16,7 +16,6 @@
import static com.google.common.base.Preconditions.checkArgument;
-import com.google.common.base.Function;
import com.google.common.base.Throwables;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
@@ -157,12 +156,7 @@
private Iterable<T> buffer(ResultSet<T> scanner) {
return FluentIterable.from(Iterables.partition(scanner, 50))
- .transformAndConcat(new Function<List<T>, List<T>>() {
- @Override
- public List<T> apply(List<T> buffer) {
- return transformBuffer(buffer);
- }
- });
+ .transformAndConcat(this::transformBuffer);
}
protected List<T> transformBuffer(List<T> buffer) throws OrmRuntimeException {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java
index 0288cb2..40fb3b6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java
@@ -14,7 +14,6 @@
package com.google.gerrit.server.query.account;
-import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.primitives.Ints;
@@ -124,13 +123,9 @@
public Predicate<AccountState> defaultQuery(String query) {
return Predicate.and(
- Lists.transform(Splitter.on(' ').omitEmptyStrings().splitToList(query),
- new Function<String, Predicate<AccountState>>() {
- @Override
- public Predicate<AccountState> apply(String s) {
- return defaultField(s);
- }
- }));
+ Lists.transform(
+ Splitter.on(' ').omitEmptyStrings().splitToList(query),
+ this::defaultField));
}
@Override
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 035f974..5560b86 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
@@ -599,7 +599,7 @@
r = new ArrayList<>(p.get().getPatches().size());
for (PatchListEntry e : p.get().getPatches()) {
- if (Patch.COMMIT_MSG.equals(e.getNewName())) {
+ if (Patch.isMagic(e.getNewName())) {
continue;
}
switch (e.getChangeType()) {
@@ -904,14 +904,11 @@
* @throws OrmException an error occurred reading the database.
*/
public Collection<PatchSet> visiblePatchSets() throws OrmException {
- Predicate<PatchSet> predicate = new Predicate<PatchSet>() {
- @Override
- public boolean apply(PatchSet input) {
- try {
- return changeControl().isPatchVisible(input, db);
- } catch (OrmException e) {
- return false;
- }
+ Predicate<PatchSet> predicate = ps -> {
+ try {
+ return changeControl().isPatchVisible(ps, db);
+ } catch (OrmException e) {
+ return false;
}
};
return FluentIterable.from(patchSets()).filter(predicate).toList();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
index d7c7730..f697d15 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
@@ -16,9 +16,9 @@
import static com.google.gerrit.reviewdb.client.Change.CHANGE_ID_PATTERN;
import static com.google.gerrit.server.query.change.ChangeData.asChanges;
+import static java.util.stream.Collectors.toSet;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
@@ -26,7 +26,6 @@
import com.google.common.primitives.Ints;
import com.google.gerrit.common.data.GroupReference;
import com.google.gerrit.common.errors.NotSignedInException;
-import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGroup;
@@ -632,14 +631,9 @@
// expand a group predicate into multiple user predicates
if (group != null) {
Set<Account.Id> allMembers =
- new HashSet<>(Lists.transform(
- args.listMembers.get().setRecursive(true).apply(group),
- new Function<AccountInfo, Account.Id>() {
- @Override
- public Account.Id apply(AccountInfo accountInfo) {
- return new Account.Id(accountInfo._accountId);
- }
- }));
+ args.listMembers.get().setRecursive(true).apply(group).stream()
+ .map(a -> new Account.Id(a._accountId))
+ .collect(toSet());
int maxLimit = args.indexConfig.maxLimit();
if (allMembers.size() > maxLimit) {
// limit the number of query terms otherwise Gerrit will barf
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HasDraftByLegacyPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HasDraftByLegacyPredicate.java
index 45a00c6..d2f6876 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HasDraftByLegacyPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HasDraftByLegacyPredicate.java
@@ -16,7 +16,6 @@
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.server.query.change.ChangeQueryBuilder.Arguments;
import com.google.gwtorm.server.ListResultSet;
import com.google.gwtorm.server.OrmException;
@@ -50,9 +49,9 @@
@Override
public ResultSet<ChangeData> read() throws OrmException {
Set<Change.Id> ids = new HashSet<>();
- for (PatchLineComment sc :
- args.plcUtil.draftByAuthor(args.db.get(), accountId)) {
- ids.add(sc.getKey().getParentKey().getParentKey().getParentKey());
+ for (Change.Id changeId : args.plcUtil
+ .changesWithDraftsByAuthor(args.db.get(), accountId)) {
+ ids.add(changeId);
}
List<ChangeData> r = new ArrayList<>(ids.size());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
index 5b1b1c6..a1f0dc8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/InternalChangeQuery.java
@@ -22,7 +22,6 @@
import static com.google.gerrit.server.query.change.ChangeStatusPredicate.open;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
@@ -152,6 +151,14 @@
open()));
}
+ public List<ChangeData> byBranchNew(Branch.NameKey branch)
+ throws OrmException {
+ return query(and(
+ ref(branch),
+ project(branch.getParentKey()),
+ status(Change.Status.NEW)));
+ }
+
public Iterable<ChangeData> byCommitsOnBranchNotMerged(Repository repo,
ReviewDb db, Branch.NameKey branch, Collection<String> hashes)
throws OrmException, IOException {
@@ -191,20 +198,14 @@
}
}
- return Lists.transform(notesFactory.create(db, branch.getParentKey(),
- changeIds, new com.google.common.base.Predicate<ChangeNotes>() {
- @Override
- public boolean apply(ChangeNotes notes) {
- Change c = notes.getChange();
+ List<ChangeNotes> notes = notesFactory.create(
+ db, branch.getParentKey(), changeIds,
+ cn -> {
+ Change c = cn.getChange();
return c.getDest().equals(branch)
&& c.getStatus() != Change.Status.MERGED;
- }
- }), new Function<ChangeNotes, ChangeData>() {
- @Override
- public ChangeData apply(ChangeNotes notes) {
- return changeDataFactory.create(db, notes);
- }
});
+ return Lists.transform(notes, n -> changeDataFactory.create(db, n));
}
private Iterable<ChangeData> byCommitsOnBranchNotMergedFromIndex(
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DatabaseModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DatabaseModule.java
index 9dee9f5..a2046b5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DatabaseModule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DatabaseModule.java
@@ -18,6 +18,8 @@
import com.google.gerrit.extensions.config.FactoryModule;
import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
+import com.google.gerrit.server.notedb.GwtormChangeBundleReader;
import com.google.gwtorm.jdbc.Database;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.Key;
@@ -37,5 +39,6 @@
.to(database)
.in(SINGLETON);
bind(database).toProvider(ReviewDbDatabaseProvider.class);
+ bind(ChangeBundleReader.class).to(GwtormChangeBundleReader.class);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java
index 53ed5ac..2d9714f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ProjectConfigSchemaUpdate.java
@@ -15,9 +15,8 @@
package com.google.gerrit.server.schema;
import static com.google.gerrit.server.git.ProjectConfig.ACCESS;
+import static java.util.stream.Collectors.toList;
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.git.MetaDataUpdate;
@@ -67,18 +66,16 @@
Set<String> names = config.getNames(ACCESS, subsection);
if (names.contains(name)) {
List<String> values =
- Arrays.asList(config.getStringList(ACCESS, subsection, name));
- values = Lists.transform(values, new Function<String, String>() {
- @Override
- public String apply(String ruleString) {
- PermissionRule rule = PermissionRule.fromString(ruleString, false);
- if (rule.getForce()) {
- rule.setForce(false);
- updated = true;
- }
- return rule.asString(false);
- }
- });
+ Arrays.stream(config.getStringList(ACCESS, subsection, name))
+ .map(r -> {
+ PermissionRule rule = PermissionRule.fromString(r, false);
+ if (rule.getForce()) {
+ rule.setForce(false);
+ updated = true;
+ }
+ return rule.asString(false);
+ })
+ .collect(toList());
config.setStringList(ACCESS, subsection, name, values);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_124.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_124.java
index 16f0bcf..895c905 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_124.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_124.java
@@ -14,7 +14,8 @@
package com.google.gerrit.server.schema;
-import com.google.common.base.Function;
+import static java.util.Comparator.comparing;
+
import com.google.common.base.Strings;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
@@ -124,13 +125,7 @@
private Collection<AccountSshKey> fixInvalidSequenceNumbers(
Collection<AccountSshKey> keys) {
- Ordering<AccountSshKey> o =
- Ordering.natural().onResultOf(new Function<AccountSshKey, Integer>() {
- @Override
- public Integer apply(AccountSshKey sshKey) {
- return sshKey.getKey().get();
- }
- });
+ Ordering<AccountSshKey> o = Ordering.from(comparing(k -> k.getKey().get()));
List<AccountSshKey> fixedKeys = new ArrayList<>(keys);
AccountSshKey minKey = o.min(keys);
while (minKey.getKey().get() <= 0) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java
index 0a99a8a..bbc97df 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/RegexListSearcher.java
@@ -17,7 +17,6 @@
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.Function;
-import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -94,12 +93,7 @@
return Iterables.filter(
list.subList(begin, end),
- new Predicate<T>() {
- @Override
- public boolean apply(T in) {
- return pattern.run(RegexListSearcher.this.apply(in));
- }
- });
+ x -> pattern.run(apply(x)));
}
public boolean hasMatch(List<T> list) {
diff --git a/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java b/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java
index 1dbdb68..a855868 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_commit_stats_3.java
@@ -14,8 +14,10 @@
package gerrit;
+import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.rules.StoredValues;
import com.google.gerrit.server.patch.PatchList;
+import com.google.gerrit.server.patch.PatchListEntry;
import com.googlecode.prolog_cafe.exceptions.PrologException;
import com.googlecode.prolog_cafe.lang.IntegerTerm;
@@ -24,6 +26,8 @@
import com.googlecode.prolog_cafe.lang.Prolog;
import com.googlecode.prolog_cafe.lang.Term;
+import java.util.List;
+
/**
* Exports basic commit statistics.
*
@@ -48,7 +52,11 @@
Term a3 = arg3.dereference();
PatchList pl = StoredValues.PATCH_LIST.get(engine);
- if (!a1.unify(new IntegerTerm(pl.getPatches().size() - 1),engine.trail)) { //Account for /COMMIT_MSG.
+ // Account for magic files
+ if (!a1.unify(
+ new IntegerTerm(
+ pl.getPatches().size() - countMagicFiles(pl.getPatches())),
+ engine.trail)) {
return engine.fail();
}
if (!a2.unify(new IntegerTerm(pl.getInsertions()),engine.trail)) {
@@ -59,4 +67,14 @@
}
return cont;
}
+
+ private int countMagicFiles(List<PatchListEntry> entries) {
+ int count = 0;
+ for (PatchListEntry e : entries) {
+ if (Patch.isMagic(e.getNewName())) {
+ count++;
+ }
+ }
+ return count;
+ }
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/RepositoryConfigTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/RepositoryConfigTest.java
index bf36738..222fb14 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/config/RepositoryConfigTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/config/RepositoryConfigTest.java
@@ -145,6 +145,7 @@
RepositoryConfig.OWNER_GROUP_NAME, ownerGroups);
}
+ @SuppressWarnings("cast")
@Test
public void testBasePathWhenNotConfigured() {
assertThat((Object)repoCfg.getBasePath(new NameKey("someProject"))).isNull();
@@ -158,6 +159,7 @@
.isEqualTo(basePath);
}
+ @SuppressWarnings("cast")
@Test
public void testBasePathForSpecificFilter() {
String basePath = "/someAbsolutePath/someDirectory";
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeBundleTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeBundleTest.java
index 054a82b..97bf864 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeBundleTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeBundleTest.java
@@ -1260,7 +1260,9 @@
}
private static List<PatchSet> latest(Change c) {
- return ImmutableList.of(new PatchSet(c.currentPatchSetId()));
+ PatchSet ps = new PatchSet(c.currentPatchSetId());
+ ps.setCreatedOn(c.getLastUpdatedOn());
+ return ImmutableList.of(ps);
}
private static List<PatchSetApproval> approvals(PatchSetApproval... ents) {
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
index 6993f5b..7a1dbf7 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java
@@ -24,7 +24,6 @@
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
import static org.junit.Assert.fail;
-import com.google.common.base.Function;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
@@ -34,7 +33,6 @@
import com.google.common.collect.Iterables;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
-import com.google.common.collect.Ordering;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.common.data.SubmitRecord;
import com.google.gerrit.reviewdb.client.Account;
@@ -47,8 +45,10 @@
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.RevId;
+import com.google.gerrit.reviewdb.server.ReviewDbUtil;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.ReviewerSet;
+import com.google.gerrit.server.config.GerritServerId;
import com.google.gerrit.server.notedb.ChangeNotesCommit.ChangeNotesRevWalk;
import com.google.gerrit.server.util.RequestId;
import com.google.gerrit.testutil.TestChanges;
@@ -79,6 +79,9 @@
@Inject
private ChangeNoteUtil noteUtil;
+ @Inject
+ private @GerritServerId String serverId;
+
@Test
public void tagChangeMessage() throws Exception {
String tag = "jenkins";
@@ -377,13 +380,9 @@
update.commit();
ChangeNotes notes = newNotes(c);
- List<PatchSetApproval> approvals = Ordering.natural().onResultOf(
- new Function<PatchSetApproval, Integer>() {
- @Override
- public Integer apply(PatchSetApproval in) {
- return in.getAccountId().get();
- }
- }).sortedCopy(notes.getApprovals().get(c.currentPatchSetId()));
+ List<PatchSetApproval> approvals = ReviewDbUtil.intKeyOrdering()
+ .onResultOf(PatchSetApproval::getAccountId)
+ .sortedCopy(notes.getApprovals().get(c.currentPatchSetId()));
assertThat(approvals).hasSize(2);
assertThat(approvals.get(0).getAccountId())
@@ -562,6 +561,47 @@
}
@Test
+ public void assigneeCommit() throws Exception {
+ Change c = newChange();
+ ChangeUpdate update = newUpdate(c, changeOwner);
+ update.setAssignee(otherUserId);
+ ObjectId result = update.commit();
+ assertThat(result).isNotNull();
+ try (RevWalk rw = new RevWalk(repo)) {
+ RevCommit commit = rw.parseCommit(update.getResult());
+ rw.parseBody(commit);
+ String strIdent =
+ otherUser.getName()
+ + " <"
+ + otherUserId
+ + "@"
+ + serverId
+ + ">";
+ assertThat(commit.getFullMessage())
+ .contains("Assignee: " + strIdent);
+ }
+ }
+
+ @Test
+ public void assigneeChangeNotes() throws Exception {
+ Change c = newChange();
+ ChangeUpdate update = newUpdate(c, changeOwner);
+ update.setAssignee(otherUserId);
+ update.commit();
+
+ ChangeNotes notes = newNotes(c);
+ assertThat(notes.getAssignee()).isEqualTo(otherUserId);
+
+ update = newUpdate(c, changeOwner);
+ update.setAssignee(changeOwner.getAccountId());
+ update.commit();
+
+ notes = newNotes(c);
+ assertThat(notes.getAssignee()).isEqualTo(changeOwner.getAccountId());
+
+ }
+
+ @Test
public void hashtagCommit() throws Exception {
Change c = newChange();
ChangeUpdate update = newUpdate(c, changeOwner);
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java
new file mode 100644
index 0000000..969adf0
--- /dev/null
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/rebuild/EventSorterTest.java
@@ -0,0 +1,177 @@
+// 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.notedb.rebuild;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+
+import com.google.common.collect.Lists;
+import com.google.gerrit.common.TimeUtil;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.notedb.ChangeUpdate;
+import com.google.gerrit.testutil.TestTimeUtil;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public class EventSorterTest {
+ private class TestEvent extends Event {
+ protected TestEvent(Timestamp when) {
+ super(
+ new PatchSet.Id(new Change.Id(1), 1),
+ new Account.Id(1000),
+ when, changeCreatedOn, null);
+ }
+
+ @Override
+ boolean uniquePerUpdate() {
+ return false;
+ }
+
+ @Override
+ void apply(ChangeUpdate update) {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ private Timestamp changeCreatedOn;
+
+ @Before
+ public void setUp() {
+ TestTimeUtil.resetWithClockStep(10, TimeUnit.SECONDS);
+ changeCreatedOn = TimeUtil.nowTs();
+ }
+
+ @Test
+ public void naturalSort() {
+ Event e1 = new TestEvent(TimeUtil.nowTs());
+ Event e2 = new TestEvent(TimeUtil.nowTs());
+ Event e3 = new TestEvent(TimeUtil.nowTs());
+
+ List<Event> events = events(e2, e1, e3);
+ new EventSorter(events).sort();
+ assertThat(events).containsExactly(e1, e2, e3).inOrder();
+ }
+
+ @Test
+ public void topoSortNoChange() {
+ Event e1 = new TestEvent(TimeUtil.nowTs());
+ Event e2 = new TestEvent(TimeUtil.nowTs());
+ Event e3 = new TestEvent(TimeUtil.nowTs());
+ e2.addDep(e1);
+
+ List<Event> events = events(e2, e1, e3);
+ new EventSorter(events).sort();
+ assertThat(events).containsExactly(e1, e2, e3).inOrder();
+ }
+
+ @Test
+ public void topoSortOneDep() {
+ Event e1 = new TestEvent(TimeUtil.nowTs());
+ Event e2 = new TestEvent(TimeUtil.nowTs());
+ Event e3 = new TestEvent(TimeUtil.nowTs());
+ e1.addDep(e2);
+
+ List<Event> events = events(e2, e3, e1);
+ new EventSorter(events).sort();
+ assertThat(events).containsExactly(e2, e1, e3).inOrder();
+ }
+
+ @Test
+ public void topoSortChainOfDeps() {
+ Event e1 = new TestEvent(TimeUtil.nowTs());
+ Event e2 = new TestEvent(TimeUtil.nowTs());
+ Event e3 = new TestEvent(TimeUtil.nowTs());
+ Event e4 = new TestEvent(TimeUtil.nowTs());
+ e1.addDep(e2);
+ e2.addDep(e3);
+ e3.addDep(e4);
+
+ List<Event> events = events(e1, e2, e3, e4);
+ new EventSorter(events).sort();
+ assertThat(events).containsExactly(e4, e3, e2, e1).inOrder();
+ }
+
+ @Test
+ public void topoSortMultipleDeps() {
+ Event e1 = new TestEvent(TimeUtil.nowTs());
+ Event e2 = new TestEvent(TimeUtil.nowTs());
+ Event e3 = new TestEvent(TimeUtil.nowTs());
+ Event e4 = new TestEvent(TimeUtil.nowTs());
+ e1.addDep(e2);
+ e1.addDep(e4);
+ e2.addDep(e3);
+
+ // Processing 3 pops 2, processing 4 pops 1.
+ List<Event> events = events(e2, e3, e1, e4);
+ new EventSorter(events).sort();
+ assertThat(events).containsExactly(e3, e2, e4, e1).inOrder();
+ }
+
+ @Test
+ public void topoSortMultipleDepsPreservesNaturalOrder() {
+ Event e1 = new TestEvent(TimeUtil.nowTs());
+ Event e2 = new TestEvent(TimeUtil.nowTs());
+ Event e3 = new TestEvent(TimeUtil.nowTs());
+ Event e4 = new TestEvent(TimeUtil.nowTs());
+ e1.addDep(e4);
+ e2.addDep(e4);
+ e3.addDep(e4);
+
+ // Processing 4 pops 1, 2, 3 in natural order.
+ List<Event> events = events(e4, e3, e2, e1);
+ new EventSorter(events).sort();
+ assertThat(events).containsExactly(e4, e1, e2, e3).inOrder();
+ }
+
+ @Test
+ public void topoSortCycle() {
+ Event e1 = new TestEvent(TimeUtil.nowTs());
+ Event e2 = new TestEvent(TimeUtil.nowTs());
+
+ // Implementation is not really defined, but infinite looping would be bad.
+ // According to current implementation details, 2 pops 1, 1 pops 2 which was
+ // already seen.
+ List<Event> events = events(e2, e1);
+ new EventSorter(events).sort();
+ assertThat(events).containsExactly(e1, e2).inOrder();
+ }
+
+ @Test
+ public void topoSortDepNotInInputList() {
+ Event e1 = new TestEvent(TimeUtil.nowTs());
+ Event e2 = new TestEvent(TimeUtil.nowTs());
+ Event e3 = new TestEvent(TimeUtil.nowTs());
+ e1.addDep(e3);
+
+ List<Event> events = events(e2, e1);
+ try {
+ new EventSorter(events).sort();
+ fail("expected IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // Expected.
+ }
+ }
+
+ private List<Event> events(Event... es) {
+ return Lists.newArrayList(es);
+ }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java
index f7b3b11..b65d49d 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/account/AbstractQueryAccountsTest.java
@@ -17,7 +17,6 @@
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail;
-import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import com.google.gerrit.extensions.api.GerritApi;
@@ -476,22 +475,10 @@
}
protected static Iterable<Integer> ids(AccountInfo... accounts) {
- return FluentIterable.from(Arrays.asList(accounts)).transform(
- new Function<AccountInfo, Integer>() {
- @Override
- public Integer apply(AccountInfo in) {
- return in._accountId;
- }
- });
+ return FluentIterable.of(accounts).transform(a -> a._accountId);
}
protected static Iterable<Integer> ids(Iterable<AccountInfo> accounts) {
- return FluentIterable.from(accounts).transform(
- new Function<AccountInfo, Integer>() {
- @Override
- public Integer apply(AccountInfo in) {
- return in._accountId;
- }
- });
+ return FluentIterable.from(accounts).transform(a -> a._accountId);
}
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
index c5221f1..dae2abb 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractQueryChangesTest.java
@@ -23,7 +23,6 @@
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.Assert.fail;
-import com.google.common.base.Function;
import com.google.common.base.MoreObjects;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
@@ -1437,13 +1436,8 @@
for (int i = 1; i <= 11; i++) {
Iterable<ChangeData> cds = internalChangeQuery.byCommitsOnBranchNotMerged(
repo.getRepository(), db, dest, shas, i);
- Iterable<Integer> ids = FluentIterable.from(cds).transform(
- new Function<ChangeData, Integer>() {
- @Override
- public Integer apply(ChangeData in) {
- return in.getId().get();
- }
- });
+ Iterable<Integer> ids = FluentIterable.from(cds)
+ .transform(in -> in.getId().get());
String name = "limit " + i;
assertThat(ids).named(name).hasSize(n);
assertThat(ids).named(name)
@@ -1640,24 +1634,22 @@
StringBuilder b = new StringBuilder();
b.append("query '").append(query.getQuery())
.append("' with expected changes ");
- b.append(format(Iterables.transform(Arrays.asList(expectedChanges),
- new Function<Change, Integer>() {
- @Override
- public Integer apply(Change change) {
- return change.getChangeId();
- }
- })));
+ b.append(format(
+ Arrays.stream(expectedChanges).map(Change::getChangeId).iterator()));
b.append(" and result ");
b.append(format(actualIds));
return b.toString();
}
private String format(Iterable<Integer> changeIds) throws RestApiException {
+ return format(changeIds.iterator());
+ }
+
+ private String format(Iterator<Integer> changeIds) throws RestApiException {
StringBuilder b = new StringBuilder();
b.append("[");
- Iterator<Integer> it = changeIds.iterator();
- while (it.hasNext()) {
- int id = it.next();
+ while (changeIds.hasNext()) {
+ int id = changeIds.next();
ChangeInfo c = gApi.changes().id(id).get();
b.append("{").append(id).append(" (").append(c.changeId)
.append("), ").append("dest=").append(
@@ -1666,7 +1658,7 @@
.append("status=").append(c.status).append(", ")
.append("lastUpdated=").append(c.updated.getTime())
.append("}");
- if (it.hasNext()) {
+ if (changeIds.hasNext()) {
b.append(", ");
}
}
@@ -1675,23 +1667,13 @@
}
protected static Iterable<Integer> ids(Change... changes) {
- return FluentIterable.from(Arrays.asList(changes)).transform(
- new Function<Change, Integer>() {
- @Override
- public Integer apply(Change in) {
- return in.getId().get();
- }
- });
+ return FluentIterable.from(Arrays.asList(changes))
+ .transform(in -> in.getId().get());
}
protected static Iterable<Integer> ids(Iterable<ChangeInfo> changes) {
- return FluentIterable.from(changes).transform(
- new Function<ChangeInfo, Integer>() {
- @Override
- public Integer apply(ChangeInfo in) {
- return in._number;
- }
- });
+ return FluentIterable.from(changes)
+ .transform(in -> in._number);
}
protected static long lastUpdatedMs(Change c) {
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeEmailSender.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeEmailSender.java
index f2d563e..b8888e2 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeEmailSender.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/FakeEmailSender.java
@@ -14,9 +14,9 @@
package com.google.gerrit.testutil;
+import static java.util.stream.Collectors.toList;
+
import com.google.auto.value.AutoValue;
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.gerrit.common.errors.EmailException;
@@ -111,17 +111,14 @@
}
}
- public ImmutableList<Message> getMessages(String changeId, String type) {
+ public List<Message> getMessages(String changeId, String type) {
final String idFooter = "\nGerrit-Change-Id: " + changeId + "\n";
final String typeFooter = "\nGerrit-MessageType: " + type + "\n";
- return FluentIterable.from(getMessages())
- .filter(new Predicate<Message>() {
- @Override
- public boolean apply(Message in) {
- return in.body().contains(idFooter)
- && in.body().contains(typeFooter);
- }
- }).toList();
+ return getMessages()
+ .stream()
+ .filter(in -> in.body().contains(idFooter)
+ && in.body().contains(typeFooter))
+ .collect(toList());
}
private void waitForEmails() {
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 5fb930c..84fd9d7 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
@@ -36,6 +36,7 @@
import com.google.gerrit.server.config.CanonicalWebUrlModule;
import com.google.gerrit.server.config.CanonicalWebUrlProvider;
import com.google.gerrit.server.config.GerritGlobalModule;
+import com.google.gerrit.server.config.GerritOptions;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.GerritServerId;
import com.google.gerrit.server.config.SitePath;
@@ -50,6 +51,8 @@
import com.google.gerrit.server.index.IndexModule.IndexType;
import com.google.gerrit.server.index.change.ChangeSchemaDefinitions;
import com.google.gerrit.server.mail.SignedTokenEmailTokenVerifier;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
+import com.google.gerrit.server.notedb.GwtormChangeBundleReader;
import com.google.gerrit.server.notedb.NotesMigration;
import com.google.gerrit.server.patch.DiffExecutor;
import com.google.gerrit.server.schema.DataSourceType;
@@ -148,6 +151,8 @@
// TODO(dborowitz): Use jimfs.
bind(Path.class).annotatedWith(SitePath.class).toInstance(Paths.get("."));
bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(cfg);
+ bind(GerritOptions.class)
+ .toInstance(new GerritOptions(cfg, false, false, false));
bind(PersonIdent.class)
.annotatedWith(GerritPersonIdent.class)
.toProvider(GerritPersonIdentProvider.class);
@@ -175,6 +180,7 @@
.to(InMemoryH2Type.class);
bind(new TypeLiteral<SchemaFactory<ReviewDb>>() {})
.to(InMemoryDatabase.class);
+ bind(ChangeBundleReader.class).to(GwtormChangeBundleReader.class);
bind(SecureStore.class).to(DefaultSecureStore.class);
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbChecker.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbChecker.java
index 9cc7aca..6dba19a 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbChecker.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/NoteDbChecker.java
@@ -15,9 +15,10 @@
package com.google.gerrit.testutil;
import static com.google.common.truth.Truth.assertThat;
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
import com.google.common.base.Joiner;
-import com.google.common.collect.Iterables;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
@@ -26,8 +27,12 @@
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.notedb.ChangeBundle;
+import com.google.gerrit.server.notedb.ChangeBundleReader;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
+import com.google.gwtorm.client.IntKey;
+import com.google.gwtorm.server.OrmException;
+import com.google.gwtorm.server.OrmRuntimeException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
@@ -40,6 +45,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.stream.Stream;
@Singleton
public class NoteDbChecker {
@@ -48,6 +54,7 @@
private final Provider<ReviewDb> dbProvider;
private final GitRepositoryManager repoManager;
private final TestNotesMigration notesMigration;
+ private final ChangeBundleReader bundleReader;
private final ChangeNotes.Factory notesFactory;
private final ChangeRebuilder changeRebuilder;
private final PatchLineCommentsUtil plcUtil;
@@ -56,11 +63,13 @@
NoteDbChecker(Provider<ReviewDb> dbProvider,
GitRepositoryManager repoManager,
TestNotesMigration notesMigration,
+ ChangeBundleReader bundleReader,
ChangeNotes.Factory notesFactory,
ChangeRebuilder changeRebuilder,
PatchLineCommentsUtil plcUtil) {
this.dbProvider = dbProvider;
this.repoManager = repoManager;
+ this.bundleReader = bundleReader;
this.notesMigration = notesMigration;
this.notesFactory = notesFactory;
this.changeRebuilder = changeRebuilder;
@@ -69,16 +78,14 @@
public void rebuildAndCheckAllChanges() throws Exception {
rebuildAndCheckChanges(
- Iterables.transform(
- getUnwrappedDb().changes().all(),
- ReviewDbUtil.changeIdFunction()));
+ getUnwrappedDb().changes().all().toList().stream().map(Change::getId));
}
public void rebuildAndCheckChanges(Change.Id... changeIds) throws Exception {
- rebuildAndCheckChanges(Arrays.asList(changeIds));
+ rebuildAndCheckChanges(Arrays.stream(changeIds));
}
- public void rebuildAndCheckChanges(Iterable<Change.Id> changeIds)
+ private void rebuildAndCheckChanges(Stream<Change.Id> changeIds)
throws Exception {
ReviewDb db = getUnwrappedDb();
@@ -107,11 +114,7 @@
}
public void checkChanges(Change.Id... changeIds) throws Exception {
- checkChanges(Arrays.asList(changeIds));
- }
-
- public void checkChanges(Iterable<Change.Id> changeIds) throws Exception {
- checkActual(readExpected(changeIds), new ArrayList<String>());
+ checkActual(readExpected(Arrays.stream(changeIds)), new ArrayList<>());
}
public void assertNoChangeRef(Project.NameKey project, Change.Id changeId)
@@ -121,24 +124,26 @@
}
}
- private List<ChangeBundle> readExpected(Iterable<Change.Id> changeIds)
+ private List<ChangeBundle> readExpected(Stream<Change.Id> changeIds)
throws Exception {
- ReviewDb db = getUnwrappedDb();
boolean old = notesMigration.readChanges();
try {
notesMigration.setReadChanges(false);
- List<Change.Id> sortedIds =
- ReviewDbUtil.intKeyOrdering().sortedCopy(changeIds);
- List<ChangeBundle> expected = new ArrayList<>(sortedIds.size());
- for (Change.Id id : sortedIds) {
- expected.add(ChangeBundle.fromReviewDb(db, id));
- }
- return expected;
+ return changeIds.sorted(comparing(IntKey::get))
+ .map(this::readBundleUnchecked).collect(toList());
} finally {
notesMigration.setReadChanges(old);
}
}
+ private ChangeBundle readBundleUnchecked(Change.Id id) {
+ try {
+ return bundleReader.fromReviewDb(getUnwrappedDb(), id);
+ } catch (OrmException e) {
+ throw new OrmRuntimeException(e);
+ }
+ }
+
private void checkActual(List<ChangeBundle> allExpected, List<String> msgs)
throws Exception {
ReviewDb db = getUnwrappedDb();
diff --git a/gerrit-sshd/BUCK b/gerrit-sshd/BUCK
index 54b83e2..fcb844f 100644
--- a/gerrit-sshd/BUCK
+++ b/gerrit-sshd/BUCK
@@ -56,5 +56,4 @@
'//lib:truth',
'//lib/mina:sshd',
],
- source_under_test = [':sshd'],
)
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java
index 25fb7a7..3e31fab 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/BaseCommand.java
@@ -385,14 +385,6 @@
}
}
- public void checkExclusivity(final Object arg1, final String arg1name,
- final Object arg2, final String arg2name) throws UnloggedFailure {
- if (arg1 != null && arg2 != null) {
- throw new UnloggedFailure(String.format(
- "%s and %s options are mutually exclusive.", arg1name, arg2name));
- }
- }
-
private final class TaskThunk implements CancelableRunnable, ProjectRunnable {
private final CommandRunnable thunk;
private final String taskName;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java
index eb0d7b2..bd5e9f3 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AdminSetParent.java
@@ -14,9 +14,6 @@
package com.google.gerrit.sshd.commands;
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.extensions.annotations.RequiresCapability;
import com.google.gerrit.extensions.common.ProjectInfo;
@@ -200,15 +197,11 @@
return childProjects;
}
- private Set<Project.NameKey> getAllParents(final Project.NameKey projectName) {
+ private Set<Project.NameKey> getAllParents(Project.NameKey projectName) {
ProjectState ps = projectCache.get(projectName);
- return ImmutableSet.copyOf(Iterables.transform(
- ps != null ? ps.parents() : Collections.<ProjectState> emptySet(),
- new Function<ProjectState, Project.NameKey> () {
- @Override
- public Project.NameKey apply(ProjectState in) {
- return in.getProject().getNameKey();
- }
- }));
+ if (ps == null) {
+ return Collections.emptySet();
+ }
+ return ps.parents().transform(s -> s.getProject().getNameKey()).toSet();
}
}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BanCommitCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BanCommitCommand.java
index f78b4df..e15a792 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BanCommitCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/BanCommitCommand.java
@@ -16,7 +16,6 @@
import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.gerrit.extensions.restapi.RestApiException;
@@ -56,14 +55,8 @@
@Override
protected void run() throws Failure {
try {
- BanCommit.Input input =
- BanCommit.Input.fromCommits(Lists.transform(commitsToBan,
- new Function<ObjectId, String>() {
- @Override
- public String apply(ObjectId oid) {
- return oid.getName();
- }
- }));
+ BanCommit.Input input = BanCommit.Input.fromCommits(
+ Lists.transform(commitsToBan, ObjectId::getName));
input.reason = reason;
BanResultInfo r = banCommit.apply(new ProjectResource(projectControl), input);
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java
index d3ff06f..4ecf284 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateAccountCommand.java
@@ -16,7 +16,6 @@
import static java.nio.charset.StandardCharsets.UTF_8;
-import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.extensions.annotations.RequiresCapability;
@@ -74,12 +73,7 @@
input.name = fullName;
input.sshKey = readSshKey();
input.httpPassword = httpPassword;
- input.groups = Lists.transform(groups, new Function<AccountGroup.Id, String>() {
- @Override
- public String apply(AccountGroup.Id id) {
- return id.toString();
- }
- });
+ input.groups = Lists.transform(groups, AccountGroup.Id::toString);
try {
createAccountFactory.create(username).apply(TopLevelResource.INSTANCE, input);
} catch (RestApiException e) {
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java
index 22f9683..f9fd1a9 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateGroupCommand.java
@@ -14,8 +14,8 @@
package com.google.gerrit.sshd.commands;
-import com.google.common.base.Function;
-import com.google.common.collect.FluentIterable;
+import static java.util.stream.Collectors.toList;
+
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.extensions.annotations.RequiresCapability;
import com.google.gerrit.extensions.api.groups.GroupInput;
@@ -123,30 +123,15 @@
private void addMembers(GroupResource rsrc) throws RestApiException,
OrmException, IOException {
- AddMembers.Input input =
- AddMembers.Input.fromMembers(FluentIterable
- .from(initialMembers)
- .transform(new Function<Account.Id, String>() {
- @Override
- public String apply(Account.Id id) {
- return String.valueOf(id.get());
- }
- })
- .toList());
+ AddMembers.Input input = AddMembers.Input.fromMembers(
+ initialMembers.stream().map(Object::toString).collect(toList()));
addMembers.apply(rsrc, input);
}
private void addIncludedGroups(GroupResource rsrc) throws RestApiException,
OrmException {
- AddIncludedGroups.Input input =
- AddIncludedGroups.Input.fromGroups(FluentIterable.from(initialGroups)
- .transform(new Function<AccountGroup.UUID, String>() {
- @Override
- public String apply(AccountGroup.UUID id) {
- return id.get();
- }
- }).toList());
-
+ AddIncludedGroups.Input input = AddIncludedGroups.Input.fromGroups(
+ initialGroups.stream().map(AccountGroup.UUID::get).collect(toList()));
addIncludedGroups.apply(rsrc, input);
}
}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
index db4f313..3ef3309 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/CreateProjectCommand.java
@@ -15,7 +15,6 @@
package com.google.gerrit.sshd.commands;
import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.gerrit.common.data.GlobalCapability;
@@ -140,13 +139,7 @@
ProjectInput input = new ProjectInput();
input.name = projectName;
if (ownerIds != null) {
- input.owners = Lists.transform(ownerIds,
- new Function<AccountGroup.UUID, String>() {
- @Override
- public String apply(AccountGroup.UUID uuid) {
- return uuid.get();
- }
- });
+ input.owners = Lists.transform(ownerIds, AccountGroup.UUID::get);
}
if (newParent != null) {
input.parent = newParent.getProject().getName();
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetMembersCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetMembersCommand.java
index a7e01c5..f654f6a 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetMembersCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetMembersCommand.java
@@ -14,11 +14,10 @@
package com.google.gerrit.sshd.commands;
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+
import com.google.common.base.MoreObjects;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.TopLevelResource;
import com.google.gerrit.reviewdb.client.Account;
@@ -110,55 +109,37 @@
private void reportMembersAction(String action, GroupResource group,
List<Account.Id> accountIdList) throws UnsupportedEncodingException,
IOException {
- out.write(String.format(
- "Members %s group %s: %s\n",
- action,
- group.getName(),
- Joiner.on(", ").join(
- Iterables.transform(accountIdList,
- new Function<Account.Id, String>() {
- @Override
- public String apply(Account.Id accountId) {
- return MoreObjects.firstNonNull(accountCache.get(accountId)
- .getAccount().getPreferredEmail(), "n/a");
- }
- }))).getBytes(ENC));
+ String names = accountIdList.stream()
+ .map(accountId ->
+ MoreObjects.firstNonNull(
+ accountCache.get(accountId).getAccount().getPreferredEmail(),
+ "n/a"))
+ .collect(joining(", "));
+ out.write(
+ String.format(
+ "Members %s group %s: %s\n", action, group.getName(), names)
+ .getBytes(ENC));
}
private void reportGroupsAction(String action, GroupResource group,
List<AccountGroup.UUID> groupUuidList)
throws UnsupportedEncodingException, IOException {
- out.write(String.format(
- "Groups %s group %s: %s\n",
- action,
- group.getName(),
- Joiner.on(", ").join(
- Iterables.transform(groupUuidList,
- new Function<AccountGroup.UUID, String>() {
- @Override
- public String apply(AccountGroup.UUID uuid) {
- return groupCache.get(uuid).getName();
- }
- }))).getBytes(ENC));
+ String names = groupUuidList.stream()
+ .map(uuid -> groupCache.get(uuid).getName())
+ .collect(joining(", "));
+ out.write(
+ String.format(
+ "Groups %s group %s: %s\n", action, group.getName(), names)
+ .getBytes(ENC));
}
private AddIncludedGroups.Input fromGroups(List<AccountGroup.UUID> accounts) {
- return AddIncludedGroups.Input.fromGroups(Lists.newArrayList(Iterables
- .transform(accounts, new Function<AccountGroup.UUID, String>() {
- @Override
- public String apply(AccountGroup.UUID uuid) {
- return uuid.toString();
- }
- })));
+ return AddIncludedGroups.Input.fromGroups(
+ accounts.stream().map(Object::toString).collect(toList()));
}
private AddMembers.Input fromMembers(List<Account.Id> accounts) {
- return AddMembers.Input.fromMembers(Lists.newArrayList(Iterables.transform(
- accounts, new Function<Account.Id, String>() {
- @Override
- public String apply(Account.Id id) {
- return id.toString();
- }
- })));
+ return AddMembers.Input.fromMembers(
+ accounts.stream().map(Object::toString).collect(toList()));
}
}
diff --git a/gerrit-util-http/BUCK b/gerrit-util-http/BUCK
index cfab096..79ef836 100644
--- a/gerrit-util-http/BUCK
+++ b/gerrit-util-http/BUCK
@@ -34,7 +34,6 @@
'//lib:truth',
'//lib/easymock:easymock',
],
- source_under_test = [':http'],
# TODO(sop) Remove after Buck supports Eclipse
visibility = ['//tools/eclipse:classpath'],
)
diff --git a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java b/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java
index 3991b95..34f2672 100644
--- a/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java
+++ b/gerrit-util-http/src/test/java/com/google/gerrit/util/http/testutil/FakeHttpServletRequest.java
@@ -18,7 +18,6 @@
import static com.google.common.base.Preconditions.checkNotNull;
import static java.nio.charset.StandardCharsets.UTF_8;
-import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import com.google.common.collect.LinkedListMultimap;
@@ -143,18 +142,12 @@
return Iterables.getFirst(parameters.get(name), null);
}
- private static final Function<Collection<String>, String[]> STRING_COLLECTION_TO_ARRAY =
- new Function<Collection<String>, String[]>() {
- @Override
- public String[] apply(Collection<String> values) {
- return values.toArray(new String[0]);
- }
- };
-
@Override
public Map<String, String[]> getParameterMap() {
return Collections.unmodifiableMap(
- Maps.transformValues(parameters.asMap(), STRING_COLLECTION_TO_ARRAY));
+ Maps.transformValues(
+ parameters.asMap(),
+ vs -> vs.toArray(new String[0])));
}
@Override
@@ -164,7 +157,7 @@
@Override
public String[] getParameterValues(String name) {
- return STRING_COLLECTION_TO_ARRAY.apply(parameters.get(name));
+ return parameters.get(name).toArray(new String[0]);
}
public void setQueryString(String qs) {
diff --git a/gerrit-war/BUILD b/gerrit-war/BUILD
new file mode 100644
index 0000000..86c838f
--- /dev/null
+++ b/gerrit-war/BUILD
@@ -0,0 +1,70 @@
+load('//tools/bzl:genrule2.bzl', 'genrule2')
+
+java_library(
+ name = 'init',
+ srcs = glob(['src/main/java/**/*.java']),
+ deps = [
+ '//gerrit-cache-h2:cache-h2',
+ '//gerrit-extension-api:api',
+ '//gerrit-gpg:gpg',
+ '//gerrit-httpd:httpd',
+ '//gerrit-lucene:lucene',
+ '//gerrit-oauth:oauth',
+ '//gerrit-openid:openid',
+ '//gerrit-pgm:http',
+ '//gerrit-pgm:init',
+ '//gerrit-pgm:init-api',
+ '//gerrit-pgm:util',
+ '//gerrit-reviewdb:server',
+ '//gerrit-server:server',
+ '//gerrit-server/src/main/prolog:common',
+ '//gerrit-sshd:sshd',
+ '//lib:guava',
+ '//lib:gwtorm',
+ '//lib:servlet-api-3_1',
+ '//lib/guice:guice',
+ '//lib/guice:guice-servlet',
+ '//lib/jgit/org.eclipse.jgit:jgit',
+ '//lib/log:api',
+ ],
+ visibility = ['//visibility:public'],
+)
+
+genrule2(
+ name = 'webapp_assets',
+ cmd = 'cd gerrit-war/src/main/webapp; zip -qr $$ROOT/$@ .',
+ srcs = glob(['src/main/webapp/**/*']),
+ out = 'webapp_assets.zip',
+ visibility = ['//visibility:public'],
+)
+
+java_import(
+ name = 'log4j-config',
+ jars = [':log4j-config__jar'],
+ visibility = ['//visibility:public'],
+)
+
+genrule2(
+ name = 'log4j-config__jar',
+ cmd = 'cd gerrit-war/src/main/resources && zip -9Dqr $$ROOT/$@ .',
+ srcs = ['src/main/resources/log4j.properties'],
+ out = 'log4j-config.jar',
+)
+
+java_import(
+ name = 'version',
+ jars = [':gen_version'],
+ visibility = ['//visibility:public'],
+)
+
+genrule2(
+ name = 'gen_version',
+ cmd = ' && '.join([
+ 'cd $$TMP',
+ 'mkdir -p com/google/gerrit/common',
+ 'cat $$ROOT/$(location //:version) >com/google/gerrit/common/Version',
+ 'zip -9Dqr $$ROOT/$@ .',
+ ]),
+ tools = ['//:version'],
+ out = 'gen_version.jar',
+)
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 5790453..fc0beae 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
@@ -38,6 +38,7 @@
import com.google.gerrit.server.config.CanonicalWebUrlModule;
import com.google.gerrit.server.config.DownloadConfig;
import com.google.gerrit.server.config.GerritGlobalModule;
+import com.google.gerrit.server.config.GerritOptions;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.GerritServerConfigModule;
import com.google.gerrit.server.config.RestCacheAdminModule;
diff --git a/lib/BUCK b/lib/BUCK
index 6ff1ef4..14ae9df 100644
--- a/lib/BUCK
+++ b/lib/BUCK
@@ -8,7 +8,7 @@
define_license(name = 'asciidoctor')
define_license(name = 'automaton')
define_license(name = 'bouncycastle')
-define_license(name = 'CC-BY3.0')
+define_license(name = 'CC-BY3.0-unported')
define_license(name = 'clippy')
define_license(name = 'codemirror-minified')
define_license(name = 'codemirror-original')
@@ -39,9 +39,9 @@
maven_jar(
name = 'gwtorm_client',
- id = 'com.google.gerrit:gwtorm:1.15',
- bin_sha1 = '26a2459f543ed78977535f92e379dc0d6cdde8bb',
- src_sha1 = '9524088d6e46e299b12791cb1a63c4ba6a478b96',
+ id = 'com.google.gerrit:gwtorm:1.16',
+ bin_sha1 = '3e41b6d7bb352fa0539ce23b9bce97cf8c26c3bf',
+ src_sha1 = 'f45b7bacc79a0e5a7f6cf799a2dba23cc5bca19b',
license = 'Apache2.0',
)
@@ -54,9 +54,9 @@
maven_jar(
name = 'gwtjsonrpc',
- id = 'com.google.gerrit:gwtjsonrpc:1.10',
- bin_sha1 = '25adea6ef102b761993688e80dfc7203e0f5edf0',
- src_sha1 = '4401b5868976460f8fac504cf730425ed95481ff',
+ id = 'com.google.gerrit:gwtjsonrpc:1.11',
+ bin_sha1 = '0990e7eec9eec3a15661edcf9232acbac4aeacec',
+ src_sha1 = 'a682afc46284fb58197a173cb5818770a1e7834a',
license = 'Apache2.0',
)
@@ -222,8 +222,8 @@
maven_jar(
name = 'jimfs',
- id = 'com.google.jimfs:jimfs:1.0',
- sha1 = 'edd65a2b792755f58f11134e76485a928aab4c97',
+ id = 'com.google.jimfs:jimfs:1.1',
+ sha1 = '8fbd0579dc68aba6186935cc1bee21d2f3e7ec1c',
license = 'DO_NOT_DISTRIBUTE',
deps = [':guava'],
)
diff --git a/lib/BUILD b/lib/BUILD
index a490038..44c293d 100644
--- a/lib/BUILD
+++ b/lib/BUILD
@@ -231,3 +231,9 @@
exports = [ '@icu4j//jar' ],
visibility = ['//visibility:public'],
)
+
+java_library(
+ name = 'postgresql',
+ exports = ['@postgresql//jar'],
+ visibility = ['//visibility:public'],
+)
diff --git a/lib/JGIT_VERSION b/lib/JGIT_VERSION
index 5817fe8..b7f7c84 100644
--- a/lib/JGIT_VERSION
+++ b/lib/JGIT_VERSION
@@ -1,6 +1,6 @@
include_defs('//lib/maven.defs')
-REPO = GERRIT # Leave here even if set to MAVEN_CENTRAL.
-VERS = '4.4.1.201607150455-r.148-gabeaafc'
-DOC_VERS = '4.4.1.201607150455-r' # Set to VERS unless using a snapshot
+REPO = MAVEN_CENTRAL # Leave here even if set to MAVEN_CENTRAL.
+VERS = '4.5.0.201609210915-r'
+DOC_VERS = VERS # Set to VERS unless using a snapshot
JGIT_DOC_URL="http://download.eclipse.org/jgit/site/" + DOC_VERS + "/apidocs"
diff --git a/lib/LICENSE-CC-BY3.0 b/lib/LICENSE-CC-BY3.0-unported
similarity index 99%
rename from lib/LICENSE-CC-BY3.0
rename to lib/LICENSE-CC-BY3.0-unported
index 39dbc91..d2f2550 100644
--- a/lib/LICENSE-CC-BY3.0
+++ b/lib/LICENSE-CC-BY3.0-unported
@@ -1,4 +1,4 @@
-link:http://creativecommons.org/licenses/by/3.0/us/[CC-BY 3.0]
+link:http://creativecommons.org/licenses/by/3.0/[CC-BY 3.0]
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS
diff --git a/lib/LICENSE-diffy b/lib/LICENSE-diffy
index 2b58536..e837a1a 100644
--- a/lib/LICENSE-diffy
+++ b/lib/LICENSE-diffy
@@ -1 +1 @@
-link:http://creativecommons.org/licenses/by/3.0/us/[CC-BY 3.0] (c) Sara Owens, inkylabs.com
+link:http://creativecommons.org/licenses/by/3.0/[CC-BY 3.0] (c) Sara Owens, inkylabs.com
diff --git a/lib/LICENSE-silk_icons b/lib/LICENSE-silk_icons
index 2b10dde..b7417f6 100644
--- a/lib/LICENSE-silk_icons
+++ b/lib/LICENSE-silk_icons
@@ -1 +1,338 @@
-link:http://creativecommons.org/licenses/by/3.0/us/[CC-BY 3.0] (c) Mark James, link:http://famfamfam.com/lab/icons/silk/[SILK ICONS]
+link:http://creativecommons.org/licenses/by/3.0/[CC-BY 3.0] (c) Mark James, link:http://famfamfam.com/lab/icons/silk/[SILK ICONS]
+
+As an author, I would appreciate a reference to my authorship of the Silk
+icon set contents within a readme file or equivalent documentation for
+the software which includes the set or a subset of the icons contained
+within.
+
+THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
+CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS
+PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE
+WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS
+PROHIBITED.
+
+BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
+AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS
+LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU
+THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH
+TERMS AND CONDITIONS.
+
+1. Definitions
+
+ a. "Adaptation" means a work based upon the Work, or upon the Work
+ and other pre-existing works, such as a translation, adaptation,
+ derivative work, arrangement of music or other alterations of a
+ literary or artistic work, or phonogram or performance and
+ includes cinematographic adaptations or any other form in which
+ the Work may be recast, transformed, or adapted including in any
+ form recognizably derived from the original, except that a work
+ that constitutes a Collection will not be considered an
+ Adaptation for the purpose of this License. For the avoidance
+ of doubt, where the Work is a musical work, performance or
+ phonogram, the synchronization of the Work in timed-relation
+ with a moving image ("synching") will be considered an
+ Adaptation for the purpose of this License.
+
+ b. "Collection" means a collection of literary or artistic works,
+ such as encyclopedias and anthologies, or performances,
+ phonograms or broadcasts, or other works or subject matter other
+ than works listed in Section 1(f) below, which, by reason of the
+ selection and arrangement of their contents, constitute
+ intellectual creations, in which the Work is included in its
+ entirety in unmodified form along with one or more other
+ contributions, each constituting separate and independent works
+ in themselves, which together are assembled into a collective
+ whole. A work that constitutes a Collection will not be
+ considered an Adaptation (as defined above) for the purposes of
+ this License.
+
+ c. "Distribute" means to make available to the public the original
+ and copies of the Work or Adaptation, as appropriate, through
+ sale or other transfer of ownership.
+
+ d. "Licensor" means the individual, individuals, entity or entities
+ that offer(s) the Work under the terms of this License.
+
+ e. "Original Author" means, in the case of a literary or artistic
+ work, the individual, individuals, entity or entities who
+ created the Work or if no individual or entity can be
+ identified, the publisher; and in addition (i) in the case of a
+ performance the actors, singers, musicians, dancers, and other
+ persons who act, sing, deliver, declaim, play in, interpret or
+ otherwise perform literary or artistic works or expressions of
+ folklore; (ii) in the case of a phonogram the producer being the
+ person or legal entity who first fixes the sounds of a
+ performance or other sounds; and, (iii) in the case of
+ broadcasts, the organization that transmits the broadcast.
+
+ f. "Work" means the literary and/or artistic work offered under the
+ terms of this License including without limitation any
+ production in the literary, scientific and artistic domain,
+ whatever may be the mode or form of its expression including
+ digital form, such as a book, pamphlet and other writing; a
+ lecture, address, sermon or other work of the same nature; a
+ dramatic or dramatico-musical work; a choreographic work or
+ entertainment in dumb show; a musical composition with or
+ without words; a cinematographic work to which are assimilated
+ works expressed by a process analogous to cinematography; a work
+ of drawing, painting, architecture, sculpture, engraving or
+ lithography; a photographic work to which are assimilated works
+ expressed by a process analogous to photography; a work of
+ applied art; an illustration, map, plan, sketch or
+ three-dimensional work relative to geography, topography,
+ architecture or science; a performance; a broadcast; a
+ phonogram; a compilation of data to the extent it is protected
+ as a copyrightable work; or a work performed by a variety or
+ circus performer to the extent it is not otherwise considered a
+ literary or artistic work.
+
+ g. "You" means an individual or entity exercising rights under this
+ License who has not previously violated the terms of this
+ License with respect to the Work, or who has received express
+ permission from the Licensor to exercise rights under this
+ License despite a previous violation.
+
+ h. "Publicly Perform" means to perform public recitations of the
+ Work and to communicate to the public those public recitations,
+ by any means or process, including by wire or wireless means or
+ public digital performances; to make available to the public
+ Works in such a way that members of the public may access these
+ Works from a place and at a place individually chosen by them;
+ to perform the Work to the public by any means or process and
+ the communication to the public of the performances of the Work,
+ including by public digital performance; to broadcast and
+ rebroadcast the Work by any means including signs, sounds or
+ images.
+
+ i. "Reproduce" means to make copies of the Work by any means
+ including without limitation by sound or visual recordings and
+ the right of fixation and reproducing fixations of the Work,
+ including storage of a protected performance or phonogram in
+ digital form or other electronic medium.
+
+2. Fair Dealing Rights. Nothing in this License is intended to
+ reduce, limit, or restrict any uses free from copyright or rights
+ arising from limitations or exceptions that are provided for in
+ connection with the copyright protection under copyright law or
+ other applicable laws.
+
+3. License Grant. Subject to the terms and conditions of this
+ License, Licensor hereby grants You a worldwide, royalty-free,
+ non-exclusive, perpetual (for the duration of the applicable
+ copyright) license to exercise the rights in the Work as stated
+ below:
+
+ a. to Reproduce the Work, to incorporate the Work into one or more
+ Collections, and to Reproduce the Work as incorporated in the
+ Collections;
+
+ b. to create and Reproduce Adaptations provided that any such
+ Adaptation, including any translation in any medium, takes
+ reasonable steps to clearly label, demarcate or otherwise
+ identify that changes were made to the original Work. For
+ example, a translation could be marked "The original work was
+ translated from English to Spanish," or a modification could
+ indicate "The original work has been modified.";
+
+ c. to Distribute and Publicly Perform the Work including as
+ incorporated in Collections; and,
+
+ d. to Distribute and Publicly Perform Adaptations.
+
+ e. For the avoidance of doubt:
+
+ i. Non-waivable Compulsory License Schemes. In those
+ jurisdictions in which the right to collect royalties
+ through any statutory or compulsory licensing scheme
+ cannot be waived, the Licensor reserves the exclusive
+ right to collect such royalties for any exercise by You
+ of the rights granted under this License;
+
+ ii. Waivable Compulsory License Schemes. In those jurisdictions
+ in which the right to collect royalties through any
+ statutory or compulsory licensing scheme can be waived,
+ the Licensor waives the exclusive right to collect such
+ royalties for any exercise by You of the rights granted
+ under this License; and,
+
+ iii. Voluntary License Schemes. The Licensor waives the right to
+ collect royalties, whether individually or, in the event
+ that the Licensor is a member of a collecting society
+ that administers voluntary licensing schemes, via that
+ society, from any exercise by You of the rights granted
+ under this License.
+
+The above rights may be exercised in all media and formats whether now
+known or hereafter devised. The above rights include the right to
+make such modifications as are technically necessary to exercise the
+rights in other media and formats. Subject to Section 8(f), all
+rights not expressly granted by Licensor are hereby reserved.
+
+4. Restrictions. The license granted in Section 3 above is expressly
+ made subject to and limited by the following restrictions:
+
+ a. You may Distribute or Publicly Perform the Work only under the
+ terms of this License. You must include a copy of, or the
+ Uniform Resource Identifier (URI) for, this License with every
+ copy of the Work You Distribute or Publicly Perform. You may
+ not offer or impose any terms on the Work that restrict the
+ terms of this License or the ability of the recipient of the
+ Work to exercise the rights granted to that recipient under the
+ terms of the License. You may not sublicense the Work. You
+ must keep intact all notices that refer to this License and to
+ the disclaimer of warranties with every copy of the Work You
+ Distribute or Publicly Perform. When You Distribute or Publicly
+ Perform the Work, You may not impose any effective technological
+ measures on the Work that restrict the ability of a recipient of
+ the Work from You to exercise the rights granted to that
+ recipient under the terms of the License. This Section 4(a)
+ applies to the Work as incorporated in a Collection, but this
+ does not require the Collection apart from the Work itself to be
+ made subject to the terms of this License. If You create a
+ Collection, upon notice from any Licensor You must, to the
+ extent practicable, remove from the Collection any credit as
+ required by Section 4(b), as requested. If You create an
+ Adaptation, upon notice from any Licensor You must, to the
+ extent practicable, remove from the Adaptation any credit as
+ required by Section 4(b), as requested.
+
+ b. If You Distribute, or Publicly Perform the Work or any
+ Adaptations or Collections, You must, unless a request has been
+ made pursuant to Section 4(a), keep intact all copyright notices
+ for the Work and provide, reasonable to the medium or means You
+ are utilizing: (i) the name of the Original Author (or
+ pseudonym, if applicable) if supplied, and/or if the Original
+ Author and/or Licensor designate another party or parties (e.g.,
+ a sponsor institute, publishing entity, journal) for attribution
+ ("Attribution Parties") in Licensor's copyright notice, terms of
+ service or by other reasonable means, the name of such party or
+ parties; (ii) the title of the Work if supplied; (iii) to the
+ extent reasonably practicable, the URI, if any, that Licensor
+ specifies to be associated with the Work, unless such URI does
+ not refer to the copyright notice or licensing information for
+ the Work; and (iv) , consistent with Section 3(b), in the case
+ of an Adaptation, a credit identifying the use of the Work in
+ the Adaptation (e.g., "French translation of the Work by
+ Original Author," or "Screenplay based on original Work by
+ Original Author"). The credit required by this Section 4 (b)
+ may be implemented in any reasonable manner; provided, however,
+ that in the case of a Adaptation or Collection, at a minimum
+ such credit will appear, if a credit for all contributing
+ authors of the Adaptation or Collection appears, then as part of
+ these credits and in a manner at least as prominent as the
+ credits for the other contributing authors. For the avoidance
+ of doubt, You may only use the credit required by this Section
+ for the purpose of attribution in the manner set out above and,
+ by exercising Your rights under this License, You may not
+ implicitly or explicitly assert or imply any connection with,
+ sponsorship or endorsement by the Original Author, Licensor
+ and/or Attribution Parties, as appropriate, of You or Your use
+ of the Work, without the separate, express prior written
+ permission of the Original Author, Licensor and/or Attribution
+ Parties.
+
+ c. Except as otherwise agreed in writing by the Licensor or as may
+ be otherwise permitted by applicable law, if You Reproduce,
+ Distribute or Publicly Perform the Work either by itself or as
+ part of any Adaptations or Collections, You must not distort,
+ mutilate, modify or take other derogatory action in relation to
+ the Work which would be prejudicial to the Original Author's
+ honor or reputation. Licensor agrees that in those
+ jurisdictions (e.g. Japan), in which any exercise of the right
+ granted in Section 3(b) of this License (the right to make
+ Adaptations) would be deemed to be a distortion, mutilation,
+ modification or other derogatory action prejudicial to the
+ Original Author's honor and reputation, the Licensor will waive
+ or not assert, as appropriate, this Section, to the fullest
+ extent permitted by the applicable national law, to enable You
+ to reasonably exercise Your right under Section 3(b) of this
+ License (right to make Adaptations) but not otherwise.
+
+5. Representations, Warranties and Disclaimer
+
+UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING,
+LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR
+WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED,
+STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF
+TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE,
+NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY,
+OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE.
+SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES,
+SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+
+6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY
+ APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY
+ LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE
+ OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE
+ WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ DAMAGES.
+
+7. Termination
+
+ a. This License and the rights granted hereunder will terminate
+ automatically upon any breach by You of the terms of this
+ License. Individuals or entities who have received Adaptations
+ or Collections from You under this License, however, will not
+ have their licenses terminated provided such individuals or
+ entities remain in full compliance with those licenses.
+ Sections 1, 2, 5, 6, 7, and 8 will survive any termination of
+ this License.
+
+ b. Subject to the above terms and conditions, the license granted
+ here is perpetual (for the duration of the applicable copyright
+ in the Work). Notwithstanding the above, Licensor reserves the
+ right to release the Work under different license terms or to
+ stop distributing the Work at any time; provided, however that
+ any such election will not serve to withdraw this License (or
+ any other license that has been, or is required to be, granted
+ under the terms of this License), and this License will continue
+ in full force and effect unless terminated as stated above.
+
+8. Miscellaneous
+
+ a. Each time You Distribute or Publicly Perform the Work or a
+ Collection, the Licensor offers to the recipient a license to
+ the Work on the same terms and conditions as the license granted
+ to You under this License.
+
+ b. Each time You Distribute or Publicly Perform an Adaptation,
+ Licensor offers to the recipient a license to the original Work
+ on the same terms and conditions as the license granted to You
+ under this License.
+
+ c. If any provision of this License is invalid or unenforceable
+ under applicable law, it shall not affect the validity or
+ enforceability of the remainder of the terms of this License,
+ and without further action by the parties to this agreement,
+ such provision shall be reformed to the minimum extent necessary
+ to make such provision valid and enforceable.
+
+ d. No term or provision of this License shall be deemed waived and
+ no breach consented to unless such waiver or consent shall be in
+ writing and signed by the party to be charged with such waiver
+ or consent.
+
+ e. This License constitutes the entire agreement between the
+ parties with respect to the Work licensed here. There are no
+ understandings, agreements or representations with respect to
+ the Work not specified here. Licensor shall not be bound by any
+ additional provisions that may appear in any communication from
+ You. This License may not be modified without the mutual
+ written agreement of the Licensor and You.
+
+ f. The rights granted under, and the subject matter referenced, in
+ this License were drafted utilizing the terminology of the Berne
+ Convention for the Protection of Literary and Artistic Works (as
+ amended on September 28, 1979), the Rome Convention of 1961, the
+ WIPO Copyright Treaty of 1996, the WIPO Performances and
+ Phonograms Treaty of 1996 and the Universal Copyright Convention
+ (as revised on July 24, 1971). These rights and subject matter
+ take effect in the relevant jurisdiction in which the License
+ terms are sought to be enforced according to the corresponding
+ provisions of the implementation of those treaty provisions in
+ the applicable national law. If the standard suite of rights
+ granted under applicable copyright law includes additional
+ rights not granted under this License, such additional rights
+ are deemed to be included in the License; this License is not
+ intended to restrict the license of any rights under applicable
+ law.
diff --git a/lib/codemirror/BUILD b/lib/codemirror/BUILD
new file mode 100644
index 0000000..0a62d41
--- /dev/null
+++ b/lib/codemirror/BUILD
@@ -0,0 +1,2 @@
+load('//lib/codemirror:cm.bzl', 'pkg_cm')
+pkg_cm()
diff --git a/lib/codemirror/cm.bzl b/lib/codemirror/cm.bzl
new file mode 100644
index 0000000..b4e55fe
--- /dev/null
+++ b/lib/codemirror/cm.bzl
@@ -0,0 +1,355 @@
+load('//tools/bzl:genrule2.bzl', 'genrule2')
+
+CM_CSS = [
+ 'lib/codemirror.css',
+ 'addon/dialog/dialog.css',
+ 'addon/merge/merge.css',
+ 'addon/scroll/simplescrollbars.css',
+ 'addon/search/matchesonscrollbar.css',
+ 'addon/lint/lint.css',
+]
+
+CM_JS = [
+ 'lib/codemirror.js',
+ 'mode/meta.js',
+ 'keymap/emacs.js',
+ 'keymap/sublime.js',
+ 'keymap/vim.js',
+]
+
+CM_ADDONS = [
+ 'dialog/dialog.js',
+ 'edit/closebrackets.js',
+ 'edit/matchbrackets.js',
+ 'edit/trailingspace.js',
+ 'scroll/annotatescrollbar.js',
+ 'scroll/simplescrollbars.js',
+ 'search/jump-to-line.js',
+ 'search/matchesonscrollbar.js',
+ 'search/searchcursor.js',
+ 'search/search.js',
+ 'selection/mark-selection.js',
+ 'mode/multiplex.js',
+ 'mode/overlay.js',
+ 'mode/simple.js',
+ 'lint/lint.js',
+]
+
+# Available themes must be enumerated here,
+# in gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/Theme.java,
+# in gerrit-gwtui/src/main/java/net/codemirror/theme/Themes.java
+CM_THEMES = [
+ '3024-day',
+ '3024-night',
+ 'abcdef',
+ 'ambiance',
+ 'base16-dark',
+ 'base16-light',
+ 'bespin',
+ 'blackboard',
+ 'cobalt',
+ 'colorforth',
+ 'dracula',
+ 'eclipse',
+ 'elegant',
+ 'erlang-dark',
+ 'hopscotch',
+ 'icecoder',
+ 'isotope',
+ 'lesser-dark',
+ 'liquibyte',
+ 'material',
+ 'mbo',
+ 'mdn-like',
+ 'midnight',
+ 'monokai',
+ 'neat',
+ 'neo',
+ 'night',
+ 'paraiso-dark',
+ 'paraiso-light',
+ 'pastel-on-dark',
+ 'railscasts',
+ 'rubyblue',
+ 'seti',
+ 'solarized',
+ 'the-matrix',
+ 'tomorrow-night-bright',
+ 'tomorrow-night-eighties',
+ 'ttcn',
+ 'twilight',
+ 'vibrant-ink',
+ 'xq-dark',
+ 'xq-light',
+ 'yeti',
+ 'zenburn',
+]
+
+# Available modes must be enumerated here,
+# in gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java,
+# gerrit-gwtui/src/main/java/net/codemirror/mode/ModeInfo.java,
+# and in CodeMirror's own mode/meta.js script.
+CM_MODES = [
+ 'apl',
+ 'asciiarmor',
+ 'asn.1',
+ 'asterisk',
+ 'brainfuck',
+ 'clike',
+ 'clojure',
+ 'cmake',
+ 'cobol',
+ 'coffeescript',
+ 'commonlisp',
+ 'crystal',
+ 'css',
+ 'cypher',
+ 'd',
+ 'dart',
+ 'diff',
+ 'django',
+ 'dockerfile',
+ 'dtd',
+ 'dylan',
+ 'ebnf',
+ 'ecl',
+ 'eiffel',
+ 'elm',
+ 'erlang',
+ 'factor',
+ 'fcl',
+ 'forth',
+ 'fortran',
+ 'gas',
+ 'gfm',
+ 'gherkin',
+ 'go',
+ 'groovy',
+ 'haml',
+ 'handlebars',
+ 'haskell-literate',
+ 'haskell',
+ 'haxe',
+ 'htmlembedded',
+ 'htmlmixed',
+ 'http',
+ 'idl',
+ 'javascript',
+ 'jinja2',
+ 'jsx',
+ 'julia',
+ 'livescript',
+ 'lua',
+ 'markdown',
+ 'mathematica',
+ 'mbox',
+ 'mirc',
+ 'mllike',
+ 'modelica',
+ 'mscgen',
+ 'mumps',
+ 'nginx',
+ 'nsis',
+ 'ntriples',
+ 'octave',
+ 'oz',
+ 'pascal',
+ 'pegjs',
+ 'perl',
+ 'php',
+ 'pig',
+ 'powershell',
+ 'properties',
+ 'protobuf',
+ 'pug',
+ 'puppet',
+ 'python',
+ 'q',
+ 'r',
+ 'rpm',
+ 'rst',
+ 'ruby',
+ 'rust',
+ 'sas',
+ 'sass',
+ 'scheme',
+ 'shell',
+ 'sieve',
+ 'slim',
+ 'smalltalk',
+ 'smarty',
+ 'solr',
+ 'soy',
+ 'sparql',
+ 'spreadsheet',
+ 'sql',
+ 'stex',
+ 'stylus',
+ 'swift',
+ 'tcl',
+ 'textile',
+ 'tiddlywiki',
+ 'tiki',
+ 'toml',
+ 'tornado',
+ 'troff',
+ 'ttcn-cfg',
+ 'ttcn',
+ 'turtle',
+ 'twig',
+ 'vb',
+ 'vbscript',
+ 'velocity',
+ 'verilog',
+ 'vhdl',
+ 'vue',
+ 'webidl',
+ 'xml',
+ 'xquery',
+ 'yacas',
+ 'yaml-frontmatter',
+ 'yaml',
+ 'z80',
+]
+
+VERSION = '5.18.2'
+TOP = 'META-INF/resources/webjars/codemirror/%s' % VERSION
+TOP_MINIFIED = 'META-INF/resources/webjars/codemirror-minified/%s' % VERSION
+
+DIFF_MATCH_PATCH_VERSION = '20121119-1'
+DIFF_MATCH_PATCH_TOP = ('META-INF/resources/webjars/google-diff-match-patch/%s'
+ % DIFF_MATCH_PATCH_VERSION)
+
+def pkg_cm():
+ for archive, suffix, top in [
+ ('@codemirror_original//jar', '', TOP),
+ ('@codemirror_minified//jar', '_r', TOP_MINIFIED)
+ ]:
+ # Main JavaScript and addons
+ genrule2(
+ name = 'cm' + suffix,
+ cmd = ' && '.join([
+ "echo '/** @license' >$@",
+ 'unzip -p $(location %s) %s/LICENSE >>$@' % (archive, top),
+ "echo '*/' >>$@",
+ ] +
+ ['unzip -p $(location %s) %s/%s >>$@' % (archive, top, n) for n in CM_JS] +
+ ['unzip -p $(location %s) %s/addon/%s >>$@' % (archive, top, n)
+ for n in CM_ADDONS]
+ ),
+ tools = [
+ '@codemirror_original//jar',
+ '@codemirror_minified//jar',
+ ],
+ out = 'cm%s.js' % suffix,
+ )
+
+ # Main CSS
+ genrule2(
+ name = 'css' + suffix,
+ cmd = ' && '.join([
+ "echo '/** @license' >$@",
+ 'unzip -p $(location %s) %s/LICENSE >>$@' % (archive, top),
+ "echo '*/' >>$@",
+ ] +
+ ['unzip -p $(location %s) %s/%s >>$@' % (archive, top, n)
+ for n in CM_CSS]
+ ),
+ tools = [
+ '@codemirror_original//jar',
+ '@codemirror_minified//jar',
+ ],
+ out = 'cm%s.css' % suffix,
+ )
+
+ # Modes
+ for n in CM_MODES:
+ genrule2(
+ name = 'mode_%s%s' % (n, suffix),
+ cmd = ' && '.join([
+ "echo '/** @license' >$@",
+ 'unzip -p $(location %s) %s/LICENSE >>$@' % (archive, top),
+ "echo '*/' >>$@",
+ 'unzip -p $(location %s) %s/mode/%s/%s.js >>$@' % (archive, top, n, n),
+ ]
+ ),
+ tools = [
+ '@codemirror_original//jar',
+ '@codemirror_minified//jar',
+ ],
+ out = 'mode_%s%s.js' % (n, suffix),
+ )
+
+ # Themes
+ for n in CM_THEMES:
+ genrule2(
+ name = 'theme_%s%s' % (n, suffix),
+ cmd = ' && '.join([
+ "echo '/** @license' >$@",
+ 'unzip -p $(location %s) %s/LICENSE >>$@' % (archive, top),
+ "echo '*/' >>$@",
+ 'unzip -p $(location %s) %s/theme/%s.css >>$@' % (archive, top, n)
+ ]
+ ),
+ tools = [
+ '@codemirror_original//jar',
+ '@codemirror_minified//jar',
+ ],
+ out = 'theme_%s%s.css' % (n, suffix),
+ )
+
+ # Merge Addon bundled with diff-match-patch
+ genrule2(
+ name = 'addon_merge%s' % suffix,
+ cmd = ' && '.join([
+ "echo '/** @license' >$@",
+ 'unzip -p $(location %s) %s/LICENSE >>$@' % (archive, top),
+ "echo '*/\n' >>$@",
+ "echo '// The google-diff-match-patch library is from https://google-diff-match-patch.googlecode.com/svn-history/r106/trunk/javascript/diff_match_patch.js\n' >> $@",
+ "echo '/** @license' >>$@",
+ "echo 'LICENSE-Apache2.0' >>$@",
+ "echo '*/' >>$@",
+ 'unzip -p $(location @diff_match_patch//jar) %s/diff_match_patch.js >>$@' % DIFF_MATCH_PATCH_TOP,
+ "echo ';' >> $@",
+ 'unzip -p $(location %s) %s/addon/merge/merge.js >>$@' % (archive, top)
+ ]
+ ),
+ tools = [
+ '@diff_match_patch//jar',
+ '@codemirror_original//jar',
+ '@codemirror_minified//jar',
+ ],
+ out = 'addon_merge%s.js' % suffix,
+ )
+
+ # Jar packaging
+ genrule2(
+ name = 'jar' + suffix,
+ cmd = ' && '.join([
+ 'cd $$TMP',
+ 'mkdir -p net/codemirror/{addon,lib,mode,theme}',
+ 'cp $$ROOT/$(location :css%s) net/codemirror/lib/cm.css' % suffix,
+ 'cp $$ROOT/$(location :cm%s) net/codemirror/lib/cm.js' % suffix]
+ + ['cp $$ROOT/$(location :mode_%s%s) net/codemirror/mode/%s.js' % (n, suffix, n)
+ for n in CM_MODES]
+ + ['cp $$ROOT/$(location :theme_%s%s) net/codemirror/theme/%s.css' % (n, suffix, n)
+ for n in CM_THEMES]
+ + ['cp $$ROOT/$(location :addon_merge%s) net/codemirror/addon/merge_bundled.js' % suffix]
+ + ['zip -qr $$ROOT/$@ net/codemirror/{addon,lib,mode,theme}']),
+ tools = [
+ ':addon_merge%s' % suffix,
+ ':cm%s' % suffix,
+ ':css%s' % suffix,
+ ] + [
+ ':mode_%s%s' % (n, suffix) for n in CM_MODES
+ ] + [
+ ':theme_%s%s' % (n, suffix) for n in CM_THEMES
+ ],
+ out = 'codemirror%s.jar' % suffix,
+ )
+
+ native.java_import(
+ name = 'codemirror' + suffix,
+ jars = [':jar%s' % suffix],
+ visibility = ['//visibility:public'],
+ )
diff --git a/lib/gwt/BUILD b/lib/gwt/BUILD
index 2168bb4..bf04c95 100644
--- a/lib/gwt/BUILD
+++ b/lib/gwt/BUILD
@@ -7,3 +7,9 @@
'dev',
'user',
]]
+
+java_library(
+ name = 'javax-validation_src',
+ exports = ['@javax_validation_src//jar'],
+ visibility = ['//visibility:public'],
+)
diff --git a/lib/jetty/BUCK b/lib/jetty/BUCK
index cc22b80..e24cfe5 100644
--- a/lib/jetty/BUCK
+++ b/lib/jetty/BUCK
@@ -1,12 +1,12 @@
include_defs('//lib/maven.defs')
-VERSION = '9.2.14.v20151106'
+VERSION = '9.3.11.v20160721'
EXCLUDE = ['about.html']
maven_jar(
name = 'servlet',
id = 'org.eclipse.jetty:jetty-servlet:' + VERSION,
- sha1 = '3a2cd4d8351a38c5d60e0eee010fee11d87483ef',
+ sha1 = 'd550147b85c73ea81084a4ac7915ba7f609021c5',
license = 'Apache2.0',
deps = [':security'],
exclude = EXCLUDE,
@@ -15,7 +15,7 @@
maven_jar(
name = 'security',
id = 'org.eclipse.jetty:jetty-security:' + VERSION,
- sha1 = '2d36974323fcb31e54745c1527b996990835db67',
+ sha1 = '1cbefc5d1196b9e1ca6f4cc36738998a6ebde8bf',
license = 'Apache2.0',
deps = [':server'],
exclude = EXCLUDE,
@@ -25,7 +25,7 @@
maven_jar(
name = 'servlets',
id = 'org.eclipse.jetty:jetty-servlets:' + VERSION,
- sha1 = 'a75c78a0ee544073457ca5ee9db20fdc6ed55225',
+ sha1 = 'a9f7a43977151a463aa21a9b0e882aa3d25452ef',
license = 'Apache2.0',
exclude = EXCLUDE,
visibility = [
@@ -37,7 +37,7 @@
maven_jar(
name = 'server',
id = 'org.eclipse.jetty:jetty-server:' + VERSION,
- sha1 = '70b22c1353e884accf6300093362b25993dac0f5',
+ sha1 = 'd932e0dc1e9bd4839ae446754615163d60271a66',
license = 'Apache2.0',
exported_deps = [
':continuation',
@@ -49,7 +49,7 @@
maven_jar(
name = 'jmx',
id = 'org.eclipse.jetty:jetty-jmx:' + VERSION,
- sha1 = '617edc5e966b4149737811ef8b289cd94b831bab',
+ sha1 = '21a658d2f5eb87c23eef4911966625ea95f66d32',
license = 'Apache2.0',
exported_deps = [
':continuation',
@@ -61,7 +61,7 @@
maven_jar(
name = 'continuation',
id = 'org.eclipse.jetty:jetty-continuation:' + VERSION,
- sha1 = '8909d62fd7e28351e2da30de6fb4105539b949c0',
+ sha1 = '92a91c0dcc5f5d779a1c9f94038332be3f46c9df',
license = 'Apache2.0',
exclude = EXCLUDE,
)
@@ -69,7 +69,7 @@
maven_jar(
name = 'http',
id = 'org.eclipse.jetty:jetty-http:' + VERSION,
- sha1 = '699ad1f2fa6fb0717e1b308a8c9e1b8c69d81ef6',
+ sha1 = 'dcfb95e5b886a981bb76467b911c5b706117f9cf',
license = 'Apache2.0',
exported_deps = [':io'],
exclude = EXCLUDE,
@@ -78,7 +78,7 @@
maven_jar(
name = 'io',
id = 'org.eclipse.jetty:jetty-io:' + VERSION,
- sha1 = 'dfa4137371a3f08769820138ca1a2184dacda267',
+ sha1 = 'db5f4f481159894a4b670072a34917b5414d0c98',
license = 'Apache2.0',
exported_deps = [':util'],
exclude = EXCLUDE,
@@ -88,7 +88,7 @@
maven_jar(
name = 'util',
id = 'org.eclipse.jetty:jetty-util:' + VERSION,
- sha1 = '0057e00b912ae0c35859ac81594a996007706a0b',
+ sha1 = '1812ffd5a04698051180d582c146ca807760c808',
license = 'Apache2.0',
exclude = EXCLUDE,
visibility = [],
diff --git a/lib/jgit/org.eclipse.jgit.archive/BUCK b/lib/jgit/org.eclipse.jgit.archive/BUCK
index af0284f..7c967b3 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 = '73c3dd7d57c54b4ec95db6325e2d51dd3a0e6036',
+ sha1 = '2db2e7666672a31fa41b7e1dadcba51df6d30954',
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 c93ea99..06865cb 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 = 'a85e11f0f31f71a4e4e83313c4c24167e99d330c',
+ sha1 = '6e36638888918d9941dddec7e2abe1f162cc74d9',
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 9d4a2dd..77b637a 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 = 'cd7e83bb138d0c3dad9d2dea27c238824d056a4b',
+ sha1 = 'e8fb1d81f588c3174a9730bdecdbde9faa04140a',
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 da1ad9a..458703c 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 = '0bbcd8846f2731e50fccfb9f3ced43e2298844d4',
- src_sha1 = '72d8aa79f8e645bb44f9f2fe74d02c6021516261',
+ bin_sha1 = '3e3d0b73dcf4ad649f37758ea8502d92f3d299de',
+ src_sha1 = 'fc352952db91a4046e4b832145eb2dc8afce8db1',
license = 'jgit',
repository = REPO,
unsign = True,
diff --git a/plugins/cookbook-plugin b/plugins/cookbook-plugin
index fc39c55..23572e6 160000
--- a/plugins/cookbook-plugin
+++ b/plugins/cookbook-plugin
@@ -1 +1 @@
-Subproject commit fc39c552cffb94d15797d02e272fdc543c35b6bd
+Subproject commit 23572e6c83531fceea69c1356a5e1b6753ecf0e3
diff --git a/plugins/replication b/plugins/replication
index 5cac325..9411b6d 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit 5cac325cca171205130c53df8b3ee9ab3b115979
+Subproject commit 9411b6d9d37fbbd9a6bb98307bcb8f4f47c58f37
diff --git a/plugins/reviewnotes b/plugins/reviewnotes
index 46079ec..85069a4 160000
--- a/plugins/reviewnotes
+++ b/plugins/reviewnotes
@@ -1 +1 @@
-Subproject commit 46079ec92478ddc1e9ffd84eae22fb6af788c9fd
+Subproject commit 85069a4bd88b9a18c9df89c86229daf2a07cf345
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
index f91816b..0676595 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.js
@@ -211,13 +211,13 @@
_computeRevisionActionValues: function(actionsChangeRecord,
primariesChangeRecord, additionalActionsChangeRecord) {
return this._getActionValues(actionsChangeRecord, primariesChangeRecord,
- additionalActionsChangeRecord, 'revision');
+ additionalActionsChangeRecord, ActionType.REVISION);
},
_computeChangeActionValues: function(actionsChangeRecord,
primariesChangeRecord, additionalActionsChangeRecord) {
return this._getActionValues(actionsChangeRecord, primariesChangeRecord,
- additionalActionsChangeRecord, 'change');
+ additionalActionsChangeRecord, ActionType.CHANGE);
},
_getActionValues: function(actionsChangeRecord, primariesChangeRecord,
@@ -234,6 +234,15 @@
actions[a].__key = a;
actions[a].__type = type;
actions[a].__primary = primaryActionKeys.indexOf(a) !== -1;
+ if (actions[a].label === 'Delete') {
+ // This label is common within change and revision actions. Make it
+ // more explicit to the user.
+ if (type === ActionType.CHANGE) {
+ actions[a].label += ' Change';
+ } else if (type === ActionType.REVISION) {
+ actions[a].label += ' Revision';
+ }
+ }
// Triggers a re-render by ensuring object inequality.
// TODO(andybons): Polyfill for Object.assign.
result.push(Object.assign({}, actions[a]));
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.html b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.html
index 80aaf3b..9b04c8a 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions_test.html
@@ -38,6 +38,12 @@
stub('gr-rest-api-interface', {
getChangeRevisionActions: function() {
return Promise.resolve({
+ '/': {
+ method: 'DELETE',
+ label: 'Delete',
+ title: 'Delete draft revision 2',
+ enabled: true
+ },
cherrypick: {
method: 'POST',
label: 'Cherry Pick',
@@ -52,9 +58,9 @@
submit: {
method: 'POST',
label: 'Submit',
- title: 'Submit patch set 1 into master',
+ title: 'Submit patch set 2 into master',
enabled: true
- }
+ },
});
},
send: function(method, url, payload) {
@@ -79,18 +85,45 @@
element = fixture('basic');
element.changeNum = '42';
element.patchNum = '2';
+ element.actions = {
+ '/': {
+ method: 'DELETE',
+ label: 'Delete',
+ title: 'Delete draft change 42',
+ enabled: true
+ },
+ };
return element.reload();
});
- test('submit, rebase, and cherry-pick buttons show', function(done) {
+ test('buttons show', function(done) {
flush(function() {
var buttonEls = Polymer.dom(element.root).querySelectorAll('gr-button');
- assert.equal(buttonEls.length, 3);
+ assert.equal(buttonEls.length, 5);
assert.isFalse(element.hidden);
done();
});
});
+ test('delete buttons have explicit labels', function(done) {
+ flush(function() {
+ var buttonEls =
+ Polymer.dom(element.root).querySelectorAll('[data-action-key="/"]');
+ assert.equal(buttonEls.length, 2);
+ assert.notEqual(buttonEls[0].getAttribute('data-label'),
+ buttonEls[1].getAttribute['data-label']);
+ assert.isTrue(
+ buttonEls[0].getAttribute('data-label') === 'Delete Revision' ||
+ buttonEls[0].getAttribute('data-label') === 'Delete Change'
+ );
+ assert.isTrue(
+ buttonEls[1].getAttribute('data-label') === 'Delete Revision' ||
+ buttonEls[1].getAttribute('data-label') === 'Delete Change'
+ );
+ done();
+ });
+ });
+
test('submit change', function(done) {
flush(function() {
var submitButton = element.$$('gr-button[data-action-key="submit"]');
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html
index 1782061..84b2391 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html
@@ -37,6 +37,9 @@
color: #666;
font-weight: bold;
}
+ gr-editable-label {
+ max-width: 9em;
+ }
.labelValueContainer:not(:first-of-type) {
margin-top: .25em;
}
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 04c2c04..b5e1ef0 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
@@ -88,6 +88,10 @@
value: 'Reply',
computed: '_computeReplyButtonLabel(_diffDrafts.*)',
},
+ _initialLoadComplete: {
+ type: Boolean,
+ value: false,
+ },
},
behaviors: [
@@ -280,29 +284,66 @@
},
_paramsChanged: function(value) {
- if (value.view !== this.tagName.toLowerCase()) { return; }
+ if (value.view !== this.tagName.toLowerCase()) {
+ this._initialLoadComplete = false;
+ return;
+ }
- this._changeNum = value.changeNum;
- this._patchRange = {
+ var patchChanged = this._patchRange &&
+ (this._patchRange.patchNum !== value.patchNum ||
+ this._patchRange.basePatchNum !== value.basePatchNum);
+
+ if (this._changeNum !== value.changeNum) {
+ this._initialLoadComplete = false;
+ }
+
+ var patchRange = {
patchNum: value.patchNum,
basePatchNum: value.basePatchNum || 'PARENT',
};
+ if (this._initialLoadComplete && patchChanged) {
+ if (patchRange.patchNum == null) {
+ patchRange.patchNum = this._computeLatestPatchNum(this._allPatchSets);
+ }
+ this._patchRange = patchRange;
+ this._reloadPatchNumDependentResources().then(function() {
+ this.$.jsAPI.handleEvent(this.$.jsAPI.EventType.SHOW_CHANGE, {
+ change: this._change,
+ patchNum: patchRange.patchNum,
+ });
+ }.bind(this));
+ return;
+ }
+
+ this._changeNum = value.changeNum;
+ this._patchRange = patchRange;
+
this._reload().then(function() {
- // Allow the message list to render before scrolling.
- this.async(function() {
- this._maybeScrollToMessage();
- }.bind(this), 1);
-
- this._maybeShowReplyDialog();
-
- this.$.jsAPI.handleEvent(this.$.jsAPI.EventType.SHOW_CHANGE, {
- change: this._change,
- patchNum: this._patchRange.patchNum,
- });
+ this._performPostLoadTasks();
}.bind(this));
},
+ _performPostLoadTasks: function() {
+ // Allow the message list and related changes to render before scrolling.
+ // Related changes are loaded here (after everything else) because they
+ // take the longest and are secondary information. Because the element may
+ // alter the total height of the page, the call to potentially scroll to
+ // a linked message is performed after related changes is fully loaded.
+ this.$.relatedChanges.reload().then(function() {
+ this.async(function() { this._maybeScrollToMessage(); }, 1);
+ }.bind(this));
+
+ this._maybeShowReplyDialog();
+
+ this.$.jsAPI.handleEvent(this.$.jsAPI.EventType.SHOW_CHANGE, {
+ change: this._change,
+ patchNum: this._patchRange.patchNum,
+ });
+
+ this._initialLoadComplete = true;
+ },
+
_paramsAndChangeChanged: function(value) {
// If the change number or patch range is different, then reset the
// selected file index.
@@ -604,32 +645,46 @@
}.bind(this));
this._getComments();
- var reloadPatchNumDependentResources = function() {
- return Promise.all([
- this._getCommitInfo(),
- this.$.fileList.reload(),
- ]);
- }.bind(this);
- var reloadDetailDependentResources = function() {
- if (!this._change) { return Promise.resolve(); }
+ if (this._patchRange.patchNum) {
+ return this._reloadPatchNumDependentResources().then(function() {
+ return detailCompletes;
+ }).then(function() {
+ return this._reloadDetailDependentResources();
+ }.bind(this));
+ } else {
+ // The patch number is reliant on the change detail request.
+ return detailCompletes.then(function() {
+ this._reloadPatchNumDependentResources();
+ }.bind(this)).then(function() {
+ this._reloadDetailDependentResources();
+ }.bind(this));
+ }
+ },
+ /**
+ * Kicks off requests for resources that rely on the change detail
+ * (`this._change`) being loaded.
+ */
+ _reloadDetailDependentResources: function() {
+ if (!this._change) { return Promise.resolve(); }
+
+ return this._getProjectConfig().then(function() {
return Promise.all([
this._getLatestCommitMessage(),
this.$.actions.reload(),
- this.$.relatedChanges.reload(),
- this._getProjectConfig(),
]);
- }.bind(this);
+ }.bind(this));
+ },
- if (this._patchRange.patchNum) {
- return reloadPatchNumDependentResources().then(function() {
- return detailCompletes;
- }).then(reloadDetailDependentResources);
- } else {
- // The patch number is reliant on the change detail request.
- return detailCompletes.then(reloadPatchNumDependentResources).then(
- reloadDetailDependentResources);
- }
+ /**
+ * Kicks off requests for resources that rely on the patch range
+ * (`this._patchRange`) being defined.
+ */
+ _reloadPatchNumDependentResources: function() {
+ return Promise.all([
+ this._getCommitInfo(),
+ this.$.fileList.reload(),
+ ]);
},
});
})();
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 1c36958..04e0bc01 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
@@ -310,6 +310,31 @@
element.fire('change', {}, {node: selectEl});
});
+ test('don’t reload entire page when patchRange changes', function() {
+ var reloadStub = sinon.stub(element, '_reload',
+ function() { return Promise.resolve(); });
+ var reloadPatchDependentStub = sinon.stub(element,
+ '_reloadPatchNumDependentResources',
+ function() { return Promise.resolve(); });
+
+ var value = {
+ view: 'gr-change-view',
+ patchNum: '1',
+ };
+ element._paramsChanged(value);
+ assert.isTrue(reloadStub.calledOnce);
+ element._initialLoadComplete = true;
+
+ value.basePatchNum = '1';
+ value.patchNum = '2';
+ element._paramsChanged(value);
+ assert.isFalse(reloadStub.calledTwice);
+ assert.isTrue(reloadPatchDependentStub.calledOnce);
+
+ reloadStub.restore();
+ reloadPatchDependentStub.restore();
+ });
+
test('change status new', function() {
element._changeNum = '1';
element._patchRange = {
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 8f53cf0..aff635c 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
@@ -126,9 +126,10 @@
},
_handlePatchChange: function(e) {
- this.set('patchRange.basePatchNum', Polymer.dom(e).rootTarget.value);
+ var patchRange = Object.assign({}, this.patchRange);
+ patchRange.basePatchNum = Polymer.dom(e).rootTarget.value;
page.show('/c/' + encodeURIComponent(this.changeNum) + '/' +
- encodeURIComponent(this._patchRangeStr(this.patchRange)));
+ encodeURIComponent(this._patchRangeStr(patchRange)));
},
_forEachDiff: function(fn) {
diff --git a/polygerrit-ui/app/elements/gr-app.html b/polygerrit-ui/app/elements/gr-app.html
index 25dfaff..051ee2e 100644
--- a/polygerrit-ui/app/elements/gr-app.html
+++ b/polygerrit-ui/app/elements/gr-app.html
@@ -126,9 +126,11 @@
|
<a class="feedback"
href="https://bugs.chromium.org/p/gerrit/issues/entry?template=PolyGerrit%20Issue"
- target="_blank">
- Report PolyGerrit Bug
- </a>
+ target="_blank">Report PolyGerrit Bug</a>
+ <template is="dom-if" if="[[_computeShowGwtUiLink(_serverConfig)]]">
+ |
+ <a href="/?polygerrit=0" rel="external">GWT UI</a>
+ </template>
</footer>
<gr-overlay id="keyboardShortcuts" with-backdrop>
<gr-keyboard-shortcuts-dialog
diff --git a/polygerrit-ui/app/elements/gr-app.js b/polygerrit-ui/app/elements/gr-app.js
index f24ecfd..84467a0 100644
--- a/polygerrit-ui/app/elements/gr-app.js
+++ b/polygerrit-ui/app/elements/gr-app.js
@@ -127,6 +127,11 @@
return !!(account && Object.keys(account).length > 0);
},
+ _computeShowGwtUiLink: function(config) {
+ return config.gerrit.web_uis &&
+ config.gerrit.web_uis.indexOf('GWT') !== -1;
+ },
+
_handlePageError: function(e) {
[
'_showChangeListView',
diff --git a/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_test.html b/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_test.html
index 66576a3..09f7381 100644
--- a/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_test.html
+++ b/polygerrit-ui/app/elements/settings/gr-watched-projects-editor/gr-watched-projects-editor_test.html
@@ -138,7 +138,7 @@
assert.isFalse(element._canAddProject({id: 'project b'}, 'filter 1'));
assert.isFalse(element._canAddProject({id: 'project b'}, 'filter 2'));
- // Can add a projec that is in the list using a new filter.
+ // Can add a project that is in the list using a new filter.
assert.isTrue(element._canAddProject({id: 'project b'}, 'filter 3'));
});
@@ -181,10 +181,11 @@
test('_handleRemoveProject', function() {
assert.equal(element._projectsToRemove, 0);
-
var button = element.$$('table tbody tr:nth-child(2) gr-button');
MockInteractions.tap(button);
+ flushAsynchronousOperations();
+
var rows = element.$$('table tbody').querySelectorAll('tr');
assert.equal(rows.length, 3);
diff --git a/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.html b/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.html
index 76a9c77..4fec27f 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.html
+++ b/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.html
@@ -18,14 +18,19 @@
<dom-module id="gr-editable-label">
<template>
<style>
+ :host {
+ display: inline-block;
+ }
+ input,
+ label {
+ width: 100%;
+ }
input {
font: inherit;
- max-width: 8em;
}
label {
color: #777;
display: inline-block;
- max-width: 8em;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
index d22622a..ab497c1 100644
--- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
+++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.js
@@ -470,25 +470,21 @@
},
getSuggestedGroups: function(inputVal, opt_n, opt_errFn, opt_ctx) {
- return this.fetchJSON('/groups/', opt_errFn, opt_ctx, {
- s: inputVal,
- n: opt_n,
- });
+ var params = {s: inputVal};
+ if (opt_n) { params.n = opt_n; }
+ return this.fetchJSON('/groups/', opt_errFn, opt_ctx, params);
},
getSuggestedProjects: function(inputVal, opt_n, opt_errFn, opt_ctx) {
- return this.fetchJSON('/projects/', opt_errFn, opt_ctx, {
- p: inputVal,
- n: opt_n,
- });
+ var params = {p: inputVal};
+ if (opt_n) { params.n = opt_n; }
+ return this.fetchJSON('/projects/', opt_errFn, opt_ctx, params);
},
getSuggestedAccounts: function(inputVal, opt_n, opt_errFn, opt_ctx) {
- return this.fetchJSON('/accounts/', opt_errFn, opt_ctx, {
- q: inputVal,
- n: opt_n,
- suggest: null,
- });
+ var params = {q: inputVal, suggest: null};
+ if (opt_n) { params.n = opt_n; }
+ return this.fetchJSON('/accounts/', opt_errFn, opt_ctx, params);
},
addChangeReviewer: function(changeNum, reviewerID) {
@@ -551,7 +547,7 @@
].join(' ');
var params = {
O: options,
- q: query
+ q: query,
};
return this.fetchJSON('/changes/', null, null, params);
},
diff --git a/tools/GoogleFormat.xml b/tools/GoogleFormat.xml
index 8062246..2c65b16 100644
--- a/tools/GoogleFormat.xml
+++ b/tools/GoogleFormat.xml
@@ -45,7 +45,7 @@
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
-<setting id="org.eclipse.jdt.core.compiler.source" value="1.7"/>
+<setting id="org.eclipse.jdt.core.compiler.source" value="1.8"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
@@ -156,7 +156,7 @@
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
-<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.7"/>
+<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.8"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
@@ -227,7 +227,7 @@
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.7"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.8"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="true"/>
diff --git a/tools/bzl/gwt.bzl b/tools/bzl/gwt.bzl
index 29987ef..c27e28f 100644
--- a/tools/bzl/gwt.bzl
+++ b/tools/bzl/gwt.bzl
@@ -19,8 +19,6 @@
def gwt_module(gwt_xml=None, resources=[], srcs=[], **kwargs):
if gwt_xml:
resources += [gwt_xml]
- if srcs:
- resources += srcs
java_library2(
srcs = srcs,
diff --git a/tools/bzl/javadoc.bzl b/tools/bzl/javadoc.bzl
new file mode 100644
index 0000000..80771da
--- /dev/null
+++ b/tools/bzl/javadoc.bzl
@@ -0,0 +1,71 @@
+# 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.
+
+# Javadoc rule.
+
+def _impl(ctx):
+ zip_output = ctx.outputs.zip
+
+ transitive_jar_set = set()
+ source_jars = set()
+ for l in ctx.attr.libs:
+ source_jars += l.java.source_jars
+ transitive_jar_set += l.java.transitive_deps
+
+ transitive_jar_paths = [j.path for j in transitive_jar_set]
+ dir = ctx.outputs.zip.path + ".dir"
+ source = ctx.outputs.zip.path + ".source"
+ cmd = [
+ "mkdir %s" % source,
+ " && ".join(["unzip -qud %s %s" % (source, j.path) for j in source_jars]),
+ "mkdir %s" % dir,
+ " ".join([
+ ctx.file._javadoc.path,
+ "-protected",
+ "-encoding UTF-8",
+ "-charset UTF-8",
+ "-notimestamp",
+ "-quiet",
+ "-windowtitle '%s'" % ctx.attr.title,
+ "-link", "http://docs.oracle.com/javase/7/docs/api",
+ "-sourcepath %s" % source,
+ "-subpackages ",
+ ":".join(ctx.attr.pkgs),
+ " -classpath ",
+ ":".join(transitive_jar_paths),
+ "-d %s" % dir]),
+ "find %s -exec touch -t 198001010000 '{}' ';'" % dir,
+ "(cd %s && zip -qr ../%s *)" % (dir, ctx.outputs.zip.basename),
+ ]
+ ctx.action(
+ inputs = list(transitive_jar_set) + list(source_jars) + ctx.files._jdk,
+ outputs = [zip_output],
+ command = " && ".join(cmd))
+
+java_doc = rule(
+ attrs = {
+ "libs": attr.label_list(allow_files = False),
+ "pkgs": attr.string_list(),
+ "title": attr.string(),
+ "_javadoc": attr.label(
+ default = Label("@local_jdk//:bin/javadoc"),
+ single_file = True,
+ allow_files = True),
+ "_jdk": attr.label(
+ default = Label("@local_jdk//:jdk-default"),
+ allow_files = True),
+ },
+ implementation = _impl,
+ outputs = {"zip" : "%{name}.zip"},
+)
diff --git a/tools/bzl/pkg_war.bzl b/tools/bzl/pkg_war.bzl
new file mode 100644
index 0000000..8c3c6cb
--- /dev/null
+++ b/tools/bzl/pkg_war.bzl
@@ -0,0 +1,139 @@
+# 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.
+
+# War packaging.
+
+jar_filetype = FileType(['.jar'])
+
+LIBS = [
+ '//gerrit-war:init',
+ '//gerrit-war:log4j-config',
+ '//gerrit-war:version',
+ '//lib:postgresql',
+ '//lib/log:impl_log4j',
+]
+
+PGMLIBS = [
+ '//gerrit-pgm:pgm'
+]
+
+def _add_context(in_file, output):
+ input_path = in_file.path
+ return [
+ 'unzip -qd %s %s' % (output, input_path)
+ ]
+
+def _add_file(in_file, output):
+ output_path = output
+ input_path = in_file.path
+ short_path = in_file.short_path
+ n = in_file.basename
+
+ # TODO(davido): Drop this when provided_deps added to java_library
+ if n.find('-jdk15on-') != -1:
+ return []
+
+ if short_path.startswith('gerrit-'):
+ n = short_path.split('/')[0] + '-' + n
+
+ output_path += n
+ return [
+ 'test -L %s || ln -s $(pwd)/%s %s' % (output_path, input_path, output_path)
+ ]
+
+def _make_war(input_dir, output):
+ return ''.join([
+ '(root=$(pwd) && ',
+ 'cd %s && ' % input_dir,
+ 'zip -9qr ${root}/%s .)' % (output.path),
+ ])
+
+def _war_impl(ctx):
+ war = ctx.outputs.war
+ build_output = war.path + '.build_output'
+ inputs = []
+
+ # Create war layout
+ cmd = [
+ 'set -e;rm -rf ' + build_output,
+ 'mkdir -p ' + build_output,
+ 'mkdir -p %s/WEB-INF/lib' % build_output,
+ 'mkdir -p %s/WEB-INF/pgm-lib' % build_output,
+ ]
+
+ # Add lib
+ transitive_lib_deps = set()
+ for l in ctx.attr.libs:
+ transitive_lib_deps += l.java.transitive_runtime_deps
+
+ for dep in transitive_lib_deps:
+ cmd += _add_file(dep, build_output + '/WEB-INF/lib/')
+ inputs.append(dep)
+
+ # Add pgm lib
+ transitive_pgmlib_deps = set()
+ for l in ctx.attr.pgmlibs:
+ transitive_pgmlib_deps += l.java.transitive_runtime_deps
+
+ for dep in transitive_pgmlib_deps:
+ if dep not in inputs:
+ cmd += _add_file(dep, build_output + '/WEB-INF/pgm-lib/')
+ inputs.append(dep)
+
+ # Add context
+ transitive_context_deps = set()
+ if ctx.attr.context:
+ for jar in ctx.attr.context:
+ if hasattr(jar, 'java'):
+ transitive_context_deps += jar.java.transitive_runtime_deps
+ elif hasattr(jar, 'files'):
+ transitive_context_deps += jar.files
+ for dep in transitive_context_deps:
+ cmd += _add_context(dep, build_output)
+ inputs.append(dep)
+
+ # Add zip war
+ cmd.append(_make_war(build_output, war))
+
+ ctx.action(
+ inputs = inputs,
+ outputs = [war],
+ mnemonic = 'WAR',
+ command = '\n'.join(cmd),
+ use_default_shell_env = True,
+ )
+
+_pkg_war = rule(
+ attrs = {
+ 'context': attr.label_list(allow_files = True),
+ 'libs': attr.label_list(allow_files = jar_filetype),
+ 'pgmlibs': attr.label_list(allow_files = False),
+ },
+ implementation = _war_impl,
+ outputs = {'war' : '%{name}.war'},
+)
+
+def pkg_war(name, ui = 'ui_optdbg'):
+ ui_deps = []
+ if ui:
+ ui_deps.append('//gerrit-gwtui:%s' % ui)
+ _pkg_war(
+ name = name,
+ libs = LIBS,
+ pgmlibs = PGMLIBS,
+ context = ui_deps + [
+ '//gerrit-main:main_bin_deploy.jar',
+ '//gerrit-war:webapp_assets',
+ ],
+ )
diff --git a/tools/default.defs b/tools/default.defs
index 191dfe5..fb4c6de 100644
--- a/tools/default.defs
+++ b/tools/default.defs
@@ -201,7 +201,7 @@
':%s__gwt_application' % name +
';cd $TMP' +
';zip -qr $OUT .',
- out = '%s-static.zip' % name,
+ out = '%s-static.jar' % name,
)
gwt_binary(
name = name + '__gwt_application',
diff --git a/tools/eclipse/BUCK b/tools/eclipse/BUCK
index a8b3f01..dfd271d 100644
--- a/tools/eclipse/BUCK
+++ b/tools/eclipse/BUCK
@@ -15,6 +15,7 @@
'//gerrit-reviewdb:client_tests',
'//gerrit-server:server',
'//gerrit-server:server_tests',
+ '//lib:jimfs',
'//lib/asciidoctor:asciidoc_lib',
'//lib/asciidoctor:doc_indexer_lib',
'//lib/auto:auto-value',
diff --git a/tools/eclipse/project.py b/tools/eclipse/project.py
index 46f5680..3d34588 100755
--- a/tools/eclipse/project.py
+++ b/tools/eclipse/project.py
@@ -28,7 +28,7 @@
JRE = '/'.join([
'org.eclipse.jdt.launching.JRE_CONTAINER',
'org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType',
- 'JavaSE-1.7',
+ 'JavaSE-1.8',
])
ROOT = path.abspath(__file__)
diff --git a/tools/java_doc.defs b/tools/java_doc.defs
index 2bf27cf..583407c6 100644
--- a/tools/java_doc.defs
+++ b/tools/java_doc.defs
@@ -10,13 +10,14 @@
):
# TODO(davido): Actually we shouldn't need to extract the source
# archive, javadoc should just work with provided archive.
- external_docs.insert(0, 'http://docs.oracle.com/javase/7/docs/api')
+ external_docs.insert(0, 'http://docs.oracle.com/javase/8/docs/api')
genrule(
name = name,
cmd = ' '.join([
'mkdir $TMP/sourcepath &&',
'unzip $(location %s) -d $TMP/sourcepath &&' % source_jar,
'javadoc',
+ '-Xdoclint:-missing',
'-quiet',
'-protected',
'-encoding UTF-8',