Merge branch 'stable-2.9'
* stable-2.9:
Include gerrit.war in api_{install,deploy}
Change-Id: I5f9222d82ec252a3cc3ee00b7e5a0f1feec64d2b
diff --git a/.buckconfig b/.buckconfig
index 4eb5e85..df8bfdc 100644
--- a/.buckconfig
+++ b/.buckconfig
@@ -1,10 +1,14 @@
[alias]
+ all = //:all
api = //:api
api_deploy = //tools/maven:deploy
api_install = //tools/maven:install
+ chrome = //:chrome
docs = //Documentation:html
+ firefox = //:firefox
gerrit = //:gerrit
release = //:release
+ safari = //:safari
withdocs = //:withdocs
[buildfile]
diff --git a/.buckversion b/.buckversion
index ff1c137..cec726d 100644
--- a/.buckversion
+++ b/.buckversion
@@ -1 +1 @@
-2b80cf780ae31bee6609ebc1bbab9ce6fd004dbe
+1ba4496a782b40dec33a42e69a74837afee06177
diff --git a/.gitignore b/.gitignore
index efff6da..9cfedb7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,4 @@
/local.properties
*.pyc
/gwt-unitCache
+*.swp
diff --git a/BUCK b/BUCK
index 5165efe..5a38439 100644
--- a/BUCK
+++ b/BUCK
@@ -3,6 +3,7 @@
gerrit_war(name = 'gerrit')
gerrit_war(name = 'chrome', ui = 'ui_chrome')
gerrit_war(name = 'firefox', ui = 'ui_firefox')
+gerrit_war(name = 'safari', ui = 'ui_safari')
gerrit_war(name = 'withdocs', docs = True)
gerrit_war(name = 'release', docs = True, context = ['//plugins:core.zip'], visibility = ['//tools/maven:'])
@@ -27,3 +28,13 @@
deps = API_DEPS,
out = 'api.zip',
)
+
+genrule(
+ name = 'all',
+ cmd = 'echo done >$OUT',
+ deps = [
+ ':api',
+ ':release',
+ ],
+ out = '__fake.all__',
+)
diff --git a/Documentation/asciidoc.defs b/Documentation/asciidoc.defs
index 0175431..b361d48 100644
--- a/Documentation/asciidoc.defs
+++ b/Documentation/asciidoc.defs
@@ -23,7 +23,6 @@
EXPN = '.expn'
asciidoc = [
- 'cd $SRCDIR;',
'$(exe //lib/asciidoctor:asciidoc)',
'-z', '$OUT',
'--tmp', '$TMP',
@@ -49,7 +48,7 @@
genrule(
name = ex,
cmd = '$(exe :replace_macros) --suffix=' + EXPN +
- ' -s $SRCDIR/%s' % fn +
+ ' -s %s' % fn +
' -o $OUT',
srcs = [src],
deps = tx + [':replace_macros'],
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index b205eed..0b7eaeb 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -1329,6 +1329,22 @@
If `download.scheme` is not specified, SSH, HTTP and Anonymous HTTP
downloads are allowed.
+[[download.archive]]download.archive::
++
+Specifies which archive formats, if any, should be offered on the change
+screen:
++
+----
+[download]
+ archive = tar
+ archive = tbz2
+ archive = tgz
+ archive = txz
+----
+
+If `download.archive` is not specified defaults to all archive
+commands. Set to `off` or empty string to disable.
+
[[gerrit]]
=== Section gerrit
@@ -1350,6 +1366,13 @@
+
Defaults to `All-Projects` if not set.
+[[gerrit.allUsers]]gerrit.allUsers::
++
+Name of the project in which meta data of all users is stored.
+The name is relative to `gerrit.basePath`.
++
+Defaults to `All-Users` if not set.
+
[[gerrit.canonicalWebUrl]]gerrit.canonicalWebUrl::
+
The default URL for Gerrit to be accessed through.
@@ -1886,6 +1909,12 @@
If the file doesn't exist or can't be read the default robots.txt file
bundled with the .war will be used instead.
+[[httpd.registerMBeans]]httpd.registerMBeans::
++
+Enable (or disable) registration of Jetty MBeans for Java JMX.
++
+By default, false.
+
[[index]]
=== Section index
diff --git a/Documentation/config-hooks.txt b/Documentation/config-hooks.txt
index 0f4d094..4635f80 100644
--- a/Documentation/config-hooks.txt
+++ b/Documentation/config-hooks.txt
@@ -41,7 +41,7 @@
changes and drafts).
====
- patchset-created --change <change id> --is-draft <boolean> --change-url <change url> --project <project name> --branch <branch> --topic <topic> --uploader <uploader> --commit <sha1> --patchset <patchset id>
+ patchset-created --change <change id> --is-draft <boolean> --change-url <change url> --change-owner <change owner> --project <project name> --branch <branch> --topic <topic> --uploader <uploader> --commit <sha1> --patchset <patchset id>
====
=== draft-published
@@ -49,7 +49,7 @@
This is called whenever a draft change is published.
====
- draft-published --change <change id> --change-url <change url> --project <project name> --branch <branch> --topic <topic> --uploader <uploader> --commit <sha1> --patchset <patchset id>
+ draft-published --change <change id> --change-url <change url> --change-owner <change owner> --project <project name> --branch <branch> --topic <topic> --uploader <uploader> --commit <sha1> --patchset <patchset id>
====
=== comment-added
@@ -57,7 +57,7 @@
This is called whenever a comment is added to a change.
====
- comment-added --change <change id> --is-draft <boolean> --change-url <change url> --project <project name> --branch <branch> --topic <topic> --author <comment author> --commit <commit> --comment <comment> [--<approval category id> <score> --<approval category id> <score> ...]
+ comment-added --change <change id> --is-draft <boolean> --change-url <change url> --change-owner <change owner> --project <project name> --branch <branch> --topic <topic> --author <comment author> --commit <commit> --comment <comment> [--<approval category id> <score> --<approval category id> <score> ...]
====
=== change-merged
@@ -65,7 +65,7 @@
Called whenever a change has been merged.
====
- change-merged --change <change id> --change-url <change url> --project <project name> --branch <branch> --topic <topic> --submitter <submitter> --commit <sha1>
+ change-merged --change <change id> --change-url <change url> --change-owner <change owner> --project <project name> --branch <branch> --topic <topic> --submitter <submitter> --commit <sha1>
====
=== merge-failed
@@ -73,7 +73,7 @@
Called whenever a change has failed to merge.
====
- merge-failed --change <change id> --change-url <change url> --project <project name> --branch <branch> --topic <topic> --submitter <submitter> --commit <sha1> --reason <reason>
+ merge-failed --change <change id> --change-url <change url> --change-owner <change owner> --project <project name> --branch <branch> --topic <topic> --submitter <submitter> --commit <sha1> --reason <reason>
====
=== change-abandoned
@@ -81,7 +81,7 @@
Called whenever a change has been abandoned.
====
- change-abandoned --change <change id> --change-url <change url> --project <project name> --branch <branch> --topic <topic> --abandoner <abandoner> --commit <sha1> --reason <reason>
+ change-abandoned --change <change id> --change-url <change url> --change-owner <change owner> --project <project name> --branch <branch> --topic <topic> --abandoner <abandoner> --commit <sha1> --reason <reason>
====
=== change-restored
@@ -89,7 +89,7 @@
Called whenever a change has been restored.
====
- change-restored --change <change id> --change-url <change url> --project <project name> --branch <branch> --topic <topic> --restorer <restorer> --commit <sha1> --reason <reason>
+ change-restored --change <change id> --change-url <change url> --change-owner <change owner> --project <project name> --branch <branch> --topic <topic> --restorer <restorer> --commit <sha1> --reason <reason>
====
=== ref-updated
@@ -105,7 +105,7 @@
Called whenever a reviewer is added to a change.
====
- reviewer-added --change <change id> --change-url <change url> --project <project name> --branch <branch> --reviewer <reviewer>
+ reviewer-added --change <change id> --change-url <change url> --change-owner <change owner> --project <project name> --branch <branch> --reviewer <reviewer>
====
=== topic-changed
@@ -113,7 +113,7 @@
Called whenever a change's topic is changed from the Web UI or via the REST API.
====
- topic-changed --change <change id> --project <project name> --branch <branch> --changer <changer> --old-topic <old topic> --new-topic <new topic>
+ topic-changed --change <change id> --change-owner <change owner> --project <project name> --branch <branch> --changer <changer> --old-topic <old topic> --new-topic <new topic>
====
=== cla-signed
diff --git a/Documentation/config-labels.txt b/Documentation/config-labels.txt
index fc25f22..0fe12ca 100644
--- a/Documentation/config-labels.txt
+++ b/Documentation/config-labels.txt
@@ -169,6 +169,20 @@
optional leading `+`.
+[[label_defaultValue]]
+=== `label.Label-Name.defaultValue`
+
+The default value (or score) for the label. The defaultValue must be
+within the range of valid label values. It is an optional label setting,
+if not defined the defaultValue for the label will be 0. When a
+defaultValue is defined, that value will get set in the Reply dialog
+by default.
+
+A defaultValue can be set to a score that is outside of the permissible
+range for a user. In that case the score that will get set in the Reply
+box will be either the lowest or highest score in the permissible range.
+
+
[[label_abbreviation]]
=== `label.Label-Name.abbreviation`
@@ -297,6 +311,32 @@
copyright` will block submit, while `+1 Copyright clear` is required to
enable submit.
+=== Default Value Example
+
+This example attempts to describe how a label default value works with the
+user permissions. Assume the configuration below.
+
+====
+ [access "refs/heads/*"]
+ label-Snarky-Review = -3..+3 group Administrators
+ label-Snarky-Review = -2..+2 group Project Owners
+ label-Snarky-Review = -1..+1 group Registered Users
+ [label "Snarky-Review"]
+ value = -3 Ohh, hell no!
+ value = -2 Hmm, I'm not a fan
+ value = -1 I'm not sure I like this
+ value = 0 No score
+ value = +1 I like, but need another to like it as well
+ value = +2 Hmm, this is pretty nice
+ value = +3 Ohh, hell yes!
+ defaultValue = -3
+====
+
+Upon clicking the Reply button:
+* Administrators have all scores (-3..+3) available, -3 is set as the default.
+* Project Owners have limited scores (-2..+2) available, -2 is set as the default.
+* Registered Users have limited scores (-1..+1) available, -1 is set as the default.
+
GERRIT
------
Part of link:index.html[Gerrit Code Review]
diff --git a/Documentation/config-project-config.txt b/Documentation/config-project-config.txt
index 2fb256f..64fa9c4 100644
--- a/Documentation/config-project-config.txt
+++ b/Documentation/config-project-config.txt
@@ -171,6 +171,21 @@
documentation for a full list of available access rights.
+[[mimetype-section]]
+=== MIME Types section
+
+The +mimetype+ section may be configured to force the web code
+reviewer to return certain MIME types by file path. MIME types
+may be used to activate syntax highlighting.
+
+----
+[mimetype "text/x-c"]
+ path = *.pkt
+[mimetype "text/x-java"]
+ path = api/current.txt
+----
+
+
[[capability-section]]
=== Capability section
diff --git a/Documentation/dev-buck.txt b/Documentation/dev-buck.txt
index 3d6101c..10d0640 100644
--- a/Documentation/dev-buck.txt
+++ b/Documentation/dev-buck.txt
@@ -259,6 +259,15 @@
buck-out/gen/release.war
----
+[[all]]
+=== Combined build target
+
+To build release and api targets, a combined build target is provided:
+
+----
+ buck build all
+----
+
[[tests]]
== Running Unit Tests
@@ -274,6 +283,21 @@
buck test --all --exclude slow
----
+To include a specific group of acceptance tests:
+
+----
+ buck test --all --include api
+----
+
+The following groups of tests are currently supported:
+
+* api
+* git
+* pgm
+* rest
+* server
+* ssh
+
To run a specific test, e.g. the acceptance test
`com.google.gerrit.acceptance.git.HttpPushForReviewIT`:
diff --git a/Documentation/dev-plugins.txt b/Documentation/dev-plugins.txt
index eaf9a1d..ec98a91 100644
--- a/Documentation/dev-plugins.txt
+++ b/Documentation/dev-plugins.txt
@@ -36,7 +36,7 @@
----
mvn archetype:generate -DarchetypeGroupId=com.google.gerrit \
-DarchetypeArtifactId=gerrit-plugin-archetype \
- -DarchetypeVersion=2.9-SNAPSHOT \
+ -DarchetypeVersion=2.10-SNAPSHOT \
-DgroupId=com.googlesource.gerrit.plugins.testplugin \
-DartifactId=testplugin
----
@@ -1707,6 +1707,42 @@
The download schemes and download commands which are used most often
are provided by the Gerrit core plugin `download-commands`.
+[[links-to-external-tools]]
+== Links To External Tools
+
+Gerrit has extension points that enables development of a
+light-weight plugin that links commits to external
+tools (GitBlit, CGit, company specific resources etc).
+
+PatchSetWebLinks will appear to the right of the commit-SHA1 in the UI.
+
+[source, java]
+----
+import com.google.gerrit.extensions.annotations.Listen;
+import com.google.gerrit.extensions.webui.PatchSetWebLink;;
+
+@Listen
+public class MyWeblinkPlugin implements PatchSetWebLink {
+
+ private String name = "MyLink";
+ private String placeHolderUrlProjectCommit = "http://my.tool.com/project=%s/commit=%s";
+
+ @Override
+ public String getLinkName() {
+ return name ;
+ }
+
+ @Override
+ public String getPatchSetUrl(String project, String commit) {
+ return String.format(placeHolderUrlProjectCommit, project, commit);
+ }
+
+}
+----
+
+ProjectWebLinks will appear in the project list in the
+`Repository Browser` column.
+
[[documentation]]
== Documentation
diff --git a/Documentation/dev-readme.txt b/Documentation/dev-readme.txt
index 2b0cda8..da1ca70 100644
--- a/Documentation/dev-readme.txt
+++ b/Documentation/dev-readme.txt
@@ -50,15 +50,24 @@
refer to: link:dev-buck.html#eclipse[Eclipse integration with Buck].
+== Configuring IntelliJ IDEA
+
+To use IntelliJ IDEA for development, the easiest way is to follow
+Eclipse integration and then open it as Eclipse project in IDEA.
+You need the Eclipse plugin activated in IntelliJ IDEA.
+
+
== Mac OS X
-On Mac OS X ensure "Java For Mac OS X 10.5 Upate 4" (or later) has
-been installed, and that `JAVA_HOME` is set to
-"/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home".
-Check the installed version by running `java -version` and looking
-for 'build 1.6.0_13-b03-211'. Versions of Java 6 prior to this
-version crash during the build due to a bug in the JIT compiler.
+On Mac OS X ensure "Java For Mac OS X 10.5 Update 4" (or later) has
+been installed, and that `JAVA_HOME` is set to the
+link:install.html#Requirements[required Java version].
+Java installations can typically be found in
+"/System/Library/Frameworks/JavaVM.framework/Versions".
+
+You can check the installed Java version by running `java -version` in
+the terminal.
[[init]]
== Site Initialization
diff --git a/Documentation/gen_licenses.py b/Documentation/gen_licenses.py
index fb03526..d67b2a5 100755
--- a/Documentation/gen_licenses.py
+++ b/Documentation/gen_licenses.py
@@ -18,6 +18,7 @@
from __future__ import print_function
from collections import defaultdict, deque
+from os import chdir, path
import re
from shutil import copyfileobj
from subprocess import Popen, PIPE
@@ -27,6 +28,8 @@
def parse_graph():
graph = defaultdict(list)
+ while not path.isfile('.buckconfig'):
+ chdir('..')
p = Popen(
['buck', 'audit', 'classpath', '--dot'] + MAIN,
stdout = PIPE)
diff --git a/Documentation/install-j2ee.txt b/Documentation/install-j2ee.txt
index 50eccc2..4f438e5 100644
--- a/Documentation/install-j2ee.txt
+++ b/Documentation/install-j2ee.txt
@@ -109,6 +109,21 @@
`system_config`) is as simple as touching the context config file:
`'$JETTY_HOME'/contexts/gerrit.xml`
+== Tomcat 7.x
+
+[TIP]
+If reverse proxy is used in front of Tomcat then see the configuration
+instructions for encoding slashes link:config-reverseproxy.html. Otherwise
+Tomcat must be configured to encode slashes, by adding
+-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true to
+CATALINA_OPTS environment variable. Excerpt from the documentation
+https://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html:
+
+----
+Property org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH:
+If this is true '%2F' and '%5C' will be permitted as path delimiters.
+If not specified, the default value of false will be used.
+----
GERRIT
------
diff --git a/Documentation/js-api.txt b/Documentation/js-api.txt
index 396edf6..883198a 100644
--- a/Documentation/js-api.txt
+++ b/Documentation/js-api.txt
@@ -168,8 +168,9 @@
self.onAction(type, view_name, callback);
----
-* type: `'change'`, `'revision'` or `'project'`, indicating which type
- of resource the `UiAction` was bound to in the server.
+* type: `'change'`, `'revision'`, `'project'`, or `'branch'`
+ indicating which type of resource the `UiAction` was bound to
+ in the server.
* view_name: string appearing in URLs to name the view. This is the
second argument of the `get()`, `post()`, `put()`, and `delete()`
@@ -837,8 +838,8 @@
Gerrit.onAction(type, view_name, callback);
----
-* type: `'change'` or `'revision'`, indicating what sort of resource
- the `UiAction` was bound to in the server.
+* type: `'change'`, `'revision'`, `'project'` or `'branch'` indicating
+ what sort of resource the `UiAction` was bound to in the server.
* view_name: string appearing in URLs to name the view. This is the
second argument of the `get()`, `post()`, `put()`, and `delete()`
diff --git a/Documentation/rest-api-access.txt b/Documentation/rest-api-access.txt
index 3ff3595..42214fe 100644
--- a/Documentation/rest-api-access.txt
+++ b/Documentation/rest-api-access.txt
@@ -268,7 +268,6 @@
"MyProject": {
"revision": "61157ed63e14d261b6dca40650472a9b0bd88474",
"inherits_from": {
- "kind": "gerritcodereview#project",
"id": "All-Projects",
"name": "All-Projects",
"description": "Access inherited by all other projects."
diff --git a/Documentation/rest-api-changes.txt b/Documentation/rest-api-changes.txt
index c1bb66d..74a411f 100644
--- a/Documentation/rest-api-changes.txt
+++ b/Documentation/rest-api-changes.txt
@@ -242,6 +242,11 @@
authenticated and has commented on the current revision.
--
+[[patch-set-links]]
+--
+* `PATCHSET_LINKS`: include the `web_links` field.
+--
+
.Request
----
GET /changes/?q=97&o=CURRENT_REVISION&o=CURRENT_COMMIT&o=CURRENT_FILES&o=DOWNLOAD_COMMANDS HTTP/1.0
@@ -2804,7 +2809,7 @@
|===========================
|Field Name |Description
|`message` |Commit message for the cherry-picked change
-|`destination` |Destination Branch
+|`destination` |Destination branch
|===========================
[[comment-info]]
@@ -3088,6 +3093,8 @@
|`value` |optional|The voting value of the user who
recommended/disliked this label on the change if it is not
"`+1`"/"`-1`".
+|`default_value`|optional|The default voting value for the label.
+This value may be outside the range specified in permitted_labels.
|===========================
==== Fields set by `DETAILED_LABELS`
@@ -3243,6 +3250,9 @@
Actions the caller might be able to perform on this revision. The
information is a map of view name to link:#action-info[ActionInfo]
entities.
+|'web_links' |optional|
+Links to the patch set in external sites as a list of
+link:#web-link-info[WebLinkInfo] entities.
|===========================
[[rule-input]]
@@ -3372,6 +3382,17 @@
Each tag is listed without the 'refs/tags/' prefix.
|==========================
+[[web-link-info]]
+=== WebLinkInfo
+The `WebLinkInfo` entity describes a link to an external site.
+
+[options="header",width="50%",cols="1,6"]
+|======================
+|Field Name|Description
+|`name` |The link name.
+|`url` |The link URL.
+|======================
+
GERRIT
------
diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt
index 418b93c..a90dcab 100644
--- a/Documentation/rest-api-projects.txt
+++ b/Documentation/rest-api-projects.txt
@@ -35,21 +35,17 @@
)]}'
{
"external/bison": {
- "kind": "gerritcodereview#project",
"id": "external%2Fbison",
"description": "GNU parser generator"
},
"external/gcc": {
- "kind": "gerritcodereview#project",
"id": "external%2Fgcc",
},
"external/openssl": {
- "kind": "gerritcodereview#project",
"id": "external%2Fopenssl",
"description": "encryption\ncrypto routines"
},
"test": {
- "kind": "gerritcodereview#project",
"id": "test",
"description": "\u003chtml\u003e is escaped"
}
@@ -81,11 +77,9 @@
)]}'
{
"platform/drivers": {
- "kind": "gerritcodereview#project",
"id": "platform%2Fdrivers",
},
"platform/tools": {
- "kind": "gerritcodereview#project",
"id": "platform%2Ftools",
}
}
@@ -132,11 +126,11 @@
)]}'
{
- "kind": "gerritcodereview#project",
"id": "plugins%2Freplication",
"name": "plugins/replication",
"parent": "Public-Plugins",
- "description": "Copies to other servers using the Git protocol"
+ "description": "Copies to other servers using the Git protocol",
+ "state": "ACTIVE"
}
----
@@ -176,7 +170,6 @@
)]}'
{
- "kind": "gerritcodereview#project",
"id": "MyProject",
"name": "MyProject",
"parent": "All-Projects",
@@ -798,21 +791,18 @@
)]}'
[
{
- "kind": "gerritcodereview#project",
"id": "plugins%2Freplication",
"name": "plugins/replication",
"parent": "Public-Plugins",
"description": "Copies to other servers using the Git protocol"
},
{
- "kind": "gerritcodereview#project",
"id": "plugins%2Freviewnotes",
"name": "plugins/reviewnotes",
"parent": "Public-Plugins",
"description": "Annotates merged commits using notes on refs/notes/review."
},
{
- "kind": "gerritcodereview#project",
"id": "plugins%2Fsingleusergroup",
"name": "plugins/singleusergroup",
"parent": "Public-Plugins",
@@ -841,35 +831,30 @@
)]}'
[
{
- "kind": "gerritcodereview#project",
"id": "gerrit",
"name": "gerrit",
"parent": "Public-Projects",
"description": "Gerrit Code Review"
},
{
- "kind": "gerritcodereview#project",
"id": "plugins%2Freplication",
"name": "plugins/replication",
"parent": "Public-Plugins",
"description": "Copies to other servers using the Git protocol"
},
{
- "kind": "gerritcodereview#project",
"id": "plugins%2Freviewnotes",
"name": "plugins/reviewnotes",
"parent": "Public-Plugins",
"description": "Annotates merged commits using notes on refs/notes/review."
},
{
- "kind": "gerritcodereview#project",
"id": "plugins%2Fsingleusergroup",
"name": "plugins/singleusergroup",
"parent": "Public-Plugins",
"description": "GroupBackend enabling users to be directly added to access rules"
},
{
- "kind": "gerritcodereview#project",
"id": "Public-Plugins",
"name": "Public-Plugins",
"parent": "Public-Projects",
@@ -903,7 +888,6 @@
)]}'
{
- "kind": "gerritcodereview#project",
"id": "plugins%2Freplication",
"name": "plugins/replication",
"parent": "Public-Plugins",
@@ -1490,7 +1474,6 @@
[options="header",width="50%",cols="1,^2,4"]
|===========================
|Field Name ||Description
-|`kind` ||`gerritcodereview#project`
|`id` ||The URL encoded project name.
|`name` |
not set if returned in a map where the project name is used as map key|
@@ -1500,7 +1483,11 @@
`?-<n>` if the parent project is not visible (`<n>` is a number which
is increased for each non-visible project).
|`description` |optional|The description of the project.
+|`state` |optional|`ACTIVE`, `READ_ONLY` or `HIDDEN`.
|`branches` |optional|Map of branch names to HEAD revisions.
+|'web_links' |optional|
+Links to the project in external sites as a list of
+link:rest-api-changes.html#web-link-info[WebLinkInfo] entries.
|===========================
[[project-input]]
diff --git a/Documentation/rest-api.txt b/Documentation/rest-api.txt
index 6c681e5..b228dda 100644
--- a/Documentation/rest-api.txt
+++ b/Documentation/rest-api.txt
@@ -32,11 +32,14 @@
results to correspond to what anonymous users can read (which may
be nothing at all).
-Users (and programs) may authenticate using HTTP authentication by
-supplying the HTTP password from the user's account settings page.
-Gerrit by default uses HTTP digest authentication. To authenticate,
-prefix the endpoint URL with `/a/`. For example to authenticate to
-`/projects/` request URL `/a/projects/`.
+Users (and programs) may authenticate by prefixing the endpoint URL with
+`/a/`. For example to authenticate to `/projects/`, request the URL
+`/a/projects/`.
+
+By default Gerrit uses HTTP digest authentication with the HTTP password
+from the user's account settings page. HTTP basic authentication is used
+if link:config-gerrit.html#auth.gitBasicAuth[`auth.gitBasicAuth`] is set
+to true in the Gerrit configuration.
[[preconditions]]
=== Preconditions
@@ -47,17 +50,22 @@
[[output]]
=== Output Format
-Most APIs return pretty printed JSON by default. Compact JSON can be
-requested by setting the `Accept` HTTP request header to include
-`application/json`, for example:
+JSON responses are encoded using UTF-8 and use content type
+`application/json`.
+
+By default most APIs return pretty-printed JSON, which uses extra
+whitespace to make the output more readable for humans.
+
+Compact JSON can be requested by setting the `pp=0` query parameter,
+or by setting the `Accept` HTTP request header to include `application/json`:
----
GET /projects/ HTTP/1.0
Accept: application/json
----
-JSON responses are encoded using UTF-8 and use content type
-`application/json`.
+Producing (and parsing) the non-pretty compact format is more efficient,
+so tools should request it whenever possible.
To prevent against Cross Site Script Inclusion (XSSI) attacks, the JSON
response body starts with a magic prefix line that must be stripped before
@@ -68,12 +76,6 @@
[ ... valid JSON ... ]
----
-The default JSON format is pretty, which uses extra whitespace to make
-the output more readable for a human. Producing (and parsing) the
-non-pretty compact format is more efficient so tools should request it
-by using the `Accept: application/json` header or `pp=0` query
-parameter whenever possible.
-
Responses will be gzip compressed by the server if the HTTP
`Accept-Encoding` request header is set to `gzip`. This may
save on network transfer time for larger responses.
@@ -81,7 +83,7 @@
[[timestamp]]
=== Timestamp
Timestamps are given in UTC and have the format
-"'yyyy-mm-dd hh:mm:ss.fffffffff'" where "'ffffffffff'" indicates the
+"'yyyy-mm-dd hh:mm:ss.fffffffff'" where "'ffffffffff'" represents
nanoseconds.
[[encoding]]
@@ -91,32 +93,33 @@
[[response-codes]]
=== Response Codes
-HTTP status codes are well defined and the Gerrit REST endpoints use
-them as described in the HTTP spec.
+The Gerrit REST endpoints use HTTP status codes as described
+in the link:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html[
+HTTP specification].
-Here are examples for some HTTP status codes that show how they are
-used in the context of the Gerrit REST API.
+Here are examples that show how HTTP status codes are used in the
+context of the Gerrit REST API.
==== 400 Bad Request
-`400 Bad Request` is used if the request is not understood by the
+`400 Bad Request` is returned if the request is not understood by the
server due to malformed syntax.
E.g. `400 Bad Request` is returned if JSON input is expected but the
'Content-Type' of the request is not 'application/json' or the request
body doesn't contain valid JSON.
-`400 Bad Request` is also used if required input fields are not set or
+`400 Bad Request` is also returned if required input fields are not set or
if options are set which cannot be used together.
==== 403 Forbidden
-`403 Forbidden` is used if the operation is not allowed because the
-calling user has no sufficient permissions.
+`403 Forbidden` is returned if the operation is not allowed because the
+calling user does not have sufficient permissions.
E.g. some REST endpoints require that the calling user has certain
link:access-control.html#global_capabilities[global capabilities]
assigned.
-`403 Forbidden` is also used if `self` is used as account ID and the
+`403 Forbidden` is also returned if `self` is used as account ID and the
REST call was done without authentication.
==== 404 Not Found
@@ -125,27 +128,27 @@
cannot be found if the URL contains a non-existing ID or view.
==== 405 Method Not Allowed
-`405 Method Not Allowed` is used if the resource exists but doesn't
+`405 Method Not Allowed` is returned if the resource exists but doesn't
support the operation.
E.g. some of the `/groups/` endpoints are only supported for Gerrit
-internal groups, if they are invoked for an external group the response
+internal groups; if they are invoked for an external group the response
is `405 Method Not Allowed`.
==== 409 Conflict
-`409 Conflict` is used if the request cannot be completed because the
+`409 Conflict` is returned if the request cannot be completed because the
current state of the resource doesn't allow the operation.
E.g. if you try to submit a change that is abandoned, this fails with
`409 Conflict` because the state of the change doesn't allow the submit
operation.
-`409 Conflict` is also used if you try to create a resource but the
+`409 Conflict` is also returned if you try to create a resource but the
name is already occupied by an existing resource.
==== 412 Precondition Failed
-`412 Precondition Failed` is used if a precondition from the request
-header fields is not fulfilled as described in the link:#preconditions[
+`412 Precondition Failed` is returned if a precondition from the request
+header fields is not fulfilled, as described in the link:#preconditions[
Preconditions] section.
==== 422 Unprocessable Entity
diff --git a/Documentation/user-search.txt b/Documentation/user-search.txt
index b995bc8..9831d81 100644
--- a/Documentation/user-search.txt
+++ b/Documentation/user-search.txt
@@ -43,11 +43,7 @@
Operators act as restrictions on the search. As more operators
are added to the same query string, they further restrict the
returned results. Search can also be performed by typing only a
-text with no operator. It will try to match a project name by
-substring.
-
-E.g. Searching for just "gerrit is:starred" will try to match a
-project name by "gerrit" as substring.
+text with no operator, which will match against a variety of fields.
[[age]]
age:'AGE'::
@@ -127,6 +123,11 @@
link:http://www.brics.dk/automaton/[dk.brics.automaton
library] is used for evaluation of such patterns.
+[[projects]]
+projects:'PREFIX'::
++
+Changes occurring in projects starting with 'PREFIX'.
+
[[parentproject]]
parentproject:'PROJECT'::
+
@@ -264,7 +265,7 @@
True on any change where the current user is a reviewer.
Same as `reviewer:self`.
-is:open::
+is:open, is:pending::
+
True if the change is either open or submitted, merge pending.
@@ -286,7 +287,7 @@
destination branch.
[[status]]
-status:open::
+status:open, status:pending::
+
True if the change state is either 'review in progress' or 'submitted,
merge pending'.
diff --git a/Documentation/user-upload.txt b/Documentation/user-upload.txt
index 17ca968..b892c4a 100644
--- a/Documentation/user-upload.txt
+++ b/Documentation/user-upload.txt
@@ -20,7 +20,8 @@
When link:config-gerrit.html#auth.gitBasicAuth[gitBasicAuth] is enabled,
the user is authenticated using standard BasicAuth and credentials validated
-using the same authentication method configured for the Gerrit Web UI.
+using the randomly generated HTTP password on the `HTTP Password` tab
+in the user settings page or against LDAP when configured for the Gerrit Web UI.
When gitBasicAuth is not configured, the user's HTTP credentials can be
accessed within Gerrit by going to `Settings`, and then accessing the `HTTP
diff --git a/VERSION b/VERSION
index f0594c4..5b9bc321 100644
--- a/VERSION
+++ b/VERSION
@@ -2,5 +2,5 @@
# Used by :api_install and :api_deploy targets
# when talking to the destination repository.
#
-GERRIT_VERSION = '2.9-SNAPSHOT'
+GERRIT_VERSION = '2.10-SNAPSHOT'
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java
index 63bdfd2..6ee7efa 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java
@@ -130,8 +130,7 @@
}
}
- private static final ThreadLocal<Context> current =
- new ThreadLocal<Context>();
+ private static final ThreadLocal<Context> current = new ThreadLocal<>();
private static Context requireContext() {
final Context ctx = current.get();
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java
new file mode 100644
index 0000000..c95f8c3
--- /dev/null
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java
@@ -0,0 +1,69 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.acceptance.api.accounts;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.PushOneCommit;
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.RestApiException;
+
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class AccountIT extends AbstractDaemonTest {
+
+ @Test
+ public void get() throws RestApiException {
+ AccountInfo info = gApi
+ .accounts()
+ .id("admin")
+ .get();
+ assertEquals("Administrator", info.name);
+ assertEquals("admin@example.com", info.email);
+ assertEquals("admin", info.username);
+ }
+
+ @Test
+ public void self() throws RestApiException {
+ AccountInfo info = gApi
+ .accounts()
+ .self()
+ .get();
+ assertEquals("Administrator", info.name);
+ assertEquals("admin@example.com", info.email);
+ assertEquals("admin", info.username);
+ }
+
+ @Test
+ public void starUnstarChange() throws GitAPIException,
+ IOException, RestApiException {
+ PushOneCommit.Result r = createChange();
+ String triplet = "p~master~" + r.getChangeId();
+ gApi.accounts()
+ .self()
+ .starChange(triplet);
+ assertTrue(getChange(triplet).starred);
+ gApi.accounts()
+ .self()
+ .unstarChange(triplet);
+ assertNull(getChange(triplet).starred);
+ }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/BUCK
new file mode 100644
index 0000000..1152d88
--- /dev/null
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/BUCK
@@ -0,0 +1,6 @@
+include_defs('//gerrit-acceptance-tests/tests.defs')
+
+acceptance_tests(
+ srcs = glob(['*IT.java']),
+ labels = ['api'],
+)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/BUCK
index aa9703c..1152d88 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/BUCK
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/BUCK
@@ -2,5 +2,5 @@
acceptance_tests(
srcs = glob(['*IT.java']),
- deps = ['//gerrit-acceptance-tests:lib'],
+ labels = ['api'],
)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
index 6dff20a..2f66b7d 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
@@ -48,6 +48,7 @@
assertEquals(true, c.mergeable);
assertEquals(r.getChangeId(), c.changeId);
assertEquals(c.created, c.updated);
+ assertEquals(1, c._number);
}
@Test
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/BUCK
index 8da456d..1152d88 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/BUCK
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/BUCK
@@ -2,6 +2,5 @@
acceptance_tests(
srcs = glob(['*IT.java']),
- deps = ['//gerrit-acceptance-tests:lib'],
+ labels = ['api'],
)
-
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
index 54afd0b..9b24922 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/ProjectIT.java
@@ -14,9 +14,13 @@
package com.google.gerrit.acceptance.api.project;
+import static org.junit.Assert.assertEquals;
+
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.extensions.api.projects.BranchInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException;
import org.eclipse.jgit.api.errors.GitAPIException;
@@ -28,6 +32,38 @@
public class ProjectIT extends AbstractDaemonTest {
@Test
+ public void createProjectFoo() throws RestApiException {
+ String name = "foo";
+ assertEquals(name,
+ gApi.projects()
+ .name(name)
+ .create()
+ .get()
+ .name);
+ }
+
+ @Test(expected = RestApiException.class)
+ public void createProjectFooBar() throws RestApiException {
+ ProjectInput in = new ProjectInput();
+ in.name = "foo";
+ gApi.projects()
+ .name("bar")
+ .create(in);
+ }
+
+ @Test(expected = ResourceConflictException.class)
+ public void createProjectDuplicate() throws RestApiException {
+ ProjectInput in = new ProjectInput();
+ in.name = "baz";
+ gApi.projects()
+ .name("baz")
+ .create(in);
+ gApi.projects()
+ .name("baz")
+ .create(in);
+ }
+
+ @Test
public void createBranch() throws GitAPIException,
IOException, RestApiException {
gApi.projects()
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/BUCK
index aa9703c..1152d88 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/BUCK
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/BUCK
@@ -2,5 +2,5 @@
acceptance_tests(
srcs = glob(['*IT.java']),
- deps = ['//gerrit-acceptance-tests:lib'],
+ labels = ['api'],
)
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 50522cd..78b9a54 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
@@ -14,6 +14,9 @@
package com.google.gerrit.acceptance.api.revision;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.acceptance.PushOneCommit;
@@ -21,6 +24,7 @@
import com.google.gerrit.extensions.api.changes.ChangeApi;
import com.google.gerrit.extensions.api.changes.CherryPickInput;
import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.changes.RevisionApi;
import com.google.gerrit.extensions.api.changes.SubmitInput;
import com.google.gerrit.extensions.api.projects.BranchInput;
import com.google.gerrit.extensions.restapi.AuthException;
@@ -140,6 +144,42 @@
.submit();
}
+ @Test
+ public void canRebase()
+ throws GitAPIException, IOException, RestApiException, Exception {
+ PushOneCommit push = pushFactory.create(db, admin.getIdent());
+ PushOneCommit.Result r1 = push.to(git, "refs/for/master");
+ merge(r1);
+
+ push = pushFactory.create(db, admin.getIdent());
+ PushOneCommit.Result r2 = push.to(git, "refs/for/master");
+ assertFalse(gApi.changes()
+ .id(r2.getChangeId())
+ .revision(r2.getCommit().name())
+ .canRebase());
+ merge(r2);
+
+ git.checkout().setName(r1.getCommit().name()).call();
+ push = pushFactory.create(db, admin.getIdent());
+ PushOneCommit.Result r3 = push.to(git, "refs/for/master");
+
+ assertTrue(gApi.changes()
+ .id(r3.getChangeId())
+ .revision(r3.getCommit().name())
+ .canRebase());
+ }
+
+ protected RevisionApi revision(PushOneCommit.Result r) throws Exception {
+ return gApi.changes()
+ .id(r.getChangeId())
+ .current();
+ }
+
+ private void merge(PushOneCommit.Result r) throws Exception {
+ revision(r).review(ReviewInput.approve());
+ revision(r).submit();
+ }
+
private PushOneCommit.Result updateChange(PushOneCommit.Result r,
String content) throws GitAPIException, IOException {
PushOneCommit push = pushFactory.create(db, admin.getIdent(),
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/BUCK
index 5976f54..3ead2a1 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/BUCK
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/BUCK
@@ -2,12 +2,13 @@
acceptance_tests(
srcs = ['DraftChangeBlockedIT.java', 'SubmitOnPushIT.java'],
- deps = ['//gerrit-acceptance-tests:lib'],
+ labels = ['git'],
)
acceptance_tests(
srcs = ['HttpPushForReviewIT.java', 'SshPushForReviewIT.java'],
deps = [':push_for_review'],
+ labels = ['git'],
)
java_library(
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
new file mode 100644
index 0000000..00b53f9
--- /dev/null
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/BUCK
@@ -0,0 +1,7 @@
+include_defs('//gerrit-acceptance-tests/tests.defs')
+
+acceptance_tests(
+ srcs = glob(['*IT.java']),
+ labels = ['pgm'],
+ source_under_test = ['//gerrit-pgm:pgm'],
+)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/ReindexIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/ReindexIT.java
new file mode 100644
index 0000000..5778b19
--- /dev/null
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/pgm/ReindexIT.java
@@ -0,0 +1,66 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.acceptance.pgm;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.gerrit.acceptance.TempFileUtil;
+import com.google.gerrit.launcher.GerritLauncher;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+
+public class ReindexIT {
+ private File sitePath;
+
+ @Before
+ public void createTempDirectory() throws Exception {
+ sitePath = TempFileUtil.createTempDirectory();
+ }
+
+ @After
+ public void destroySite() throws Exception {
+ if (sitePath != null) {
+ TempFileUtil.recursivelyDelete(sitePath);
+ }
+ }
+
+ @Test
+ public void reindexEmptySite() throws Exception {
+ initSite();
+ runGerrit("reindex", "-d", sitePath.getPath(),
+ "--show-stack-trace");
+ }
+
+ @Test
+ public void reindexEmptySiteWithRecheckMergeable() throws Exception {
+ initSite();
+ runGerrit("reindex", "-d", sitePath.getPath(),
+ "--show-stack-trace",
+ "--recheck-mergeable");
+ }
+
+ private void initSite() throws Exception {
+ runGerrit("init", "-d", sitePath.getPath(),
+ "--batch", "--no-auto-start", "--skip-plugins", "--show-stack-trace");
+ }
+
+ private static void runGerrit(String... args) throws Exception {
+ assertEquals(0, GerritLauncher.mainImpl(args));
+ }
+}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/BUCK
index 77e0419..f081ada 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/BUCK
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/BUCK
@@ -2,10 +2,8 @@
acceptance_tests(
srcs = glob(['*IT.java']),
- deps = [
- ':util',
- '//gerrit-acceptance-tests:lib',
- ],
+ deps = [':util'],
+ labels = ['rest']
)
java_library(
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
index 13901c3..ab8a5fc 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/AbstractSubmit.java
@@ -31,12 +31,12 @@
import com.google.gerrit.acceptance.SshSession;
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.api.changes.SubmitInput;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.server.ApprovalsUtil;
import com.google.gerrit.server.change.ChangeJson.ChangeInfo;
import com.google.gerrit.server.change.ChangeJson.LabelInfo;
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/BUCK
index c76c9a6..d63d195 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/BUCK
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/BUCK
@@ -10,17 +10,15 @@
acceptance_tests(
srcs = OTHER_TESTS,
- deps = [
- '//gerrit-acceptance-tests:lib',
- ],
+ labels = ['rest'],
)
acceptance_tests(
srcs = SUBMIT_TESTS,
deps = [
':submit_util',
- '//gerrit-acceptance-tests:lib',
],
+ labels = ['rest'],
)
java_library(
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
index d137e62..12d002e 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByCherryPickIT.java
@@ -19,8 +19,8 @@
import static org.junit.Assert.assertSame;
import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gwtorm.server.OrmException;
+import com.google.gerrit.extensions.common.SubmitType;
import com.jcraft.jsch.JSchException;
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java
index d6fbca4..2ef4ecc 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByFastForwardIT.java
@@ -18,7 +18,7 @@
import static org.junit.Assert.assertEquals;
import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
+import com.google.gerrit.extensions.common.SubmitType;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.revwalk.RevCommit;
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java
index 2a01d84..9512c7a 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeAlwaysIT.java
@@ -18,7 +18,7 @@
import static org.junit.Assert.assertEquals;
import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gwtorm.server.OrmException;
import com.jcraft.jsch.JSchException;
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
index 486c529..fde462b 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByMergeIfNecessaryIT.java
@@ -4,7 +4,7 @@
import static org.junit.Assert.assertEquals;
import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gwtorm.server.OrmException;
import com.jcraft.jsch.JSchException;
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java
index 8968084..7b4d23d 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SubmitByRebaseIfNecessaryIT.java
@@ -18,7 +18,7 @@
import static org.junit.Assert.assertEquals;
import com.google.gerrit.acceptance.PushOneCommit;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
+import com.google.gerrit.extensions.common.SubmitType;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.revwalk.RevCommit;
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/BUCK
index 108cc8d..da34c1d 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/BUCK
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/group/BUCK
@@ -6,6 +6,7 @@
':util',
'//gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account:util',
],
+ labels = ['rest']
)
java_library(
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BUCK
index 91511be..fa8b10e 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BUCK
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/BUCK
@@ -5,8 +5,8 @@
deps = [
':branch',
':project',
- '//gerrit-acceptance-tests:lib',
],
+ labels = ['rest']
)
java_library(
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
index b593840..93d31c7 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/CreateProjectIT.java
@@ -24,17 +24,20 @@
import com.google.common.collect.Sets;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.projects.ProjectApi;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.common.SubmitType;
+import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.account.GroupCache;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.group.SystemGroupBackend;
-import com.google.gerrit.server.project.CreateProject;
import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
import com.google.gerrit.server.project.ProjectState;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@@ -65,6 +68,21 @@
@Inject
private GitRepositoryManager git;
+ @Inject
+ private GerritApi gApi;
+
+ @Test
+ public void testCreateProjectApi() throws RestApiException, IOException {
+ final String newProjectName = "newProject";
+ ProjectApi projectApi = gApi.projects().name(newProjectName).create();
+ ProjectInfo p = projectApi.get();
+ assertEquals(newProjectName, p.name);
+ ProjectState projectState = projectCache.get(new Project.NameKey(newProjectName));
+ assertNotNull(projectState);
+ assertProjectInfo(projectState.getProject(), p);
+ assertHead(newProjectName, "refs/heads/master");
+ }
+
@Test
public void testCreateProject() throws IOException {
final String newProjectName = "newProject";
@@ -80,7 +98,7 @@
@Test
public void testCreateProjectWithNameMismatch_BadRequest() throws IOException {
- CreateProject.Input in = new CreateProject.Input();
+ ProjectInput in = new ProjectInput();
in.name = "otherName";
RestResponse r = adminSession.put("/projects/someName", in);
assertEquals(HttpStatus.SC_BAD_REQUEST, r.getStatusCode());
@@ -89,7 +107,7 @@
@Test
public void testCreateProjectWithProperties() throws IOException {
final String newProjectName = "newProject";
- CreateProject.Input in = new CreateProject.Input();
+ ProjectInput in = new ProjectInput();
in.description = "Test description";
in.submitType = SubmitType.CHERRY_PICK;
in.useContributorAgreements = InheritableBoolean.TRUE;
@@ -115,7 +133,7 @@
RestResponse r = adminSession.put("/projects/" + parentName);
r.consume();
final String childName = "child";
- CreateProject.Input in = new CreateProject.Input();
+ ProjectInput in = new ProjectInput();
in.parent = parentName;
r = adminSession.put("/projects/" + childName, in);
Project project = projectCache.get(new Project.NameKey(childName)).getProject();
@@ -124,7 +142,7 @@
public void testCreateChildProjectUnderNonExistingParent_UnprocessableEntity()
throws IOException {
- CreateProject.Input in = new CreateProject.Input();
+ ProjectInput in = new ProjectInput();
in.parent = "non-existing-project";
RestResponse r = adminSession.put("/projects/child", in);
assertEquals(HttpStatus.SC_UNPROCESSABLE_ENTITY, r.getStatusCode());
@@ -133,7 +151,7 @@
@Test
public void testCreateProjectWithOwner() throws IOException {
final String newProjectName = "newProject";
- CreateProject.Input in = new CreateProject.Input();
+ ProjectInput in = new ProjectInput();
in.owners = Lists.newArrayListWithCapacity(3);
in.owners.add("Anonymous Users"); // by name
in.owners.add(SystemGroupBackend.REGISTERED_USERS.get()); // by UUID
@@ -150,7 +168,7 @@
public void testCreateProjectWithNonExistingOwner_UnprocessableEntity()
throws IOException {
- CreateProject.Input in = new CreateProject.Input();
+ ProjectInput in = new ProjectInput();
in.owners = Collections.singletonList("non-existing-group");
RestResponse r = adminSession.put("/projects/newProject", in);
assertEquals(HttpStatus.SC_UNPROCESSABLE_ENTITY, r.getStatusCode());
@@ -159,7 +177,7 @@
@Test
public void testCreatePermissionOnlyProject() throws IOException {
final String newProjectName = "newProject";
- CreateProject.Input in = new CreateProject.Input();
+ ProjectInput in = new ProjectInput();
in.permissionsOnly = true;
adminSession.put("/projects/" + newProjectName, in);
assertHead(newProjectName, RefNames.REFS_CONFIG);
@@ -168,7 +186,7 @@
@Test
public void testCreateProjectWithEmptyCommit() throws IOException {
final String newProjectName = "newProject";
- CreateProject.Input in = new CreateProject.Input();
+ ProjectInput in = new ProjectInput();
in.createEmptyCommit = true;
adminSession.put("/projects/" + newProjectName, in);
assertEmptyCommit(newProjectName, "refs/heads/master");
@@ -177,7 +195,7 @@
@Test
public void testCreateProjectWithBranches() throws IOException {
final String newProjectName = "newProject";
- CreateProject.Input in = new CreateProject.Input();
+ ProjectInput in = new ProjectInput();
in.createEmptyCommit = true;
in.branches = Lists.newArrayListWithCapacity(3);
in.branches.add("refs/heads/test");
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java
index b037ff9..10d59d2 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GetChildProjectIT.java
@@ -21,10 +21,10 @@
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.acceptance.SshSession;
+import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
import com.google.inject.Inject;
import com.jcraft.jsch.JSchException;
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
index c61764b..466a239 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListChildProjectsIT.java
@@ -21,9 +21,9 @@
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.RestResponse;
+import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
import com.google.gson.reflect.TypeToken;
import com.google.inject.Inject;
@@ -53,7 +53,7 @@
assertEquals(HttpStatus.SC_OK, r.getStatusCode());
List<ProjectInfo> projectInfoList = toProjectInfoList(r);
// Project 'p' was already created in the base class
- assertTrue(projectInfoList.size() == 1);
+ assertTrue(projectInfoList.size() == 2);
}
@Test
@@ -67,7 +67,11 @@
RestResponse r = GET("/projects/" + allProjects.get() + "/children/");
assertEquals(HttpStatus.SC_OK, r.getStatusCode());
- assertProjects(Arrays.asList(existingProject, child1, child2), toProjectInfoList(r));
+ assertProjects(
+ Arrays.asList(
+ new Project.NameKey("All-Users"),
+ existingProject, child1, child2),
+ toProjectInfoList(r));
}
@Test
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java
index 788a54b..3128004 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectAssert.java
@@ -21,10 +21,10 @@
import com.google.common.base.Predicate;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
+import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
import com.google.gerrit.server.project.ProjectState;
import java.util.List;
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/BUCK
index 688e649..fce853b 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/BUCK
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/BUCK
@@ -2,7 +2,5 @@
acceptance_tests(
srcs = glob(['*IT.java']),
- deps = [
- '//gerrit-acceptance-tests:lib',
- ],
+ labels = ['server'],
)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/BUCK
index 688e649..fce853b 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/BUCK
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/BUCK
@@ -2,7 +2,5 @@
acceptance_tests(
srcs = glob(['*IT.java']),
- deps = [
- '//gerrit-acceptance-tests:lib',
- ],
+ labels = ['server'],
)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java
index a2dd8ec..7240036 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/LabelTypeIT.java
@@ -29,14 +29,23 @@
import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gerrit.server.git.ProjectConfig;
import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.testutil.ConfigSuite;
import com.google.inject.Inject;
+import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.Repository;
import org.junit.Before;
import org.junit.Test;
@NoHttpd
public class LabelTypeIT extends AbstractDaemonTest {
+ @ConfigSuite.Config
+ public static Config noteDbEnabled() {
+ Config cfg = new Config();
+ cfg.setBoolean("notedb", null, "write", true);
+ cfg.setBoolean("notedb", "patchSetApprovals", "read", true);
+ return cfg;
+ }
@Inject
private GitRepositoryManager repoManager;
@@ -60,6 +69,7 @@
codeReview.setCopyMaxScore(false);
codeReview.setCopyAllScoresOnTrivialRebase(false);
codeReview.setCopyAllScoresIfNoCodeChange(false);
+ codeReview.setDefaultValue((short)-1);
saveProjectConfig(cfg);
}
@@ -78,7 +88,7 @@
saveLabelConfig();
PushOneCommit.Result r = createChange();
revision(r).review(ReviewInput.reject());
- assertApproval(r, -2);
+ //assertApproval(r, -2);
r = amendChange(r.getChangeId());
assertApproval(r, -2);
}
@@ -255,6 +265,7 @@
// through JSON instead of querying the DB directly.
ChangeInfo c = get(r.getChangeId());
LabelInfo cr = c.labels.get("Code-Review");
+ assertEquals(-1, (int) cr.defaultValue);
assertEquals(1, cr.all.size());
assertEquals("Administrator", cr.all.get(0).name);
assertEquals(expected, cr.all.get(0).value.intValue());
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BUCK b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BUCK
index aa9703c..74b26ba6 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BUCK
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/BUCK
@@ -3,4 +3,5 @@
acceptance_tests(
srcs = glob(['*IT.java']),
deps = ['//gerrit-acceptance-tests:lib'],
+ labels = ['ssh'],
)
diff --git a/gerrit-acceptance-tests/tests.defs b/gerrit-acceptance-tests/tests.defs
index 0131887..7bd2430 100644
--- a/gerrit-acceptance-tests/tests.defs
+++ b/gerrit-acceptance-tests/tests.defs
@@ -1,4 +1,4 @@
-# these need as workaround for the 'verify: false' bug in Jcraft SSH library
+# These are needed as workaround for the 'verify: false' bug in Jcraft SSH library
BOUNCYCASTLE = [
'//lib/bouncycastle:bcpkix',
'//lib/bouncycastle:bcpg',
@@ -7,6 +7,8 @@
def acceptance_tests(
srcs,
deps = [],
+ labels = [],
+ source_under_test = [],
vm_args = ['-Xmx256m']):
from os import environ, path
if not environ.get('NO_BOUNCYCASTLE'):
@@ -23,8 +25,8 @@
'//gerrit-httpd:httpd',
'//gerrit-sshd:sshd',
'//gerrit-server:server',
- ],
- labels = [
+ ] + 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 85a051b..85e4599 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
@@ -14,20 +14,22 @@
package com.google.gerrit.server.cache.h2;
-import com.google.common.base.Preconditions;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.server.cache.CacheBinding;
import com.google.gerrit.server.cache.PersistentCacheFactory;
import com.google.gerrit.server.cache.h2.H2CacheImpl.SqlStore;
import com.google.gerrit.server.cache.h2.H2CacheImpl.ValueHolder;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.plugins.Plugin;
import com.google.inject.Inject;
+import com.google.inject.Provider;
import com.google.inject.Singleton;
import com.google.inject.TypeLiteral;
@@ -37,6 +39,7 @@
import java.io.File;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -48,17 +51,18 @@
private final DefaultCacheFactory defaultFactory;
private final Config config;
- private final File cacheDir;
+ private final File cacheDir;
private final List<H2CacheImpl<?, ?>> caches;
+ private final DynamicMap<Cache<?, ?>> cacheMap;
private final ExecutorService executor;
private final ScheduledExecutorService cleanup;
- private volatile boolean started;
@Inject
H2CacheFactory(
DefaultCacheFactory defaultCacheFactory,
@GerritServerConfig Config cfg,
- SitePaths site) {
+ SitePaths site,
+ DynamicMap<Cache<?, ?>> cacheMap) {
defaultFactory = defaultCacheFactory;
config = cfg;
@@ -79,6 +83,7 @@
}
caches = Lists.newLinkedList();
+ this.cacheMap = cacheMap;
if (cacheDir != null) {
executor = Executors.newFixedThreadPool(
@@ -100,7 +105,6 @@
@Override
public void start() {
- started = true;
if (executor != null) {
for (final H2CacheImpl<?, ?> cache : caches) {
executor.execute(new Runnable() {
@@ -141,15 +145,16 @@
log.warn("Interrupted waiting for disk cache to shutdown");
}
}
- for (H2CacheImpl<?, ?> cache : caches) {
- cache.stop();
+ synchronized (caches) {
+ for (H2CacheImpl<?, ?> cache : caches) {
+ cache.stop();
+ }
}
}
@SuppressWarnings({"unchecked", "cast"})
@Override
public <K, V> Cache<K, V> build(CacheBinding<K, V> def) {
- Preconditions.checkState(!started, "cache must be built before start");
long limit = config.getLong("cache", def.name(), "diskLimit", 128 << 20);
if (cacheDir == null || limit <= 0) {
@@ -160,7 +165,9 @@
H2CacheImpl<K, V> cache = new H2CacheImpl<K, V>(
executor, store, def.keyType(),
(Cache<K, ValueHolder<V>>) defaultFactory.create(def, true).build());
- caches.add(cache);
+ synchronized (caches) {
+ caches.add(cache);
+ }
return cache;
}
@@ -169,7 +176,6 @@
public <K, V> LoadingCache<K, V> build(
CacheBinding<K, V> def,
CacheLoader<K, V> loader) {
- Preconditions.checkState(!started, "cache must be built before start");
long limit = config.getLong("cache", def.name(), "diskLimit", 128 << 20);
if (cacheDir == null || limit <= 0) {
@@ -187,12 +193,25 @@
return cache;
}
+ @Override
+ public void onStop(Plugin plugin) {
+ synchronized (caches) {
+ for (Map.Entry<String, Provider<Cache<?, ?>>> entry :
+ cacheMap.byPlugin(plugin.getName()).entrySet()) {
+ Cache<?, ?> cache = entry.getValue().get();
+ if (caches.remove(cache)) {
+ ((H2CacheImpl<?, ?>) cache).stop();
+ }
+ }
+ }
+ }
+
private <V, K> SqlStore<K, V> newSqlStore(
String name,
TypeLiteral<K> keyType,
long maxSize) {
File db = new File(cacheDir, name).getAbsoluteFile();
String url = "jdbc:h2:" + db.toURI().toString();
- return new SqlStore<K, V>(url, keyType, maxSize);
+ return new SqlStore<>(url, keyType, maxSize);
}
}
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 4aca42b..de7613d 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
@@ -115,7 +115,7 @@
@Override
public void put(final K key, V val) {
- final ValueHolder<V> h = new ValueHolder<V>(val);
+ final ValueHolder<V> h = new ValueHolder<>(val);
h.created = TimeUtil.nowMs();
mem.put(key, h);
executor.execute(new Runnable() {
@@ -246,7 +246,7 @@
}
}
- final ValueHolder<V> h = new ValueHolder<V>(loader.load(key));
+ final ValueHolder<V> h = new ValueHolder<>(loader.load(key));
h.created = TimeUtil.nowMs();
executor.execute(new Runnable() {
@Override
@@ -302,7 +302,7 @@
return (KeyType<K>) OTHER;
}
- static final KeyType<?> OTHER = new KeyType<Object>();
+ static final KeyType<?> OTHER = new KeyType<>();
static final KeyType<String> STRING = new KeyType<String>() {
@Override
String columnType() {
@@ -346,7 +346,7 @@
int cores = Runtime.getRuntime().availableProcessors();
int keep = Math.min(cores, 16);
- this.handles = new ArrayBlockingQueue<SqlHandle>(keep);
+ this.handles = new ArrayBlockingQueue<>(keep);
}
synchronized void open() {
@@ -440,7 +440,7 @@
@SuppressWarnings("unchecked")
V val = (V) r.getObject(1);
- ValueHolder<V> h = new ValueHolder<V>(val);
+ ValueHolder<V> h = new ValueHolder<>(val);
h.clean = true;
hitCount.incrementAndGet();
touch(c, key);
diff --git a/gerrit-common/BUCK b/gerrit-common/BUCK
index 9ed1624..e2dcb27 100644
--- a/gerrit-common/BUCK
+++ b/gerrit-common/BUCK
@@ -6,6 +6,11 @@
SRC + 'common/auth/SignInRequired.java',
]
+EXCLUDES = [
+ SRC + 'common/PluginData.java',
+ SRC + 'common/FileUtil.java',
+]
+
java_library(
name = 'annotations',
srcs = ANNOTATIONS,
@@ -14,7 +19,7 @@
gwt_module(
name = 'client',
- srcs = glob([SRC + 'common/**/*.java']),
+ srcs = glob([SRC + 'common/**/*.java'], excludes = EXCLUDES),
gwtxml = SRC + 'Common.gwt.xml',
deps = [
'//gerrit-patch-jgit:client',
@@ -35,11 +40,13 @@
srcs = glob([SRC + 'common/**/*.java'], excludes = ANNOTATIONS),
deps = [
':annotations',
+ '//gerrit-extension-api:api',
'//gerrit-patch-jgit:server',
'//gerrit-prettify:server',
'//gerrit-reviewdb:server',
'//lib:gwtjsonrpc',
'//lib:gwtorm',
+ '//lib:guava',
'//lib/jgit:jgit',
],
visibility = ['PUBLIC'],
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java b/gerrit-common/src/main/java/com/google/gerrit/common/Die.java
similarity index 95%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
rename to gerrit-common/src/main/java/com/google/gerrit/common/Die.java
index 96e2ec8..6a1f304 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/Die.java
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.pgm.util;
+package com.google.gerrit.common;
public class Die extends RuntimeException {
private static final long serialVersionUID = 1L;
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java b/gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java
new file mode 100644
index 0000000..bed10d6
--- /dev/null
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/FileUtil.java
@@ -0,0 +1,66 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.common;
+
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.IO;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Arrays;
+
+public class FileUtil {
+ public static boolean modified(FileBasedConfig cfg) throws IOException {
+ byte[] curVers;
+ try {
+ curVers = IO.readFully(cfg.getFile());
+ } catch (FileNotFoundException notFound) {
+ return true;
+ }
+
+ byte[] newVers = Constants.encode(cfg.toText());
+ return !Arrays.equals(curVers, newVers);
+ }
+
+ public static void mkdir(final File path) {
+ if (!path.isDirectory() && !path.mkdir()) {
+ throw new Die("Cannot make directory " + path);
+ }
+ }
+
+ public static void chmod(final int mode, final File path) {
+ path.setReadable(false, false /* all */);
+ path.setWritable(false, false /* all */);
+ path.setExecutable(false, false /* all */);
+
+ path.setReadable((mode & 0400) == 0400, true /* owner only */);
+ path.setWritable((mode & 0200) == 0200, true /* owner only */);
+ if (path.isDirectory() || (mode & 0100) == 0100) {
+ path.setExecutable(true, true /* owner only */);
+ }
+
+ if ((mode & 0044) == 0044) {
+ path.setReadable(true, false /* all */);
+ }
+ if ((mode & 0011) == 0011) {
+ path.setExecutable(true, false /* all */);
+ }
+ }
+
+ private FileUtil() {
+ }
+}
\ No newline at end of file
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java b/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java
index e4199c2..c0382da 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java
@@ -44,6 +44,7 @@
public static final String ADMIN_PROJECTS = "/admin/projects/";
public static final String ADMIN_CREATE_PROJECT = "/admin/create-project/";
public static final String ADMIN_PLUGINS = "/admin/plugins/";
+ public static final String MY_GROUPS = "/groups/self";
public static String toChange(final ChangeInfo c) {
return toChange(c.getId());
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java b/gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java
new file mode 100644
index 0000000..fc5bb56
--- /dev/null
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/PluginData.java
@@ -0,0 +1,46 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.package com.google.gerrit.common;
+
+package com.google.gerrit.common;
+
+import com.google.common.base.Objects;
+
+import java.io.File;
+
+public class PluginData {
+ public final String name;
+ public final String version;
+ public final File pluginFile;
+
+ public PluginData(String name, String version, File pluginFile) {
+ this.name = name;
+ this.version = version;
+ this.pluginFile = pluginFile;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof PluginData) {
+ PluginData o = (PluginData) obj;
+ return Objects.equal(name, o.name) && Objects.equal(version, o.version)
+ && Objects.equal(pluginFile, o.pluginFile);
+ }
+ return super.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(name, version, pluginFile);
+ }
+}
\ No newline at end of file
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeDetail.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeDetail.java
index 3342bc2..e067f06 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeDetail.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeDetail.java
@@ -14,10 +14,10 @@
package com.google.gerrit.common.data;
+import com.google.gerrit.extensions.common.SubmitType;
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.reviewdb.client.Project;
import java.util.List;
import java.util.Set;
@@ -41,7 +41,7 @@
protected List<PatchSet> patchSets;
protected Set<PatchSet.Id> patchSetsWithDraftComments;
protected List<SubmitRecord> submitRecords;
- protected Project.SubmitType submitType;
+ protected SubmitType submitType;
protected SubmitTypeRecord submitTypeRecord;
protected boolean canSubmit;
protected List<ChangeMessage> messages;
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/GerritConfig.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/GerritConfig.java
index 38afaab..66309ea 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/GerritConfig.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/GerritConfig.java
@@ -22,6 +22,7 @@
import com.google.gerrit.reviewdb.client.AuthType;
import com.google.gerrit.reviewdb.client.Project;
+import java.util.List;
import java.util.Set;
public class GerritConfig implements Cloneable {
@@ -33,7 +34,7 @@
protected String httpPasswordUrl;
protected String reportBugUrl;
protected String reportBugText;
- protected boolean gitBasicAuth;
+ protected boolean httpPasswordSettingsEnabled = true;
protected GitwebConfig gitweb;
protected boolean useContributorAgreements;
@@ -53,6 +54,7 @@
protected int suggestFrom;
protected int changeUpdateDelay;
protected AccountGeneralPreferences.ChangeScreen changeScreen;
+ protected List<String> archiveFormats;
protected int largeChangeSize;
protected boolean newFeatures;
@@ -112,12 +114,12 @@
reportBugText = t;
}
- public boolean isGitBasicAuth() {
- return gitBasicAuth;
+ public boolean isHttpPasswordSettingsEnabled() {
+ return httpPasswordSettingsEnabled;
}
- public void setGitBasicAuth(boolean gba) {
- gitBasicAuth = gba;
+ public void setHttpPasswordSettingsEnabled(boolean httpPasswordSettingsEnabled) {
+ this.httpPasswordSettingsEnabled = httpPasswordSettingsEnabled;
}
public String getEditFullNameUrl() {
@@ -291,6 +293,14 @@
this.largeChangeSize = largeChangeSize;
}
+ public List<String> getArchiveFormats() {
+ return archiveFormats;
+ }
+
+ public void setArchiveFormats(List<String> formats) {
+ archiveFormats = formats;
+ }
+
public boolean getNewFeatures() {
return newFeatures;
}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java
index c596c1e..28629b9 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelType.java
@@ -108,6 +108,7 @@
protected boolean copyMaxScore;
protected boolean copyAllScoresOnTrivialRebase;
protected boolean copyAllScoresIfNoCodeChange;
+ protected short defaultValue;
protected List<LabelValue> values;
protected short maxNegative;
@@ -125,6 +126,7 @@
this.name = checkName(name);
canOverride = true;
values = sortValues(valueList);
+ defaultValue = 0;
abbreviation = defaultAbbreviation(name);
functionName = "MaxWithBlock";
@@ -200,6 +202,14 @@
return v.getValue() > 0 ? v : null;
}
+ public short getDefaultValue() {
+ return defaultValue;
+ }
+
+ public void setDefaultValue(short defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
public boolean isCopyMinScore() {
return copyMinScore;
}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelTypes.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelTypes.java
index b47445e..18928f2 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelTypes.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/LabelTypes.java
@@ -33,7 +33,7 @@
public LabelTypes(final List<? extends LabelType> approvals) {
labelTypes =
- Collections.unmodifiableList(new ArrayList<LabelType>(approvals));
+ Collections.unmodifiableList(new ArrayList<>(approvals));
}
public List<LabelType> getLabelTypes() {
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 0326e02..2379b4a 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
@@ -48,7 +48,7 @@
private static final int labelAsIndex;
static {
- NAMES_LC = new ArrayList<String>();
+ NAMES_LC = new ArrayList<>();
NAMES_LC.add(OWNER.toLowerCase());
NAMES_LC.add(READ.toLowerCase());
NAMES_LC.add(ABANDON.toLowerCase());
@@ -229,7 +229,7 @@
private void initRules() {
if (rules == null) {
- rules = new ArrayList<PermissionRule>(4);
+ rules = new ArrayList<>(4);
}
}
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitTypeRecord.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitTypeRecord.java
index 4eea798..7b19f4c 100644
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitTypeRecord.java
+++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitTypeRecord.java
@@ -14,7 +14,7 @@
package com.google.gerrit.common.data;
-import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.extensions.common.SubmitType;
/**
* Describes the submit type for a change.
@@ -31,7 +31,7 @@
RULE_ERROR
}
- public static SubmitTypeRecord OK(Project.SubmitType type) {
+ public static SubmitTypeRecord OK(SubmitType type) {
SubmitTypeRecord r = new SubmitTypeRecord();
r.status = Status.OK;
r.type = type;
@@ -39,7 +39,7 @@
}
public Status status;
- public Project.SubmitType type;
+ public SubmitType type;
public String errorMessage;
public String toString() {
diff --git a/gerrit-extension-api/BUCK b/gerrit-extension-api/BUCK
index 0302afd..6ce24b3 100644
--- a/gerrit-extension-api/BUCK
+++ b/gerrit-extension-api/BUCK
@@ -4,8 +4,11 @@
gwt_module(
name = 'client',
srcs = glob([
+ SRC + 'api/projects/ProjectState.java',
+ SRC + 'common/InheritableBoolean.java',
+ SRC + 'common/ListChangesOption.java',
+ SRC + 'common/SubmitType.java',
SRC + 'webui/GerritTopMenu.java',
- SRC + 'common/ListChangesOption.java'
]),
gwtxml = SRC + 'Extensions.gwt.xml',
visibility = ['PUBLIC'],
@@ -45,7 +48,7 @@
name = 'extension-api-javadoc',
title = 'Gerrit Review Extension API Documentation',
pkg = 'com.google.gerrit.extensions',
- paths = ['$SRCDIR/src/main/java'],
+ paths = ['src/main/java'],
srcs = SRCS,
deps = [
'//lib/guice:javax-inject',
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/Extensions.gwt.xml b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/Extensions.gwt.xml
index df53ef1..757e046 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/Extensions.gwt.xml
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/Extensions.gwt.xml
@@ -14,6 +14,7 @@
limitations under the License.
-->
<module>
- <source path='webui' />
+ <source path='api' />
<source path='common' />
+ <source path='webui' />
</module>
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RootRelative.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RootRelative.java
new file mode 100644
index 0000000..3875b77
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/RootRelative.java
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.extensions.annotations;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.inject.BindingAnnotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation applied to HttpServletRequest and HttpServletResponse
+ * when they are inherited from Gerrit instead of being injected by
+ * a plugin's ServletModule. This means that the path returned by
+ * {@link javax.servlet.http.HttpServletRequest#getPathInfo} is
+ * relative to the Gerrit root instead of a path within the plugin's
+ * URL space.
+ */
+@Target({ElementType.PARAMETER, ElementType.FIELD})
+@Retention(RUNTIME)
+@BindingAnnotation
+public @interface RootRelative {
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java
index 844807b..cc5807b 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java
@@ -14,10 +14,34 @@
package com.google.gerrit.extensions.api;
+import com.google.gerrit.extensions.api.accounts.Accounts;
import com.google.gerrit.extensions.api.changes.Changes;
import com.google.gerrit.extensions.api.projects.Projects;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
public interface GerritApi {
+ public Accounts accounts();
public Changes changes();
public Projects projects();
+
+ /**
+ * A default implementation which allows source compatibility
+ * when adding new methods to the interface.
+ **/
+ public class NotImplemented implements GerritApi {
+ @Override
+ public Accounts accounts() {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public Changes changes() {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public Projects projects() {
+ throw new NotImplementedException();
+ }
+ }
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
new file mode 100644
index 0000000..d571cfd
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
@@ -0,0 +1,47 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.extensions.api.accounts;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+
+public interface AccountApi {
+ AccountInfo get() throws RestApiException;
+
+ void starChange(String id) throws RestApiException;
+ void unstarChange(String id) throws RestApiException;
+
+ /**
+ * A default implementation which allows source compatibility
+ * when adding new methods to the interface.
+ **/
+ public class NotImplemented implements AccountApi {
+ @Override
+ public AccountInfo get() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void starChange(String id) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void unstarChange(String id) throws RestApiException {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java
new file mode 100644
index 0000000..749b12a
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/Accounts.java
@@ -0,0 +1,39 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.extensions.api.accounts;
+
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+
+public interface Accounts {
+ AccountApi id(String id) throws RestApiException;
+ AccountApi self() throws RestApiException;
+
+ /**
+ * A default implementation which allows source compatibility
+ * when adding new methods to the interface.
+ **/
+ public class NotImplemented implements Accounts {
+ @Override
+ public AccountApi id(String id) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public AccountApi self() throws RestApiException {
+ throw new NotImplementedException();
+ }
+ }
+}
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 f0a9e4d..3382b76 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
@@ -16,6 +16,7 @@
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.ListChangesOption;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
import com.google.gerrit.extensions.restapi.RestApiException;
import java.util.EnumSet;
@@ -45,4 +46,85 @@
ChangeInfo get() throws RestApiException;
/** {@code get} with {@link ListChangesOption} set to NONE. */
ChangeInfo info() throws RestApiException;
+
+ /**
+ * A default implementation which allows source compatibility
+ * when adding new methods to the interface.
+ **/
+ public class NotImplemented implements ChangeApi {
+ @Override
+ public String id() {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public RevisionApi current() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public RevisionApi revision(int id) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public RevisionApi revision(String id) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void abandon() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void abandon(AbandonInput in) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void restore() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void restore(RestoreInput in) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ChangeApi revert() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ChangeApi revert(RevertInput in) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void addReviewer(AddReviewerInput in) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void addReviewer(String in) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ChangeInfo get(EnumSet<ListChangesOption> options) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ChangeInfo get() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ChangeInfo info() throws RestApiException {
+ throw new NotImplementedException();
+ }
+ }
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java
index 48e9fd3..9debb6b 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java
@@ -14,6 +14,7 @@
package com.google.gerrit.extensions.api.changes;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
import com.google.gerrit.extensions.restapi.RestApiException;
public interface Changes {
@@ -21,4 +22,25 @@
ChangeApi id(String triplet) throws RestApiException;
ChangeApi id(String project, String branch, String id)
throws RestApiException;
+
+ /**
+ * A default implementation which allows source compatibility
+ * when adding new methods to the interface.
+ **/
+ public class NotImplemented implements Changes {
+ @Override
+ public ChangeApi id(int id) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ChangeApi id(String triplet) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ChangeApi id(String project, String branch, String id) throws RestApiException {
+ throw new NotImplementedException();
+ }
+ }
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewInput.java
index 993fa14..9a88b0c 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewInput.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewInput.java
@@ -97,7 +97,7 @@
throw new IllegalArgumentException();
}
if (labels == null) {
- labels = new LinkedHashMap<String, Short>(4);
+ labels = new LinkedHashMap<>(4);
}
labels.put(name, value);
return this;
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
index 4f90be2..a2a96f9 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.java
@@ -14,6 +14,7 @@
package com.google.gerrit.extensions.api.changes;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
import com.google.gerrit.extensions.restapi.RestApiException;
public interface RevisionApi {
@@ -26,4 +27,51 @@
void publish() throws RestApiException;
ChangeApi cherryPick(CherryPickInput in) throws RestApiException;
ChangeApi rebase() throws RestApiException;
+ boolean canRebase();
+
+ /**
+ * A default implementation which allows source compatibility
+ * when adding new methods to the interface.
+ **/
+ public class NotImplemented implements RevisionApi {
+ @Override
+ public void delete() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void review(ReviewInput in) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void submit() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void submit(SubmitInput in) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public void publish() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ChangeApi cherryPick(CherryPickInput in) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ChangeApi rebase() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public boolean canRebase() {
+ throw new NotImplementedException();
+ }
+ }
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchApi.java
index 2f1533f..f88a2cb 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/BranchApi.java
@@ -14,8 +14,20 @@
package com.google.gerrit.extensions.api.projects;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
import com.google.gerrit.extensions.restapi.RestApiException;
public interface BranchApi {
BranchApi create(BranchInput in) throws RestApiException;
+
+ /**
+ * A default implementation which allows source compatibility
+ * when adding new methods to the interface.
+ **/
+ public class NotImplemented implements BranchApi {
+ @Override
+ public BranchApi create(BranchInput in) throws RestApiException {
+ throw new NotImplementedException();
+ }
+ }
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
index 1c7209d..d013c5d 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectApi.java
@@ -14,6 +14,39 @@
package com.google.gerrit.extensions.api.projects;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+
public interface ProjectApi {
+ ProjectApi create() throws RestApiException;
+ ProjectApi create(ProjectInput in) throws RestApiException;
+ ProjectInfo get();
BranchApi branch(String ref);
+
+ /**
+ * A default implementation which allows source compatibility
+ * when adding new methods to the interface.
+ **/
+ public class NotImplemented implements ProjectApi {
+ @Override
+ public ProjectApi create() throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ProjectApi create(ProjectInput in) throws RestApiException {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public ProjectInfo get() {
+ throw new NotImplementedException();
+ }
+
+ @Override
+ public BranchApi branch(String ref) {
+ throw new NotImplementedException();
+ }
+ }
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectInput.java
new file mode 100644
index 0000000..74b2be8
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectInput.java
@@ -0,0 +1,43 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.extensions.api.projects;
+
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
+
+import java.util.List;
+import java.util.Map;
+
+public class ProjectInput {
+ public String name;
+ public String parent;
+ public String description;
+ public boolean permissionsOnly;
+ public boolean createEmptyCommit;
+ public SubmitType submitType;
+ public List<String> branches;
+ public List<String> owners;
+ public InheritableBoolean useContributorAgreements;
+ public InheritableBoolean useSignedOffBy;
+ public InheritableBoolean useContentMerge;
+ public InheritableBoolean requireChangeId;
+ public String maxObjectSizeLimit;
+ public Map<String, Map<String, ConfigValue>> pluginConfigValues;
+
+ public static class ConfigValue {
+ public String value;
+ public List<String> values;
+ }
+}
\ No newline at end of file
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectState.java
similarity index 62%
copy from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectState.java
index 96e2ec8..407b7c7 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/ProjectState.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,16 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.pgm.util;
+package com.google.gerrit.extensions.api.projects;
-public class Die extends RuntimeException {
- private static final long serialVersionUID = 1L;
-
- public Die(final String why) {
- super(why);
- }
-
- public Die(final String why, final Throwable cause) {
- super(why, cause);
- }
-}
+public enum ProjectState {
+ ACTIVE,
+ READ_ONLY,
+ HIDDEN
+}
\ No newline at end of file
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java
index a3a4137..a0f22b9 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/projects/Projects.java
@@ -14,8 +14,20 @@
package com.google.gerrit.extensions.api.projects;
+import com.google.gerrit.extensions.restapi.NotImplementedException;
import com.google.gerrit.extensions.restapi.RestApiException;
public interface Projects {
ProjectApi name(String name) throws RestApiException;
+
+ /**
+ * A default implementation which allows source compatibility
+ * when adding new methods to the interface.
+ **/
+ public class NotImplemented implements Projects {
+ @Override
+ public ProjectApi name(String name) throws RestApiException {
+ throw new NotImplementedException();
+ }
+ }
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInfo.java
index f85684e..653ec37 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ChangeInfo.java
@@ -39,4 +39,5 @@
public Map<String, LabelInfo> labels;
public Collection<ChangeMessageInfo> messages;
public Map<String, RevisionInfo> revisions;
+ public int _number;
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/InheritableBoolean.java
similarity index 62%
copy from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/InheritableBoolean.java
index 96e2ec8..676c4d3 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/InheritableBoolean.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,16 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.pgm.util;
+package com.google.gerrit.extensions.common;
-public class Die extends RuntimeException {
- private static final long serialVersionUID = 1L;
-
- public Die(final String why) {
- super(why);
- }
-
- public Die(final String why, final Throwable cause) {
- super(why, cause);
- }
-}
+public enum InheritableBoolean {
+ TRUE,
+ FALSE,
+ INHERIT
+}
\ No newline at end of file
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/LabelInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/LabelInfo.java
index fd6008f..1e4edcd 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/LabelInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/LabelInfo.java
@@ -25,6 +25,7 @@
public List<ApprovalInfo> all;
public Map<String, String> values;
public Short value;
+ public Short defaultValue;
public Boolean optional;
public Boolean blocking;
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ListChangesOption.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ListChangesOption.java
index c23e312..f9f8b62 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ListChangesOption.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ListChangesOption.java
@@ -49,7 +49,10 @@
DRAFT_COMMENTS(12),
/** Include download commands for the caller. */
- DOWNLOAD_COMMANDS(13);
+ DOWNLOAD_COMMANDS(13),
+
+ /** Include patch set weblinks. */
+ WEB_LINKS(14);
private final int value;
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProjectInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProjectInfo.java
new file mode 100644
index 0000000..bb07e44
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/ProjectInfo.java
@@ -0,0 +1,30 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.extensions.common;
+
+import com.google.gerrit.extensions.api.projects.ProjectState;
+
+import java.util.List;
+import java.util.Map;
+
+public class ProjectInfo {
+ public String id;
+ public String name;
+ public String parent;
+ public String description;
+ public ProjectState state;
+ public Map<String, String> branches;
+ public List<WebLinkInfo> webLinks;
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RevisionInfo.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RevisionInfo.java
index ea5b068..8f61aa2 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RevisionInfo.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/RevisionInfo.java
@@ -14,6 +14,7 @@
package com.google.gerrit.extensions.common;
+import java.util.List;
import java.util.Map;
public class RevisionInfo {
@@ -25,4 +26,5 @@
public CommitInfo commit;
public Map<String, FileInfo> files;
public Map<String, ActionInfo> actions;
+ public List<WebLinkInfo> webLinks;
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SubmitType.java
similarity index 62%
copy from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SubmitType.java
index 96e2ec8..95a9693 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/SubmitType.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,16 +12,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.pgm.util;
+package com.google.gerrit.extensions.common;
-public class Die extends RuntimeException {
- private static final long serialVersionUID = 1L;
-
- public Die(final String why) {
- super(why);
- }
-
- public Die(final String why, final Throwable cause) {
- super(why, cause);
- }
-}
+public enum SubmitType {
+ FAST_FORWARD_ONLY,
+ MERGE_IF_NECESSARY,
+ REBASE_IF_NECESSARY,
+ MERGE_ALWAYS,
+ CHERRY_PICK
+}
\ No newline at end of file
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/WebLinkInfo.java
similarity index 63%
copy from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/WebLinkInfo.java
index 96e2ec8..7695c8c 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/common/WebLinkInfo.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,16 +12,14 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.pgm.util;
+package com.google.gerrit.extensions.common;
-public class Die extends RuntimeException {
- private static final long serialVersionUID = 1L;
+public class WebLinkInfo {
+ public String name;
+ public String url;
- public Die(final String why) {
- super(why);
- }
-
- public Die(final String why, final Throwable cause) {
- super(why, cause);
+ public WebLinkInfo(String name, String url) {
+ this.name = name;
+ this.url = url;
}
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java
index aa1dc76..9ef7d1b 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItem.java
@@ -78,7 +78,7 @@
Key<DynamicItem<T>> key = (Key<DynamicItem<T>>) Key.get(
Types.newParameterizedType(DynamicItem.class, member.getType()));
binder.bind(key)
- .toProvider(new DynamicItemProvider<T>(member, key))
+ .toProvider(new DynamicItemProvider<>(member, key))
.in(Scopes.SINGLETON);
}
@@ -111,10 +111,10 @@
DynamicItem(Key<DynamicItem<T>> key, Provider<T> provider, String pluginName) {
NamedProvider<T> in = null;
if (provider != null) {
- in = new NamedProvider<T>(provider, pluginName);
+ in = new NamedProvider<>(provider, pluginName);
}
this.key = key;
- this.ref = new AtomicReference<NamedProvider<T>>(in);
+ this.ref = new AtomicReference<>(in);
}
/**
@@ -148,19 +148,22 @@
* @return handle to remove the item at a later point in time.
*/
public RegistrationHandle set(Provider<T> impl, String pluginName) {
- final NamedProvider<T> item = new NamedProvider<T>(impl, pluginName);
- while (!ref.compareAndSet(null, item)) {
- NamedProvider<T> old = ref.get();
- if (old != null) {
+ final NamedProvider<T> item = new NamedProvider<>(impl, pluginName);
+ NamedProvider<T> old = null;
+ while (!ref.compareAndSet(old, item)) {
+ old = ref.get();
+ if (old != null && !"gerrit".equals(old.pluginName)) {
throw new ProvisionException(String.format(
"%s already provided by %s, ignoring plugin %s",
key.getTypeLiteral(), old.pluginName, pluginName));
}
}
+
+ final NamedProvider<T> defaultItem = old;
return new RegistrationHandle() {
@Override
public void remove() {
- ref.compareAndSet(item, null);
+ ref.compareAndSet(item, defaultItem);
}
};
}
@@ -177,25 +180,28 @@
*/
public ReloadableRegistrationHandle<T> set(Key<T> key, Provider<T> impl,
String pluginName) {
- final NamedProvider<T> item = new NamedProvider<T>(impl, pluginName);
- while (!ref.compareAndSet(null, item)) {
- NamedProvider<T> old = ref.get();
- if (old != null) {
+ final NamedProvider<T> item = new NamedProvider<>(impl, pluginName);
+ NamedProvider<T> old = null;
+ while (!ref.compareAndSet(old, item)) {
+ old = ref.get();
+ if (old != null && !"gerrit".equals(old.pluginName)) {
throw new ProvisionException(String.format(
"%s already provided by %s, ignoring plugin %s",
this.key.getTypeLiteral(), old.pluginName, pluginName));
}
}
- return new ReloadableHandle(key, item);
+ return new ReloadableHandle(key, item, old);
}
private class ReloadableHandle implements ReloadableRegistrationHandle<T> {
private final Key<T> key;
private final NamedProvider<T> item;
+ private final NamedProvider<T> defaultItem;
- ReloadableHandle(Key<T> key, NamedProvider<T> item) {
+ ReloadableHandle(Key<T> key, NamedProvider<T> item, NamedProvider<T> defaultItem) {
this.key = key;
this.item = item;
+ this.defaultItem = defaultItem;
}
@Override
@@ -205,14 +211,14 @@
@Override
public void remove() {
- ref.compareAndSet(item, null);
+ ref.compareAndSet(item, defaultItem);
}
@Override
public ReloadableHandle replace(Key<T> newKey, Provider<T> newItem) {
- NamedProvider<T> n = new NamedProvider<T>(newItem, item.pluginName);
+ NamedProvider<T> n = new NamedProvider<>(newItem, item.pluginName);
if (ref.compareAndSet(item, n)) {
- return new ReloadableHandle(newKey, n);
+ return new ReloadableHandle(newKey, n, defaultItem);
}
return null;
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java
index 1074ee5..9b09d15 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicItemProvider.java
@@ -37,7 +37,7 @@
}
public DynamicItem<T> get() {
- return new DynamicItem<T>(key, find(injector, type), "gerrit");
+ return new DynamicItem<>(key, find(injector, type), "gerrit");
}
private static <T> Provider<T> find(Injector src, TypeLiteral<T> type) {
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMap.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMap.java
index ea4a751..4251891 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMap.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMap.java
@@ -81,14 +81,14 @@
Key<DynamicMap<T>> key = (Key<DynamicMap<T>>) Key.get(
Types.newParameterizedType(DynamicMap.class, member.getType()));
binder.bind(key)
- .toProvider(new DynamicMapProvider<T>(member))
+ .toProvider(new DynamicMapProvider<>(member))
.in(Scopes.SINGLETON);
}
final ConcurrentMap<NamePair, Provider<T>> items;
DynamicMap() {
- items = new ConcurrentHashMap<NamePair, Provider<T>>(
+ items = new ConcurrentHashMap<>(
16 /* initial size */,
0.75f /* load factor */,
1 /* concurrency level of 1, load/unload is single threaded */);
@@ -115,7 +115,7 @@
* @return sorted set of active plugins that supply at least one item.
*/
public SortedSet<String> plugins() {
- SortedSet<String> r = new TreeSet<String>();
+ SortedSet<String> r = new TreeSet<>();
for (NamePair p : items.keySet()) {
r.add(p.pluginName);
}
@@ -129,7 +129,7 @@
* @return items exported by a plugin, keyed by the export name.
*/
public SortedMap<String, Provider<T>> byPlugin(String pluginName) {
- SortedMap<String, Provider<T>> r = new TreeMap<String, Provider<T>>();
+ SortedMap<String, Provider<T>> r = new TreeMap<>();
for (Map.Entry<NamePair, Provider<T>> e : items.entrySet()) {
if (e.getKey().pluginName.equals(pluginName)) {
r.put(e.getKey().exportName, e.getValue());
@@ -206,4 +206,8 @@
return false;
}
}
+
+ public static <T> DynamicMap<T> emptyMap() {
+ return new DynamicMap<T>() {};
+ }
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java
index c6e4701..2554673 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicMapProvider.java
@@ -34,7 +34,7 @@
public DynamicMap<T> get() {
PrivateInternals_DynamicMapImpl<T> m =
- new PrivateInternals_DynamicMapImpl<T>();
+ new PrivateInternals_DynamicMapImpl<>();
List<Binding<T>> bindings = injector.findBindingsByType(type);
if (bindings != null) {
for (Binding<T> b : bindings) {
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSet.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSet.java
index b2f19e5..628745a 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSet.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSet.java
@@ -72,7 +72,7 @@
Key<DynamicSet<T>> key = (Key<DynamicSet<T>>) Key.get(
Types.newParameterizedType(DynamicSet.class, member.getType()));
binder.bind(key)
- .toProvider(new DynamicSetProvider<T>(member))
+ .toProvider(new DynamicSetProvider<>(member))
.in(Scopes.SINGLETON);
}
@@ -136,7 +136,7 @@
private final CopyOnWriteArrayList<AtomicReference<Provider<T>>> items;
DynamicSet(Collection<AtomicReference<Provider<T>>> base) {
- items = new CopyOnWriteArrayList<AtomicReference<Provider<T>>>(base);
+ items = new CopyOnWriteArrayList<>(base);
}
@Override
@@ -194,8 +194,7 @@
* @return handle to remove the item at a later point in time.
*/
public RegistrationHandle add(final Provider<T> item) {
- final AtomicReference<Provider<T>> ref =
- new AtomicReference<Provider<T>>(item);
+ final AtomicReference<Provider<T>> ref = new AtomicReference<>(item);
items.add(ref);
return new RegistrationHandle() {
@Override
@@ -218,7 +217,7 @@
* without it ever leaving the collection.
*/
public ReloadableRegistrationHandle<T> add(Key<T> key, Provider<T> item) {
- AtomicReference<Provider<T>> ref = new AtomicReference<Provider<T>>(item);
+ AtomicReference<Provider<T>> ref = new AtomicReference<>(item);
items.add(ref);
return new ReloadableHandle(ref, key, item);
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java
index 21fa1b8..9ea96d4 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSetProvider.java
@@ -36,7 +36,7 @@
}
public DynamicSet<T> get() {
- return new DynamicSet<T>(find(injector, type));
+ return new DynamicSet<>(find(injector, type));
}
private static <T> List<AtomicReference<Provider<T>>> find(
@@ -47,16 +47,12 @@
if (cnt == 0) {
return Collections.emptyList();
}
- List<AtomicReference<Provider<T>>> r = newList(cnt);
+ List<AtomicReference<Provider<T>>> r = new ArrayList<>(cnt);
for (Binding<T> b : bindings) {
if (b.getKey().getAnnotation() != null) {
- r.add(new AtomicReference<Provider<T>>(b.getProvider()));
+ r.add(new AtomicReference<>(b.getProvider()));
}
}
return r;
}
-
- private static <T> List<AtomicReference<Provider<T>>> newList(int cnt) {
- return new ArrayList<AtomicReference<Provider<T>>>(cnt);
- }
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java
index 8bc57ab..96538e1 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/PrivateInternals_DynamicTypes.java
@@ -31,7 +31,7 @@
/** <b>DO NOT USE</b> */
public class PrivateInternals_DynamicTypes {
public static Map<TypeLiteral<?>, DynamicItem<?>> dynamicItemsOf(Injector src) {
- Map<TypeLiteral<?>, DynamicItem<?>> m = newHashMap();
+ Map<TypeLiteral<?>, DynamicItem<?>> m = new HashMap<>();
for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
TypeLiteral<?> type = e.getKey().getTypeLiteral();
if (type.getRawType() == DynamicItem.class) {
@@ -47,7 +47,7 @@
}
public static Map<TypeLiteral<?>, DynamicSet<?>> dynamicSetsOf(Injector src) {
- Map<TypeLiteral<?>, DynamicSet<?>> m = newHashMap();
+ Map<TypeLiteral<?>, DynamicSet<?>> m = new HashMap<>();
for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
TypeLiteral<?> type = e.getKey().getTypeLiteral();
if (type.getRawType() == DynamicSet.class) {
@@ -63,7 +63,7 @@
}
public static Map<TypeLiteral<?>, DynamicMap<?>> dynamicMapsOf(Injector src) {
- Map<TypeLiteral<?>, DynamicMap<?>> m = newHashMap();
+ Map<TypeLiteral<?>, DynamicMap<?>> m = new HashMap<>();
for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
TypeLiteral<?> type = e.getKey().getTypeLiteral();
if (type.getRawType() == DynamicMap.class) {
@@ -85,7 +85,7 @@
return Collections.emptyList();
}
- List<RegistrationHandle> handles = new ArrayList<RegistrationHandle>(4);
+ List<RegistrationHandle> handles = new ArrayList<>(4);
try {
for (Map.Entry<TypeLiteral<?>, DynamicItem<?>> e : items.entrySet()) {
@SuppressWarnings("unchecked")
@@ -95,9 +95,7 @@
DynamicItem<Object> item = (DynamicItem<Object>) e.getValue();
for (Binding<Object> b : bindings(src, type)) {
- if (b.getKey().getAnnotation() != null) {
- handles.add(item.set(b.getKey(), b.getProvider(), pluginName));
- }
+ handles.add(item.set(b.getKey(), b.getProvider(), pluginName));
}
}
} catch (RuntimeException e) {
@@ -117,7 +115,7 @@
return Collections.emptyList();
}
- List<RegistrationHandle> handles = new ArrayList<RegistrationHandle>(4);
+ List<RegistrationHandle> handles = new ArrayList<>(4);
try {
for (Map.Entry<TypeLiteral<?>, DynamicSet<?>> e : sets.entrySet()) {
@SuppressWarnings("unchecked")
@@ -150,7 +148,7 @@
return Collections.emptyList();
}
- List<RegistrationHandle> handles = new ArrayList<RegistrationHandle>(4);
+ List<RegistrationHandle> handles = new ArrayList<>(4);
try {
for (Map.Entry<TypeLiteral<?>, DynamicMap<?>> e : maps.entrySet()) {
@SuppressWarnings("unchecked")
@@ -185,7 +183,7 @@
@Override
public void start() {
- handles = new ArrayList<RegistrationHandle>(4);
+ handles = new ArrayList<>(4);
Injector parent = self.getParent();
while (parent != null) {
handles.addAll(attachSets(self, dynamicSetsOf(parent)));
@@ -213,10 +211,6 @@
}
}
- private static <K,V> Map<K, V> newHashMap() {
- return new HashMap<K,V>();
- }
-
private static <T> List<Binding<T>> bindings(Injector src, TypeLiteral<T> type) {
return src.findBindingsByType(type);
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/NotImplementedException.java
similarity index 65%
copy from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/NotImplementedException.java
index 96e2ec8..10d0a14 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/NotImplementedException.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,16 +12,13 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.pgm.util;
+package com.google.gerrit.extensions.restapi;
-public class Die extends RuntimeException {
+/** Method is not implemented in currently used implementation. */
+public class NotImplementedException extends UnsupportedOperationException {
private static final long serialVersionUID = 1L;
- public Die(final String why) {
- super(why);
- }
-
- public Die(final String why, final Throwable cause) {
- super(why, cause);
+ public NotImplementedException() {
+ super("Not implemented.");
}
}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Response.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Response.java
index 848004d..314c898 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Response.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/Response.java
@@ -21,12 +21,12 @@
/** HTTP 200 OK: pointless wrapper for type safety. */
public static <T> Response<T> ok(T value) {
- return new Impl<T>(200, value);
+ return new Impl<>(200, value);
}
/** HTTP 201 Created: typically used when a new resource is made. */
public static <T> Response<T> created(T value) {
- return new Impl<T>(201, value);
+ return new Impl<>(201, value);
}
/** HTTP 204 No Content: typically used when the resource is deleted. */
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiModule.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiModule.java
index b3a0e18..7708a5c 100644
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiModule.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiModule.java
@@ -31,47 +31,47 @@
protected <R extends RestResource>
ReadViewBinder<R> get(TypeLiteral<RestView<R>> viewType) {
- return new ReadViewBinder<R>(view(viewType, GET, "/"));
+ return new ReadViewBinder<>(view(viewType, GET, "/"));
}
protected <R extends RestResource>
ModifyViewBinder<R> put(TypeLiteral<RestView<R>> viewType) {
- return new ModifyViewBinder<R>(view(viewType, PUT, "/"));
+ return new ModifyViewBinder<>(view(viewType, PUT, "/"));
}
protected <R extends RestResource>
ModifyViewBinder<R> post(TypeLiteral<RestView<R>> viewType) {
- return new ModifyViewBinder<R>(view(viewType, POST, "/"));
+ return new ModifyViewBinder<>(view(viewType, POST, "/"));
}
protected <R extends RestResource>
ModifyViewBinder<R> delete(TypeLiteral<RestView<R>> viewType) {
- return new ModifyViewBinder<R>(view(viewType, DELETE, "/"));
+ return new ModifyViewBinder<>(view(viewType, DELETE, "/"));
}
protected <R extends RestResource>
ReadViewBinder<R> get(TypeLiteral<RestView<R>> viewType, String name) {
- return new ReadViewBinder<R>(view(viewType, GET, name));
+ return new ReadViewBinder<>(view(viewType, GET, name));
}
protected <R extends RestResource>
ModifyViewBinder<R> put(TypeLiteral<RestView<R>> viewType, String name) {
- return new ModifyViewBinder<R>(view(viewType, PUT, name));
+ return new ModifyViewBinder<>(view(viewType, PUT, name));
}
protected <R extends RestResource>
ModifyViewBinder<R> post(TypeLiteral<RestView<R>> viewType, String name) {
- return new ModifyViewBinder<R>(view(viewType, POST, name));
+ return new ModifyViewBinder<>(view(viewType, POST, name));
}
protected <R extends RestResource>
ModifyViewBinder<R> delete(TypeLiteral<RestView<R>> viewType, String name) {
- return new ModifyViewBinder<R>(view(viewType, DELETE, name));
+ return new ModifyViewBinder<>(view(viewType, DELETE, name));
}
protected <P extends RestResource>
ChildCollectionBinder<P> child(TypeLiteral<RestView<P>> type, String name) {
- return new ChildCollectionBinder<P>(view(type, GET, name));
+ return new ChildCollectionBinder<>(view(type, GET, name));
}
protected <R extends RestResource>
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java
new file mode 100644
index 0000000..b6086f2
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/PatchSetWebLink.java
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.gerrit.extensions.webui;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+
+@ExtensionPoint
+public interface PatchSetWebLink extends WebLink {
+
+ /**
+ * URL to patch set in external service.
+ *
+ * @param projectName Name of the project
+ * @param commit Commit of the patch set
+ * @return url to patch set in external service.
+ */
+ String getPatchSetUrl(final String projectName, final String commit);
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ProjectWebLink.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ProjectWebLink.java
new file mode 100644
index 0000000..61e9982
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/ProjectWebLink.java
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.extensions.webui;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+
+@ExtensionPoint
+public interface ProjectWebLink extends WebLink {
+
+ /**
+ * URL to project in external service.
+ *
+ * @param projectName Name of the project
+ * @return url to project in external service.
+ */
+ String getProjectUrl(String projectName);
+}
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiResult.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiResult.java
new file mode 100644
index 0000000..106db04
--- /dev/null
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/UiResult.java
@@ -0,0 +1,59 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.extensions.webui;
+
+import java.net.URI;
+
+/** Default result for {@link UiAction}s with no JavaScript. */
+public class UiResult {
+ /** Display an alert message to the user. */
+ public static UiResult alert(String message) {
+ UiResult r = new UiResult();
+ r.alert = message;
+ return r;
+ }
+
+ /** Launch URL in a new window. */
+ public static UiResult openUrl(URI uri) {
+ return openUrl(uri.toString());
+ }
+
+ /** Launch URL in a new window. */
+ public static UiResult openUrl(String url) {
+ UiResult r = new UiResult();
+ r.url = url;
+ r.openWindow = true;
+ return r;
+ }
+
+ /** Redirect the browser to a new URL. */
+ public static UiResult redirectUrl(String url) {
+ UiResult r = new UiResult();
+ r.url = url;
+ return r;
+ }
+
+ /** Alert the user with a message. */
+ protected String alert;
+
+ /** If present redirect browser to this URL. */
+ protected String url;
+
+ /** When true open {@link #url} in a new tab/window. */
+ protected Boolean openWindow;
+
+ private UiResult() {
+ }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebLink.java
similarity index 62%
copy from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebLink.java
index 96e2ec8..19d9ab7 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
+++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/WebLink.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -11,17 +11,14 @@
// 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.webui;
-package com.google.gerrit.pgm.util;
+public interface WebLink {
-public class Die extends RuntimeException {
- private static final long serialVersionUID = 1L;
-
- public Die(final String why) {
- super(why);
- }
-
- public Die(final String why, final Throwable cause) {
- super(why, cause);
- }
+ /**
+ * The link-name displayed in UI.
+ *
+ * @return name of link.
+ */
+ String getLinkName();
}
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java
index 0f6992d..af80b3c 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/css/rebind/CssLinker.java
@@ -44,8 +44,7 @@
final ArtifactSet returnTo = new ArtifactSet();
int index = 0;
- final HashMap<String, PublicResource> css =
- new HashMap<String, PublicResource>();
+ final HashMap<String, PublicResource> css = new HashMap<>();
for (final StandardStylesheetReference ssr : artifacts
.<StandardStylesheetReference> find(StandardStylesheetReference.class)) {
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommand.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommand.java
index 15caa34..a0fee2b 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommand.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommand.java
@@ -74,6 +74,12 @@
case KeyCodes.KEY_ESCAPE:
namedKey(b, KeyConstants.I.keyEsc());
break;
+ case KeyCodes.KEY_LEFT:
+ namedKey(b, KeyConstants.I.keyLeft());
+ break;
+ case KeyCodes.KEY_RIGHT:
+ namedKey(b, KeyConstants.I.keyRight());
+ break;
default:
b.openSpan();
b.setStyleName(KeyResources.I.css().helpKey());
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommandSet.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommandSet.java
index 6600a18..e2fec27 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommandSet.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyCommandSet.java
@@ -35,7 +35,7 @@
}
public KeyCommandSet(final String setName) {
- map = new HashMap<Integer, KeyCommand>();
+ map = new HashMap<>();
name = setName;
}
@@ -79,7 +79,7 @@
public void add(final KeyCommandSet set) {
if (sets == null) {
- sets = new ArrayList<KeyCommandSet>();
+ sets = new ArrayList<>();
}
assert !sets.contains(set);
sets.add(set);
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.java
index b4cb41e..d26ca8c 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.java
@@ -35,4 +35,6 @@
String keyShift();
String keyEnter();
String keyEsc();
+ String keyLeft();
+ String keyRight();
}
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.properties b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.properties
index 2e12b07..76a0318 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.properties
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyConstants.properties
@@ -13,3 +13,5 @@
keyShift = Shift
keyEnter = Enter
keyEsc = Esc
+keyLeft = Left
+keyRight = Right
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java
index 67a5ef4..c08e830 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/globalkey/client/KeyHelpPopup.java
@@ -133,8 +133,7 @@
* the same name, so that each set name appears at most once.
*/
private static Collection<KeyCommandSet> combinedSetsByName() {
- final LinkedHashMap<String, KeyCommandSet> byName =
- new LinkedHashMap<String, KeyCommandSet>();
+ LinkedHashMap<String, KeyCommandSet> byName = new LinkedHashMap<>();
for (final KeyCommandSet set : GlobalKey.active.all.getSets()) {
KeyCommandSet v = byName.get(set.getName());
if (v == null) {
@@ -171,7 +170,7 @@
lists.resizeRows(row + keys.size());
}
- Map<KeyCommand, Integer> rows = new HashMap<KeyCommand, Integer>();
+ Map<KeyCommand, Integer> rows = new HashMap<>();
FORMAT_KEYS: for (int i = 0; i < keys.size(); i++) {
final KeyCommand k = keys.get(i);
if (rows.containsKey(k)) {
@@ -234,7 +233,7 @@
}
private List<KeyCommand> sort(final KeyCommandSet set) {
- final List<KeyCommand> keys = new ArrayList<KeyCommand>(set.getKeys());
+ final List<KeyCommand> keys = new ArrayList<>(set.getKeys());
Collections.sort(keys, new Comparator<KeyCommand>() {
@Override
public int compare(KeyCommand arg0, KeyCommand arg1) {
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/AttMap.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/AttMap.java
index 46d7f51..b08b29f 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/AttMap.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/AttMap.java
@@ -23,7 +23,7 @@
private static final HashMap<String, Tag> TAGS;
static {
final Tag src = new SrcTag();
- TAGS = new HashMap<String, Tag>();
+ TAGS = new HashMap<>();
TAGS.put("a", new AnchorTag());
TAGS.put("form", new FormTag());
TAGS.put("img", src);
@@ -31,8 +31,8 @@
TAGS.put("frame", src);
}
- private final ArrayList<String> names = new ArrayList<String>();
- private final ArrayList<String> values = new ArrayList<String>();
+ private final ArrayList<String> names = new ArrayList<>();
+ private final ArrayList<String> values = new ArrayList<>();
private Tag tag = ANY;
private int live;
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java
index ed4e6cb..216add1 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/safehtml/client/HighlightSuggestOracle.java
@@ -45,7 +45,7 @@
final Response response) {
final String qpat = getQueryPattern(request.getQuery());
final boolean html = isHTML();
- final ArrayList<Suggestion> r = new ArrayList<Suggestion>();
+ final ArrayList<Suggestion> r = new ArrayList<>();
for (final Suggestion s : response.getSuggestions()) {
r.add(new BoldSuggestion(qpat, s, html));
}
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/DialogVisibleEvent.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/DialogVisibleEvent.java
index 80a940a..74218b4 100644
--- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/DialogVisibleEvent.java
+++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/user/client/DialogVisibleEvent.java
@@ -22,7 +22,7 @@
public static Type<DialogVisibleHandler> getType() {
if (TYPE == null) {
- TYPE = new Type<DialogVisibleHandler>();
+ TYPE = new Type<>();
}
return TYPE;
}
diff --git a/gerrit-gwtui/BUCK b/gerrit-gwtui/BUCK
index e978323..56c52bf 100644
--- a/gerrit-gwtui/BUCK
+++ b/gerrit-gwtui/BUCK
@@ -7,7 +7,7 @@
'unzip -q $SRCDIR/ui_dbg.zip;' +
'mv' +
' gerrit_ui/gerrit_ui.nocache.js' +
- ' gerrit_ui/gerrit_dbg.nocache.js;' +
+ ' gerrit_ui/dbg_gerrit_ui.nocache.js;' +
'unzip -qo $SRCDIR/ui_opt.zip;' +
'mkdir -p $(dirname $OUT);' +
'zip -qr $OUT .',
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 1b89a5a..0a9bd24 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
@@ -21,6 +21,7 @@
import static com.google.gerrit.common.PageLinks.ADMIN_PROJECTS;
import static com.google.gerrit.common.PageLinks.DASHBOARDS;
import static com.google.gerrit.common.PageLinks.MINE;
+import static com.google.gerrit.common.PageLinks.MY_GROUPS;
import static com.google.gerrit.common.PageLinks.PROJECTS;
import static com.google.gerrit.common.PageLinks.QUERY;
import static com.google.gerrit.common.PageLinks.REGISTER;
@@ -55,6 +56,7 @@
import com.google.gerrit.client.admin.CreateGroupScreen;
import com.google.gerrit.client.admin.CreateProjectScreen;
import com.google.gerrit.client.admin.GroupListScreen;
+import com.google.gerrit.client.admin.MyGroupsListScreen;
import com.google.gerrit.client.admin.PluginListScreen;
import com.google.gerrit.client.admin.ProjectAccessScreen;
import com.google.gerrit.client.admin.ProjectBranchesScreen;
@@ -233,7 +235,12 @@
extension(token);
} else if (matchExact(MINE, token)) {
- Gerrit.display(token, mine(token));
+ String defaultScreenToken = Gerrit.getDefaultScreenToken();
+ if (defaultScreenToken != null && !MINE.equals(defaultScreenToken)) {
+ select(defaultScreenToken);
+ } else {
+ Gerrit.display(token, mine(token));
+ }
} else if (matchPrefix("/dashboard/", token)) {
dashboard(token);
@@ -253,6 +260,9 @@
} else if (matchPrefix("/admin/", token)) {
admin(token);
+ } else if (matchExact(MY_GROUPS, token)) {
+ Gerrit.display(token, new MyGroupsListScreen());
+
} else if (/* DEPRECATED URL */matchPrefix("/c2/", token)) {
changeScreen2 = true;
change(token);
@@ -440,6 +450,17 @@
return;
}
+ if (rest.equals("self")) {
+ if (Gerrit.isSignedIn()) {
+ Gerrit.display(token, new AccountDashboardScreen(Gerrit.getUserAccount().getId()));
+ } else {
+ Screen s = new AccountDashboardScreen(null);
+ s.setRequiresSignIn(true);
+ Gerrit.display(token, s);
+ }
+ return;
+ }
+
if (rest.startsWith("?")) {
Gerrit.display(token, new CustomDashboardScreen(rest.substring(1)));
return;
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 600c8d8..dd9a28b 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
@@ -18,8 +18,10 @@
import static com.google.gerrit.common.data.GlobalCapability.CREATE_GROUP;
import static com.google.gerrit.common.data.GlobalCapability.CREATE_PROJECT;
+import com.google.gerrit.client.account.AccountApi;
import com.google.gerrit.client.account.AccountCapabilities;
import com.google.gerrit.client.account.AccountInfo;
+import com.google.gerrit.client.account.Preferences;
import com.google.gerrit.client.admin.ProjectScreen;
import com.google.gerrit.client.api.ApiGlue;
import com.google.gerrit.client.api.PluginLoader;
@@ -30,14 +32,15 @@
import com.google.gerrit.client.extensions.TopMenuItem;
import com.google.gerrit.client.extensions.TopMenuList;
import com.google.gerrit.client.patches.PatchScreen;
+import com.google.gerrit.client.rpc.CallbackGroup;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.ui.LinkMenuBar;
import com.google.gerrit.client.ui.LinkMenuItem;
import com.google.gerrit.client.ui.MorphingTabPanel;
import com.google.gerrit.client.ui.PatchLink;
+import com.google.gerrit.client.ui.ProjectLinkMenuItem;
import com.google.gerrit.client.ui.Screen;
-import com.google.gerrit.client.ui.ScreenLoadEvent;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.data.GerritConfig;
import com.google.gerrit.common.data.GitwebConfig;
@@ -48,7 +51,6 @@
import com.google.gerrit.reviewdb.client.AccountDiffPreference;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gerrit.reviewdb.client.AuthType;
-import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.aria.client.Roles;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
@@ -70,6 +72,7 @@
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.Window.Location;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FocusPanel;
@@ -104,6 +107,7 @@
private static GerritConfig myConfig;
private static HostPageData.Theme myTheme;
private static Account myAccount;
+ private static String defaultScreenToken;
private static AccountDiffPreference myAccountDiffPref;
private static String xGerritAuth;
@@ -211,6 +215,10 @@
}
}
+ public static void selectMenu(LinkMenuBar bar) {
+ menuLeft.selectTab(menuLeft.getWidgetIndex(bar));
+ }
+
/**
* Update the current history token after a screen change.
* <p>
@@ -265,6 +273,10 @@
return topMenu.isVisible();
}
+ public static String getDefaultScreenToken() {
+ return defaultScreenToken;
+ }
+
public static RootPanel getBottomMenu() {
return bottomMenu;
}
@@ -537,7 +549,7 @@
applyUserPreferences();
populateBottomMenu(bottomMenu, hpd);
- refreshMenuBar();
+ refreshMenuBar(false);
History.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
@@ -547,18 +559,27 @@
});
JumpKeys.register(body);
- String token = History.getToken();
- if (token.isEmpty()) {
- token = isSignedIn()
- ? PageLinks.MINE
- : PageLinks.toChangeQuery("status:open");
- }
-
saveDefaultTheme();
if (hpd.messages != null) {
new MessageOfTheDayBar(hpd.messages).show();
}
- PluginLoader.load(hpd.plugins, token);
+ CallbackGroup cbg = new CallbackGroup();
+ if (isSignedIn()) {
+ AccountApi.self().view("preferences").get(cbg.add(createMyMenuBarCallback()));
+ }
+ PluginLoader.load(hpd.plugins,
+ cbg.addFinal(new GerritCallback<VoidResult>() {
+ @Override
+ public void onSuccess(VoidResult result) {
+ String token = History.getToken();
+ if (token.isEmpty()) {
+ token = isSignedIn()
+ ? PageLinks.MINE
+ : PageLinks.toChangeQuery("status:open");
+ }
+ display(token);
+ }
+ }));
}
private void saveDefaultTheme() {
@@ -568,6 +589,10 @@
}
public static void refreshMenuBar() {
+ refreshMenuBar(true);
+ }
+
+ private static void refreshMenuBar(boolean populateMyMenu) {
menuLeft.clear();
menuRight.clear();
@@ -585,14 +610,12 @@
menuLeft.add(m, C.menuAll());
if (signedIn) {
- m = new LinkMenuBar();
- menuBars.put(GerritTopMenu.MY.menuName, m);
- addLink(m, C.menuMyChanges(), PageLinks.MINE);
- addLink(m, C.menuMyDrafts(), PageLinks.toChangeQuery("is:draft"));
- addLink(m, C.menuMyDraftComments(), PageLinks.toChangeQuery("has:draft"));
- addLink(m, C.menuMyWatchedChanges(), PageLinks.toChangeQuery("is:watched status:open"));
- addLink(m, C.menuMyStarredChanges(), PageLinks.toChangeQuery("is:starred"));
- menuLeft.add(m, C.menuMine());
+ LinkMenuBar myBar = new LinkMenuBar();
+ menuBars.put(GerritTopMenu.MY.menuName, myBar);
+ if (populateMyMenu) {
+ AccountApi.self().view("preferences").get(createMyMenuBarCallback());
+ }
+ menuLeft.add(myBar, C.menuMine());
menuLeft.selectTab(1);
} else {
menuLeft.selectTab(0);
@@ -609,22 +632,21 @@
addDiffLink(diffBar, C.menuDiffPatchSets(), PatchScreen.TopView.PATCH_SETS);
addDiffLink(diffBar, C.menuDiffFiles(), PatchScreen.TopView.FILES);
- final LinkMenuBar projectsBar = new LinkMenuBar() {
- @Override
- public void onScreenLoad(ScreenLoadEvent event) {
- if (event.getScreen() instanceof ProjectScreen) {
- menuLeft.selectTab(menuLeft.getWidgetIndex(this));
- }
- }
- };
+ final LinkMenuBar projectsBar = new LinkMenuBar();
menuBars.put(GerritTopMenu.PROJECTS.menuName, projectsBar);
addLink(projectsBar, C.menuProjectsList(), PageLinks.ADMIN_PROJECTS);
- addProjectLink(projectsBar, C.menuProjectsInfo(), ProjectScreen.INFO);
- addProjectLink(projectsBar, C.menuProjectsBranches(), ProjectScreen.BRANCH);
- addProjectLink(projectsBar, C.menuProjectsAccess(), ProjectScreen.ACCESS);
+ projectsBar.addItem(new ProjectLinkMenuItem(C.menuProjectsInfo(), ProjectScreen.INFO));
+ projectsBar.addItem(new ProjectLinkMenuItem(C.menuProjectsBranches(), ProjectScreen.BRANCH));
+ projectsBar.addItem(new ProjectLinkMenuItem(C.menuProjectsAccess(), ProjectScreen.ACCESS));
final LinkMenuItem dashboardsMenuItem =
- addProjectLink(projectsBar, C.menuProjectsDashboards(),
- ProjectScreen.DASHBOARDS);
+ new ProjectLinkMenuItem(C.menuProjectsDashboards(),
+ ProjectScreen.DASHBOARDS) {
+ protected boolean match(String token) {
+ return super.match(token) ||
+ (!getTargetHistoryToken().isEmpty() && ("/admin" + token).startsWith(getTargetHistoryToken()));
+ }
+ };
+ projectsBar.addItem(dashboardsMenuItem);
menuLeft.add(projectsBar, C.menuProjects());
if (signedIn) {
@@ -748,6 +770,27 @@
});
}
+ private static AsyncCallback<Preferences> createMyMenuBarCallback() {
+ return new GerritCallback<Preferences>() {
+ @Override
+ public void onSuccess(Preferences prefs) {
+ LinkMenuBar myBar = menuBars.get(GerritTopMenu.MY.menuName);
+ myBar.clear();
+ List<TopMenuItem> myMenuItems = Natives.asList(prefs.my());
+ String url = null;
+ if (!myMenuItems.isEmpty()) {
+ if (myMenuItems.get(0).getUrl().startsWith("#")) {
+ url = myMenuItems.get(0).getUrl().substring(1);
+ }
+ for (TopMenuItem item : myMenuItems) {
+ addExtensionLink(myBar, item);
+ }
+ }
+ defaultScreenToken = url;
+ }
+ };
+ }
+
public static void applyUserPreferences() {
if (myAccount != null) {
final AccountGeneralPreferences p = myAccount.getGeneralPreferences();
@@ -839,32 +882,6 @@
});
}
- private static LinkMenuItem addProjectLink(final LinkMenuBar m, final String text,
- final String panel) {
- LinkMenuItem i = new LinkMenuItem(text, "") {
- @Override
- public void onScreenLoad(ScreenLoadEvent event) {
- Screen screen = event.getScreen();
- Project.NameKey projectKey;
- if (screen instanceof ProjectScreen) {
- projectKey = ((ProjectScreen)screen).getProjectKey();
- } else {
- projectKey = ProjectScreen.getSavedKey();
- }
-
- if (projectKey != null) {
- setVisible(true);
- setTargetHistoryToken(Dispatcher.toProjectAdmin(projectKey, panel));
- } else {
- setVisible(false);
- }
- super.onScreenLoad(event);
- }
- };
- m.addItem(i);
- return i;
- }
-
private static void addDiffLink(final LinkMenuBar m, final String text,
final PatchScreen.Type type) {
m.addItem(new LinkMenuItem(text, "") {
@@ -890,15 +907,26 @@
}
private static void addExtensionLink(LinkMenuBar m, TopMenuItem item) {
- Anchor atag = anchor(item.getName(), isAbsolute(item.getUrl())
- ? item.getUrl()
- : selfRedirect(item.getUrl()));
-
- atag.setTarget(item.getTarget());
- if (item.getId() != null) {
- atag.getElement().setAttribute("id", item.getId());
+ if (item.getUrl().startsWith("#")
+ && (item.getTarget() == null || item.getTarget().isEmpty())) {
+ LinkMenuItem a =
+ new LinkMenuItem(item.getName(), item.getUrl().substring(1));
+ if (item.getId() != null) {
+ a.getElement().setAttribute("id", item.getId());
+ }
+ m.addItem(a);
+ } else {
+ Anchor atag = anchor(item.getName(), isAbsolute(item.getUrl())
+ ? item.getUrl()
+ : selfRedirect(item.getUrl()));
+ if (item.getTarget() != null && !item.getTarget().isEmpty()) {
+ atag.setTarget(item.getTarget());
+ }
+ if (item.getId() != null) {
+ atag.getElement().setAttribute("id", item.getId());
+ }
+ m.add(atag);
}
- m.add(atag);
}
private static boolean isAbsolute(String url) {
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 73c270b..5ba520c 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
@@ -117,4 +117,9 @@
String projectAccessProposeForReviewHint();
String userCannotVoteToolTip();
+
+ String stringListPanelAdd();
+ String stringListPanelDelete();
+ String stringListPanelUp();
+ String stringListPanelDown();
}
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 63b8fe1..58a6d08 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
@@ -100,3 +100,8 @@
projectAccessProposeForReviewHint = You may propose these modifications to the project owners by clicking on 'Save for Review'.
userCannotVoteToolTip = User cannot vote in this category
+
+stringListPanelAdd = Add
+stringListPanelDelete = Delete
+stringListPanelUp = Up
+stringListPanelDown = Down
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java
index 98b9534..12a1fea 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritCss.java
@@ -232,6 +232,7 @@
String sshHostKeyPanelKnownHostEntry();
String sshKeyPanelEncodedKey();
String sshKeyPanelInvalid();
+ String stringListPanelButtons();
String topMostCell();
String topmenu();
String topmenuMenuLeft();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java
index 3319457..90eb87b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritResources.java
@@ -28,6 +28,12 @@
@Source("arrowRight.gif")
public ImageResource arrowRight();
+ @Source("arrowUp.png")
+ public ImageResource arrowUp();
+
+ @Source("arrowDown.png")
+ public ImageResource arrowDown();
+
@Source("editText.png")
public ImageResource edit();
@@ -69,4 +75,7 @@
@Source("warning.png")
public ImageResource warning();
+
+ @Source("listAdd.png")
+ public ImageResource listAdd();
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/MessageOfTheDayBar.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/MessageOfTheDayBar.java
index fa569b8..b3d8c23 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/MessageOfTheDayBar.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/MessageOfTheDayBar.java
@@ -74,7 +74,7 @@
}
private static List<HostPageData.Message> filter(List<HostPageData.Message> in) {
- List<HostPageData.Message> show = new ArrayList<HostPageData.Message>();
+ List<HostPageData.Message> show = new ArrayList<>();
for (HostPageData.Message m : in) {
if (Cookies.getCookie(cookieName(m)) == null) {
show.add(m);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchSuggestOracle.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchSuggestOracle.java
index 0715aee..10220e5 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchSuggestOracle.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/SearchSuggestOracle.java
@@ -81,6 +81,7 @@
suggestions.add("comment:");
suggestions.add("conflicts:");
suggestions.add("project:");
+ suggestions.add("projects:");
suggestions.add("parentproject:");
suggestions.add("branch:");
suggestions.add("topic:");
@@ -101,6 +102,7 @@
suggestions.add("is:owner");
suggestions.add("is:reviewer");
suggestions.add("is:open");
+ suggestions.add("is:pending");
suggestions.add("is:draft");
suggestions.add("is:closed");
suggestions.add("is:submitted");
@@ -110,6 +112,7 @@
suggestions.add("status:");
suggestions.add("status:open");
+ suggestions.add("status:pending");
suggestions.add("status:reviewed");
suggestions.add("status:submitted");
suggestions.add("status:closed");
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/StringListPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/StringListPanel.java
new file mode 100644
index 0000000..bc36654
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/StringListPanel.java
@@ -0,0 +1,359 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.client;
+
+import com.google.gerrit.client.ui.NavigationTable;
+import com.google.gerrit.client.ui.OnEditEnabler;
+import com.google.gerrit.client.ui.SmallHeading;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.KeyCodes;
+import com.google.gwt.event.dom.client.KeyPressEvent;
+import com.google.gwt.event.dom.client.KeyPressHandler;
+import com.google.gwt.event.logical.shared.ValueChangeEvent;
+import com.google.gwt.event.logical.shared.ValueChangeHandler;
+import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.CheckBox;
+import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.FocusWidget;
+import com.google.gwt.user.client.ui.HasEnabled;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.ImageResourceRenderer;
+import com.google.gwtexpui.globalkey.client.NpTextBox;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class StringListPanel extends FlowPanel implements HasEnabled {
+ private final StringListTable t;
+ private HorizontalPanel titlePanel;
+ protected final HorizontalPanel buttonPanel;
+ private final Button deleteButton;
+ private Image info;
+ protected FocusWidget widget;
+
+ public StringListPanel(String title, List<String> fieldNames, FocusWidget w,
+ boolean autoSort) {
+ widget = w;
+ if (title != null) {
+ titlePanel = new HorizontalPanel();
+ SmallHeading titleLabel = new SmallHeading(title);
+ titlePanel.add(titleLabel);
+ add(titlePanel);
+ }
+
+ t = new StringListTable(fieldNames, autoSort);
+ add(t);
+
+ buttonPanel = new HorizontalPanel();
+ buttonPanel.setStyleName(Gerrit.RESOURCES.css().stringListPanelButtons());
+ deleteButton = new Button(Gerrit.C.stringListPanelDelete());
+ deleteButton.setEnabled(false);
+ deleteButton.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ widget.setEnabled(true);
+ t.deleteChecked();
+ }
+ });
+ buttonPanel.add(deleteButton);
+ add(buttonPanel);
+ }
+
+ public void display(List<List<String>> values) {
+ t.display(values);
+ }
+
+ public void setInfo(String msg) {
+ if (info == null && titlePanel != null) {
+ info = new Image(Gerrit.RESOURCES.info());
+ titlePanel.add(info);
+ }
+ if (info != null) {
+ info.setTitle(msg);
+ }
+ }
+
+ public List<List<String>> getValues() {
+ return t.getValues();
+ }
+
+ public List<String> getValues(int i) {
+ List<List<String>> allValuesList = getValues();
+ List<String> singleValueList = new ArrayList<>(allValuesList.size());
+ for (List<String> values : allValuesList) {
+ singleValueList.add(values.get(i));
+ }
+ return singleValueList;
+ }
+
+ private class StringListTable extends NavigationTable<List<String>> {
+ private final Button addButton;
+ private final List<NpTextBox> inputs;
+ private final boolean autoSort;
+
+ StringListTable(List<String> names, boolean autoSort) {
+ this.autoSort = autoSort;
+
+ addButton =
+ new Button(new ImageResourceRenderer().render(Gerrit.RESOURCES.listAdd()));
+ addButton.setTitle(Gerrit.C.stringListPanelAdd());
+ OnEditEnabler e = new OnEditEnabler(addButton);
+ inputs = new ArrayList<>();
+
+ FlexCellFormatter fmt = table.getFlexCellFormatter();
+ fmt.addStyleName(0, 0, Gerrit.RESOURCES.css().iconHeader());
+ fmt.addStyleName(0, 0, Gerrit.RESOURCES.css().leftMostCell());
+ for (int i = 0; i < names.size(); i++) {
+ fmt.addStyleName(0, i + 1, Gerrit.RESOURCES.css().dataHeader());
+ table.setText(0, i + 1, names.get(i));
+
+ NpTextBox input = new NpTextBox();
+ input.setVisibleLength(35);
+ input.addKeyPressHandler(new KeyPressHandler() {
+ @Override
+ public void onKeyPress(KeyPressEvent event) {
+ if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
+ widget.setEnabled(true);
+ add();
+ }
+ }
+ });
+ inputs.add(input);
+ fmt.addStyleName(1, i + 1, Gerrit.RESOURCES.css().dataHeader());
+ table.setWidget(1, i + 1, input);
+ e.listenTo(input);
+ }
+ addButton.setEnabled(false);
+
+ addButton.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ widget.setEnabled(true);
+ add();
+ }
+ });
+ fmt.addStyleName(1, 0, Gerrit.RESOURCES.css().iconHeader());
+ fmt.addStyleName(1, 0, Gerrit.RESOURCES.css().leftMostCell());
+ table.setWidget(1, 0, addButton);
+
+ if (!autoSort) {
+ fmt.addStyleName(0, names.size() + 1, Gerrit.RESOURCES.css().iconHeader());
+ fmt.addStyleName(0, names.size() + 2, Gerrit.RESOURCES.css().iconHeader());
+ fmt.addStyleName(1, names.size() + 1, Gerrit.RESOURCES.css().iconHeader());
+ fmt.addStyleName(1, names.size() + 2, Gerrit.RESOURCES.css().iconHeader());
+ }
+ }
+
+ void display(List<List<String>> values) {
+ for (int row = 2; row < table.getRowCount(); row++) {
+ table.removeRow(row--);
+ }
+ int row = 2;
+ for (List<String> v : values) {
+ populate(row, v);
+ row++;
+ }
+ updateNavigationLinks();
+ }
+
+ List<List<String>> getValues() {
+ List<List<String>> values = new ArrayList<>();
+ for (int row = 2; row < table.getRowCount(); row++) {
+ values.add(getRowItem(row));
+ }
+ return values;
+ }
+
+ @Override
+ protected List<String> getRowItem(int row) {
+ List<String> v = new ArrayList<>();
+ for (int i = 0; i < inputs.size(); i++) {
+ v.add(table.getText(row, i + 1));
+ }
+ return v;
+ }
+
+ private void populate(final int row, List<String> values) {
+ FlexCellFormatter fmt = table.getFlexCellFormatter();
+ fmt.addStyleName(row, 0, Gerrit.RESOURCES.css().iconCell());
+ fmt.addStyleName(row, 0, Gerrit.RESOURCES.css().leftMostCell());
+ CheckBox checkBox = new CheckBox();
+ checkBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
+ @Override
+ public void onValueChange(ValueChangeEvent<Boolean> event) {
+ enableDelete();
+ }
+ });
+ table.setWidget(row, 0, checkBox);
+ for (int i = 0; i < values.size(); i++) {
+ fmt.addStyleName(row, i + 1, Gerrit.RESOURCES.css().dataCell());
+ table.setText(row, i + 1, values.get(i));
+ }
+ if (!autoSort) {
+ fmt.addStyleName(row, values.size() + 1, Gerrit.RESOURCES.css().iconCell());
+ fmt.addStyleName(row, values.size() + 2, Gerrit.RESOURCES.css().dataCell());
+
+ Image down = new Image(Gerrit.RESOURCES.arrowDown());
+ down.setTitle(Gerrit.C.stringListPanelDown());
+ down.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ moveDown(row);
+ }
+ });
+ table.setWidget(row, values.size() + 1, down);
+
+ Image up = new Image(Gerrit.RESOURCES.arrowUp());
+ up.setTitle(Gerrit.C.stringListPanelUp());
+ up.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ moveUp(row);
+ }
+ });
+ table.setWidget(row, values.size() + 2, up);
+ }
+ }
+
+ @Override
+ protected void onCellSingleClick(Event event, int row, int column) {
+ if (column == inputs.size() + 1 && row >= 2
+ && row < table.getRowCount() - 2) {
+ moveDown(row);
+ } else if (column == inputs.size() + 2 && row > 2) {
+ moveUp(row);
+ }
+ }
+
+ void moveDown(int row) {
+ if (row < table.getRowCount() - 1) {
+ swap(row, row + 1);
+ }
+ }
+
+ void moveUp(int row) {
+ if (row > 2) {
+ swap(row - 1, row);
+ }
+ }
+
+ void swap(int row1, int row2) {
+ List<String> value = getRowItem(row1);
+ List<String> nextValue = getRowItem(row2);
+ populate(row1, nextValue);
+ populate(row2, value);
+ updateNavigationLinks();
+ widget.setEnabled(true);
+ }
+
+ private void updateNavigationLinks() {
+ if (!autoSort) {
+ for (int row = 2; row < table.getRowCount(); row++) {
+ table.getWidget(row, inputs.size() + 1).setVisible(
+ row < table.getRowCount() - 1);
+ table.getWidget(row, inputs.size() + 2).setVisible(row > 2);
+ }
+ }
+ }
+
+ void add() {
+ List<String> values = new ArrayList<>();
+ for (NpTextBox input : inputs) {
+ values.add(input.getValue().trim());
+ input.setValue("");
+ }
+ insert(values);
+ }
+
+ void insert(List<String> v) {
+ int insertPos = table.getRowCount();
+ if (autoSort) {
+ for (int row = 1; row < table.getRowCount(); row++) {
+ int compareResult = v.get(0).compareTo(table.getText(row, 1));
+ if (compareResult < 0) {
+ insertPos = row;
+ break;
+ } else if (compareResult == 0) {
+ return;
+ }
+ }
+ }
+ table.insertRow(insertPos);
+ populate(insertPos, v);
+ updateNavigationLinks();
+ }
+
+ void enableDelete() {
+ for (int row = 2; row < table.getRowCount(); row++) {
+ if (((CheckBox) table.getWidget(row, 0)).getValue()) {
+ deleteButton.setEnabled(true);
+ return;
+ }
+ }
+ deleteButton.setEnabled(false);
+ }
+
+ void deleteChecked() {
+ deleteButton.setEnabled(false);
+ for (int row = 2; row < table.getRowCount(); row++) {
+ if (((CheckBox) table.getWidget(row, 0)).getValue()) {
+ table.removeRow(row--);
+ }
+ }
+ updateNavigationLinks();
+ }
+
+ @Override
+ protected void onOpenRow(int row) {
+ }
+
+ @Override
+ protected Object getRowItemKey(List<String> item) {
+ return item.get(0);
+ }
+
+ void setEnabled(boolean enabled) {
+ addButton.setVisible(enabled);
+ for (NpTextBox input : inputs) {
+ input.setEnabled(enabled);
+ }
+ for (int row = 2; row < table.getRowCount(); row++) {
+ table.getWidget(row, 0).setVisible(enabled);
+ if (!autoSort) {
+ table.getWidget(row, inputs.size() + 1).setVisible(enabled);
+ table.getWidget(row, inputs.size() + 2).setVisible(enabled);
+ }
+ }
+ if (enabled) {
+ updateNavigationLinks();
+ }
+ }
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return deleteButton.isVisible();
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ t.setEnabled(enabled);
+ deleteButton.setVisible(enabled);
+ }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/WebLinkInfo.java
similarity index 61%
copy from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
copy to gerrit-gwtui/src/main/java/com/google/gerrit/client/WebLinkInfo.java
index 96e2ec8..64b9cb8 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/WebLinkInfo.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,16 +12,15 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.pgm.util;
+package com.google.gerrit.client;
-public class Die extends RuntimeException {
- private static final long serialVersionUID = 1L;
+import com.google.gwt.core.client.JavaScriptObject;
- public Die(final String why) {
- super(why);
- }
+public class WebLinkInfo extends JavaScriptObject {
- public Die(final String why, final Throwable cause) {
- super(why, cause);
+ public final native String name() /*-{ return this.name; }-*/;
+ public final native String url() /*-{ return this.url; }-*/;
+
+ protected WebLinkInfo() {
}
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java
index d26ee7d..466a30f 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.java
@@ -39,6 +39,11 @@
String buttonSaveChanges();
String showRelativeDateInChangeTable();
String showSizeBarInChangeTable();
+ String myMenu();
+ String myMenuInfo();
+ String myMenuName();
+ String myMenuUrl();
+ String myMenuReset();
String changeScreenOldUi();
String changeScreenNewUi();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties
index 633af29..f7760e3 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/AccountConstants.properties
@@ -19,6 +19,13 @@
buttonSaveChanges = Save Changes
showRelativeDateInChangeTable = Show Relative Dates In Changes Table
showSizeBarInChangeTable = Show Change Sizes As Colored Bars In Changes Table
+myMenu = My Menu
+myMenuInfo = \
+ Menu items for the 'My' top level menu. \
+ The first menu item defines the default screen.
+myMenuName = Name
+myMenuUrl = URL
+myMenuReset = Reset
changeScreenOldUi = Old Screen
changeScreenNewUi = New Screen
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java
index d8a0427..eef6ca1 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/MyPreferencesScreen.java
@@ -19,12 +19,16 @@
import com.google.gerrit.client.Dispatcher;
import com.google.gerrit.client.Gerrit;
+import com.google.gerrit.client.StringListPanel;
+import com.google.gerrit.client.config.ConfigServerApi;
+import com.google.gerrit.client.extensions.TopMenuItem;
import com.google.gerrit.client.rpc.GerritCallback;
+import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gerrit.client.ui.OnEditEnabler;
-import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.CommentVisibilityStrategy;
+import com.google.gwt.core.client.JsArray;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
@@ -34,9 +38,11 @@
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.ListBox;
-import com.google.gwtjsonrpc.common.VoidResult;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Date;
+import java.util.List;
public class MyPreferencesScreen extends SettingsScreen {
private CheckBox showSiteHeader;
@@ -52,6 +58,7 @@
private ListBox commentVisibilityStrategy;
private ListBox changeScreen;
private ListBox diffView;
+ private StringListPanel myMenus;
private Button save;
@Override
@@ -202,6 +209,10 @@
doSave();
}
});
+
+ myMenus = new MyMenuPanel(save);
+ add(myMenus);
+
add(save);
final OnEditEnabler e = new OnEditEnabler(save);
@@ -223,9 +234,11 @@
@Override
protected void onLoad() {
super.onLoad();
- Util.ACCOUNT_SVC.myAccount(new ScreenLoadCallback<Account>(this) {
- public void preDisplay(final Account result) {
- display(result.getGeneralPreferences());
+ AccountApi.self().view("preferences")
+ .get(new ScreenLoadCallback<Preferences>(this) {
+ @Override
+ public void preDisplay(Preferences prefs) {
+ display(prefs);
}
});
}
@@ -246,28 +259,37 @@
diffView.setEnabled(on);
}
- private void display(final AccountGeneralPreferences p) {
- showSiteHeader.setValue(p.isShowSiteHeader());
- useFlashClipboard.setValue(p.isUseFlashClipboard());
- copySelfOnEmails.setValue(p.isCopySelfOnEmails());
- reversePatchSetOrder.setValue(p.isReversePatchSetOrder());
- showUsernameInReviewCategory.setValue(p.isShowUsernameInReviewCategory());
- setListBox(maximumPageSize, DEFAULT_PAGESIZE, p.getMaximumPageSize());
+ private void display(Preferences p) {
+ showSiteHeader.setValue(p.showSiteHeader());
+ useFlashClipboard.setValue(p.useFlashClipboard());
+ copySelfOnEmails.setValue(p.copySelfOnEmail());
+ reversePatchSetOrder.setValue(p.reversePatchSetOrder());
+ showUsernameInReviewCategory.setValue(p.showUsernameInReviewCategory());
+ setListBox(maximumPageSize, DEFAULT_PAGESIZE, p.changesPerPage());
setListBox(dateFormat, AccountGeneralPreferences.DateFormat.STD, //
- p.getDateFormat());
+ p.dateFormat());
setListBox(timeFormat, AccountGeneralPreferences.TimeFormat.HHMM_12, //
- p.getTimeFormat());
- relativeDateInChangeTable.setValue(p.isRelativeDateInChangeTable());
- sizeBarInChangeTable.setValue(p.isSizeBarInChangeTable());
+ p.timeFormat());
+ relativeDateInChangeTable.setValue(p.relativeDateInChangeTable());
+ sizeBarInChangeTable.setValue(p.sizeBarInChangeTable());
setListBox(commentVisibilityStrategy,
AccountGeneralPreferences.CommentVisibilityStrategy.EXPAND_RECENT,
- p.getCommentVisibilityStrategy());
+ p.commentVisibilityStrategy());
setListBox(changeScreen,
null,
- p.getChangeScreen());
+ p.changeScreen());
setListBox(diffView,
AccountGeneralPreferences.DiffView.SIDE_BY_SIDE,
- p.getDiffView());
+ p.diffView());
+ display(p.my());
+ }
+
+ private void display(JsArray<TopMenuItem> items) {
+ List<List<String>> values = new ArrayList<>();
+ for (TopMenuItem item : Natives.asList(items)) {
+ values.add(Arrays.asList(item.getName(), item.getUrl()));
+ }
+ myMenus.display(values);
}
private void setListBox(final ListBox f, final short defaultValue,
@@ -350,22 +372,30 @@
enable(false);
save.setEnabled(false);
- Util.ACCOUNT_SVC.changePreferences(p, new GerritCallback<VoidResult>() {
- @Override
- public void onSuccess(final VoidResult result) {
- Gerrit.getUserAccount().setGeneralPreferences(p);
- Gerrit.applyUserPreferences();
- Dispatcher.changeScreen2 = false;
- enable(true);
- }
+ List<TopMenuItem> items = new ArrayList<>();
+ for (List<String> v : myMenus.getValues()) {
+ items.add(TopMenuItem.create(v.get(0), v.get(1)));
+ }
- @Override
- public void onFailure(final Throwable caught) {
- enable(true);
- save.setEnabled(true);
- super.onFailure(caught);
- }
- });
+ AccountApi.self().view("preferences")
+ .post(Preferences.create(p, items), new GerritCallback<Preferences>() {
+ @Override
+ public void onSuccess(Preferences prefs) {
+ Gerrit.getUserAccount().setGeneralPreferences(p);
+ Gerrit.applyUserPreferences();
+ Dispatcher.changeScreen2 = false;
+ enable(true);
+ display(prefs);
+ Gerrit.refreshMenuBar();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ enable(true);
+ save.setEnabled(true);
+ super.onFailure(caught);
+ }
+ });
}
private static String getLabel(AccountGeneralPreferences.ChangeScreen ui) {
@@ -381,4 +411,28 @@
return ui.name();
}
}
+
+ private class MyMenuPanel extends StringListPanel {
+ MyMenuPanel(Button save) {
+ super(Util.C.myMenu(), Arrays.asList(Util.C.myMenuName(),
+ Util.C.myMenuUrl()), save, false);
+
+ setInfo(Util.C.myMenuInfo());
+
+ Button resetButton = new Button(Util.C.myMenuReset());
+ resetButton.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ ConfigServerApi.defaultPreferences(new GerritCallback<Preferences>() {
+ @Override
+ public void onSuccess(Preferences p) {
+ MyPreferencesScreen.this.display(p.my());
+ widget.setEnabled(true);
+ }
+ });
+ }
+ });
+ buttonPanel.add(resetButton);
+ }
+ }
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/Preferences.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/Preferences.java
new file mode 100644
index 0000000..3e66e22
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/Preferences.java
@@ -0,0 +1,212 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.client.account;
+
+import com.google.gerrit.client.extensions.TopMenuItem;
+import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
+import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ChangeScreen;
+import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.CommentVisibilityStrategy;
+import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DateFormat;
+import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView;
+import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand;
+import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadScheme;
+import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.TimeFormat;
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArray;
+
+import java.util.List;
+
+public class Preferences extends JavaScriptObject {
+ public static Preferences create(AccountGeneralPreferences in, List<TopMenuItem> myMenus) {
+ Preferences p = createObject().cast();
+ if (in == null) {
+ in = AccountGeneralPreferences.createDefault();
+ }
+ p.changesPerPage(in.getMaximumPageSize());
+ p.showSiteHeader(in.isShowSiteHeader());
+ p.useFlashClipboard(in.isUseFlashClipboard());
+ p.downloadScheme(in.getDownloadUrl());
+ p.downloadCommand(in.getDownloadCommand());
+ p.copySelfOnEmail(in.isCopySelfOnEmails());
+ p.dateFormat(in.getDateFormat());
+ p.timeFormat(in.getTimeFormat());
+ p.reversePatchSetOrder(in.isReversePatchSetOrder());
+ p.showUsernameInReviewCategory(in.isShowUsernameInReviewCategory());
+ p.relativeDateInChangeTable(in.isRelativeDateInChangeTable());
+ p.sizeBarInChangeTable(in.isSizeBarInChangeTable());
+ p.commentVisibilityStrategy(in.getCommentVisibilityStrategy());
+ p.diffView(in.getDiffView());
+ p.changeScreen(in.getChangeScreen());
+ p.setMyMenus(myMenus);
+ return p;
+ }
+
+ public final short changesPerPage() {
+ return get("changes_per_page", AccountGeneralPreferences.DEFAULT_PAGESIZE);
+ }
+ private final native short get(String n, int d)
+ /*-{ return this.hasOwnProperty(n) ? this[n] : d }-*/;
+
+ public final native boolean showSiteHeader()
+ /*-{ return this.show_site_header || false }-*/;
+
+ public final native boolean useFlashClipboard()
+ /*-{ return this.use_flash_clipboard || false }-*/;
+
+ public final DownloadScheme downloadScheme() {
+ String s = downloadSchemeRaw();
+ return s != null ? DownloadScheme.valueOf(s) : null;
+ }
+ private final native String downloadSchemeRaw()
+ /*-{ return this.download_scheme }-*/;
+
+ public final DownloadCommand downloadCommand() {
+ String s = downloadCommandRaw();
+ return s != null ? DownloadCommand.valueOf(s) : null;
+ }
+ private final native String downloadCommandRaw()
+ /*-{ return this.download_command }-*/;
+
+ public final native boolean copySelfOnEmail()
+ /*-{ return this.copy_self_on_email || false }-*/;
+
+ public final DateFormat dateFormat() {
+ String s = dateFormatRaw();
+ return s != null ? DateFormat.valueOf(s) : null;
+ }
+ private final native String dateFormatRaw()
+ /*-{ return this.date_format }-*/;
+
+ public final TimeFormat timeFormat() {
+ String s = timeFormatRaw();
+ return s != null ? TimeFormat.valueOf(s) : null;
+ }
+ private final native String timeFormatRaw()
+ /*-{ return this.time_format }-*/;
+
+ public final native boolean reversePatchSetOrder()
+ /*-{ return this.reverse_patch_set_order || false }-*/;
+
+ public final native boolean showUsernameInReviewCategory()
+ /*-{ return this.show_username_in_review_category || false }-*/;
+
+ public final native boolean relativeDateInChangeTable()
+ /*-{ return this.relative_date_in_change_table || false }-*/;
+
+ public final native boolean sizeBarInChangeTable()
+ /*-{ return this.size_bar_in_change_table || false }-*/;
+
+ public final CommentVisibilityStrategy commentVisibilityStrategy() {
+ String s = commentVisibilityStrategyRaw();
+ return s != null ? CommentVisibilityStrategy.valueOf(s) : null;
+ }
+ private final native String commentVisibilityStrategyRaw()
+ /*-{ return this.comment_visibility_strategy }-*/;
+
+ public final DiffView diffView() {
+ String s = diffViewRaw();
+ return s != null ? DiffView.valueOf(s) : null;
+ }
+ private final native String diffViewRaw()
+ /*-{ return this.diff_view }-*/;
+
+ public final ChangeScreen changeScreen() {
+ String s = changeScreenRaw();
+ return s != null ? ChangeScreen.valueOf(s) : null;
+ }
+ private final native String changeScreenRaw()
+ /*-{ return this.change_screen }-*/;
+
+ public final native JsArray<TopMenuItem> my()
+ /*-{ return this.my; }-*/;
+
+ public final native void changesPerPage(short n)
+ /*-{ this.changes_per_page = n }-*/;
+
+ public final native void showSiteHeader(boolean s)
+ /*-{ this.show_site_header = s }-*/;
+
+ public final native void useFlashClipboard(boolean u)
+ /*-{ this.use_flash_clipboard = u }-*/;
+
+ public final void downloadScheme(DownloadScheme d) {
+ downloadSchemeRaw(d != null ? d.toString() : null);
+ }
+ private final native void downloadSchemeRaw(String d)
+ /*-{ this.download_scheme = d }-*/;
+
+ public final void downloadCommand(DownloadCommand d) {
+ downloadCommandRaw(d != null ? d.toString() : null);
+ }
+ public final native void downloadCommandRaw(String d)
+ /*-{ this.download_command = d }-*/;
+
+ public final native void copySelfOnEmail(boolean c)
+ /*-{ this.copy_self_on_email = c }-*/;
+
+ public final void dateFormat(DateFormat f) {
+ dateFormatRaw(f != null ? f.toString() : null);
+ }
+ private final native void dateFormatRaw(String f)
+ /*-{ this.date_format = f }-*/;
+
+ public final void timeFormat(TimeFormat f) {
+ timeFormatRaw(f != null ? f.toString() : null);
+ }
+ private final native void timeFormatRaw(String f)
+ /*-{ this.time_format = f }-*/;
+
+ public final native void reversePatchSetOrder(boolean r)
+ /*-{ this.reverse_patch_set_order = r }-*/;
+
+ public final native void showUsernameInReviewCategory(boolean s)
+ /*-{ this.show_username_in_review_category = s }-*/;
+
+ public final native void relativeDateInChangeTable(boolean d)
+ /*-{ this.relative_date_in_change_table = d }-*/;
+
+ public final native void sizeBarInChangeTable(boolean s)
+ /*-{ this.size_bar_in_change_table = s }-*/;
+
+ public final void commentVisibilityStrategy(CommentVisibilityStrategy s) {
+ commentVisibilityStrategyRaw(s != null ? s.toString() : null);
+ }
+ private final native void commentVisibilityStrategyRaw(String s)
+ /*-{ this.comment_visibility_strategy = s }-*/;
+
+ public final void diffView(DiffView d) {
+ diffViewRaw(d != null ? d.toString() : null);
+ }
+ private final native void diffViewRaw(String d)
+ /*-{ this.diff_view = d }-*/;
+
+ public final void changeScreen(ChangeScreen s) {
+ changeScreenRaw(s != null ? s.toString() : null);
+ }
+ private final native void changeScreenRaw(String s)
+ /*-{ this.change_screen = s }-*/;
+
+ final void setMyMenus(List<TopMenuItem> myMenus) {
+ initMy();
+ for (TopMenuItem n : myMenus) {
+ addMy(n);
+ }
+ }
+ final native void initMy() /*-{ this.my = []; }-*/;
+ final native void addMy(TopMenuItem m) /*-{ this.my.push(m); }-*/;
+
+ protected Preferences() {
+ }
+}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SettingsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SettingsScreen.java
index 2c29ab2..c689b49 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SettingsScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/SettingsScreen.java
@@ -29,7 +29,7 @@
if (Gerrit.getConfig().getSshdAddress() != null) {
link(Util.C.tabSshKeys(), PageLinks.SETTINGS_SSHKEYS);
}
- if (!Gerrit.getConfig().isGitBasicAuth()) {
+ if (Gerrit.getConfig().isHttpPasswordSettingsEnabled()) {
link(Util.C.tabHttpAccess(), PageLinks.SETTINGS_HTTP_PASSWORD);
}
link(Util.C.tabWebIdentities(), PageLinks.SETTINGS_WEBIDENT);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/actions/ActionButton.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/actions/ActionButton.java
index 7f13075..ab94a75c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/actions/ActionButton.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/actions/ActionButton.java
@@ -20,6 +20,7 @@
import com.google.gerrit.client.api.RevisionGlue;
import com.google.gerrit.client.changes.ChangeInfo;
import com.google.gerrit.client.changes.ChangeInfo.RevisionInfo;
+import com.google.gerrit.client.projects.BranchInfo;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
@@ -28,13 +29,19 @@
public class ActionButton extends Button implements ClickHandler {
private final Project.NameKey project;
+ private final BranchInfo branch;
private final ChangeInfo change;
private final RevisionInfo revision;
private final ActionInfo action;
private ActionContext ctx;
public ActionButton(Project.NameKey project, ActionInfo action) {
- this(project, null, null, action);
+ this(project, null, null, null, action);
+ }
+
+ public ActionButton(Project.NameKey project, BranchInfo branch,
+ ActionInfo action) {
+ this(project, branch, null, null, action);
}
public ActionButton(ChangeInfo change, ActionInfo action) {
@@ -43,11 +50,11 @@
public ActionButton(ChangeInfo change, RevisionInfo revision,
ActionInfo action) {
- this(null, change, revision, action);
+ this(null, null, change, revision, action);
}
- private ActionButton(Project.NameKey project, ChangeInfo change,
- RevisionInfo revision, ActionInfo action) {
+ private ActionButton(Project.NameKey project, BranchInfo branch,
+ ChangeInfo change, RevisionInfo revision, ActionInfo action) {
super(new SafeHtmlBuilder()
.openDiv()
.append(action.label())
@@ -58,6 +65,7 @@
addClickHandler(this);
this.project = project;
+ this.branch = branch;
this.change = change;
this.revision = revision;
this.action = action;
@@ -75,6 +83,8 @@
RevisionGlue.onAction(change, revision, action, this);
} else if (change != null) {
ChangeGlue.onAction(change, action, this);
+ } else if (branch != null) {
+ ProjectGlue.onAction(project, branch, action, this);
} else if (project != null) {
ProjectGlue.onAction(project, action, this);
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/MyGroupsListScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/MyGroupsListScreen.java
new file mode 100644
index 0000000..cabe2f5
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/MyGroupsListScreen.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.client.admin;
+
+import com.google.gerrit.client.groups.GroupList;
+import com.google.gerrit.client.rpc.ScreenLoadCallback;
+import com.google.gerrit.client.ui.AccountScreen;
+
+public class MyGroupsListScreen extends AccountScreen {
+ private GroupTable groups;
+
+ @Override
+ protected void onInitUI() {
+ super.onInitUI();
+ groups = new GroupTable();
+ add(groups);
+ }
+
+ @Override
+ protected void onLoad() {
+ super.onLoad();
+ GroupList.my(new ScreenLoadCallback<GroupList>(this) {
+ @Override
+ protected void preDisplay(GroupList result) {
+ groups.display(result);
+ groups.finishDisplay();
+ }});
+ }
+}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionEditor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionEditor.java
index efb2fb4..b3d8564 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionEditor.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionEditor.java
@@ -124,8 +124,8 @@
PermissionNameRenderer nameRenderer =
new PermissionNameRenderer(projectAccess.getCapabilities());
- normalName = new ValueLabel<String>(nameRenderer);
- deletedName = new ValueLabel<String>(nameRenderer);
+ normalName = new ValueLabel<>(nameRenderer);
+ deletedName = new ValueLabel<>(nameRenderer);
initWidget(uiBinder.createAndBindUi(this));
groupToAdd.setProject(projectName);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionRuleEditor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionRuleEditor.java
index 07862f4..9e719ea 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionRuleEditor.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/PermissionRuleEditor.java
@@ -101,7 +101,7 @@
Permission permission,
PermissionRange.WithDefaults validRange) {
this.groupInfo = groupInfo;
- action = new ValueListBox<PermissionRule.Action>(actionRenderer);
+ action = new ValueListBox<>(actionRenderer);
if (validRange != null && 10 < validRange.getRangeSize()) {
min = new RangeBox.Box();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java
index a70aa8f..e6f5b68 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectBranchesScreen.java
@@ -22,6 +22,8 @@
import com.google.gerrit.client.VoidResult;
import com.google.gerrit.client.access.AccessMap;
import com.google.gerrit.client.access.ProjectAccessInfo;
+import com.google.gerrit.client.actions.ActionButton;
+import com.google.gerrit.client.actions.ActionInfo;
import com.google.gerrit.client.projects.BranchInfo;
import com.google.gerrit.client.projects.ProjectApi;
import com.google.gerrit.client.rpc.GerritCallback;
@@ -387,10 +389,18 @@
table.setText(row, 3, "");
}
+ FlowPanel actionsPanel = new FlowPanel();
if (c != null) {
- table.setWidget(row, 4, new Anchor(c.getLinkName(), false,
+ actionsPanel.add(new Anchor(c.getLinkName(), false,
c.toBranch(new Branch.NameKey(getProjectKey(), k.ref()))));
}
+ if (k.actions() != null) {
+ k.actions().copyKeysIntoChildren("id");
+ for (ActionInfo a : Natives.asList(k.actions().values())) {
+ actionsPanel.add(new ActionButton(getProjectKey(), k, a));
+ }
+ }
+ table.setWidget(row, 4, actionsPanel);
final FlexCellFormatter fmt = table.getFlexCellFormatter();
String iconCellStyle = Gerrit.RESOURCES.css().iconCell();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java
index 2b50cac..14404f7 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectInfoScreen.java
@@ -15,6 +15,7 @@
package com.google.gerrit.client.admin;
import com.google.gerrit.client.Gerrit;
+import com.google.gerrit.client.StringListPanel;
import com.google.gerrit.client.access.AccessMap;
import com.google.gerrit.client.access.ProjectAccessInfo;
import com.google.gerrit.client.actions.ActionButton;
@@ -34,10 +35,11 @@
import com.google.gerrit.client.ui.NpIntTextBox;
import com.google.gerrit.client.ui.OnEditEnabler;
import com.google.gerrit.client.ui.SmallHeading;
+import com.google.gerrit.extensions.api.projects.ProjectState;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
@@ -46,7 +48,7 @@
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
-import com.google.gwt.user.client.ui.FocusWidget;
+import com.google.gwt.user.client.ui.HasEnabled;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
@@ -58,7 +60,10 @@
import com.google.gwtexpui.globalkey.client.NpTextArea;
import com.google.gwtexpui.globalkey.client.NpTextBox;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -76,7 +81,7 @@
private ListBox contentMerge;
private NpTextBox maxObjectSizeLimit;
private Label effectiveMaxObjectSizeLimit;
- private Map<String, Map<String, FocusWidget>> pluginConfigWidgets;
+ private Map<String, Map<String, HasEnabled>> pluginConfigWidgets;
// Section: Contributor Agreements
private ListBox contributorAgreements;
@@ -159,8 +164,8 @@
maxObjectSizeLimit.setEnabled(isOwner);
if (pluginConfigWidgets != null) {
- for (Map<String, FocusWidget> widgetMap : pluginConfigWidgets.values()) {
- for (FocusWidget widget : widgetMap.values()) {
+ for (Map<String, HasEnabled> widgetMap : pluginConfigWidgets.values()) {
+ for (HasEnabled widget : widgetMap.values()) {
widget.setEnabled(isOwner);
}
}
@@ -185,14 +190,14 @@
grid.addHeader(new SmallHeading(Util.C.headingProjectOptions()));
state = new ListBox();
- for (final Project.State stateValue : Project.State.values()) {
+ for (ProjectState stateValue : ProjectState.values()) {
state.addItem(Util.toLongString(stateValue), stateValue.name());
}
saveEnabler.listenTo(state);
grid.add(Util.C.headingProjectState(), state);
submitType = new ListBox();
- for (final Project.SubmitType type : Project.SubmitType.values()) {
+ for (final SubmitType type : SubmitType.values()) {
submitType.addItem(Util.toLongString(type), type.name());
}
submitType.addChangeHandler(new ChangeHandler() {
@@ -238,7 +243,7 @@
* content merge the useContentMerge checkbox gets disabled.
*/
private void setEnabledForUseContentMerge() {
- if (SubmitType.FAST_FORWARD_ONLY.equals(Project.SubmitType
+ if (SubmitType.FAST_FORWARD_ONLY.equals(SubmitType
.valueOf(submitType.getValue(submitType.getSelectedIndex())))) {
contentMerge.setEnabled(false);
InheritedBooleanInfo b = InheritedBooleanInfo.create();
@@ -263,7 +268,7 @@
grid.addHtml(Util.C.useSignedOffBy(), signedOffBy);
}
- private void setSubmitType(final Project.SubmitType newSubmitType) {
+ private void setSubmitType(final SubmitType newSubmitType) {
int index = -1;
if (submitType != null) {
for (int i = 0; i < submitType.getItemCount(); i++) {
@@ -277,7 +282,7 @@
}
}
- private void setState(final Project.State newState) {
+ private void setState(final ProjectState newState) {
if (state != null) {
for (int i = 0; i < state.getItemCount(); i++) {
if (newState.name().equals(state.getValue(i))) {
@@ -357,7 +362,7 @@
pluginConfigWidgets = new HashMap<>();
for (String pluginName : info.pluginConfig().keySet()) {
- Map<String, FocusWidget> widgetMap = new HashMap<>();
+ Map<String, HasEnabled> widgetMap = new HashMap<>();
pluginConfigWidgets.put(pluginName, widgetMap);
LabeledWidgetsGrid g = new LabeledWidgetsGrid();
g.addHeader(new SmallHeading(Util.M.pluginProjectOptionsTitle(pluginName)));
@@ -366,7 +371,7 @@
info.pluginConfig(pluginName);
pluginConfig.copyKeysIntoChildren("name");
for (ConfigParameterInfo param : Natives.asList(pluginConfig.values())) {
- FocusWidget w;
+ HasEnabled w;
switch (param.type()) {
case "STRING":
case "INT":
@@ -380,7 +385,7 @@
w = renderListBox(g, param);
break;
case "ARRAY":
- w = renderTextArea(g, param);
+ w = renderStringListPanel(g, param);
break;
default:
throw new UnsupportedOperationException("unsupported widget type");
@@ -497,24 +502,21 @@
return listBox;
}
- private NpTextArea renderTextArea(LabeledWidgetsGrid g,
+ private StringListPanel renderStringListPanel(LabeledWidgetsGrid g,
ConfigParameterInfo param) {
- NpTextArea txtArea = new NpTextArea();
- txtArea.setVisibleLines(4);
- txtArea.setCharacterWidth(40);
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < param.values().length(); i++) {
- String v = param.values().get(i);
- sb.append(v).append("\n");
+ StringListPanel p =
+ new StringListPanel(null, Arrays.asList(getDisplayName(param)),
+ saveProject, false);
+ List<List<String>> values = new ArrayList<>();
+ for (String v : Natives.asList(param.values())) {
+ values.add(Arrays.asList(v));
}
- txtArea.setText(sb.toString());
- if (param.editable()) {
- saveEnabler.listenTo(txtArea);
- } else {
- txtArea.setEnabled(false);
+ p.display(values);
+ if (!param.editable()) {
+ p.setEnabled(false);
}
- addWidget(g, txtArea, param);
- return txtArea;
+ addWidget(g, p, param);
+ return p;
}
private void addWidget(LabeledWidgetsGrid g, Widget w, ConfigParameterInfo param) {
@@ -569,8 +571,8 @@
getBool(contributorAgreements), getBool(contentMerge),
getBool(signedOffBy), getBool(requireChangeID),
maxObjectSizeLimit.getText().trim(),
- Project.SubmitType.valueOf(submitType.getValue(submitType.getSelectedIndex())),
- Project.State.valueOf(state.getValue(state.getSelectedIndex())),
+ SubmitType.valueOf(submitType.getValue(submitType.getSelectedIndex())),
+ ProjectState.valueOf(state.getValue(state.getSelectedIndex())),
getPluginConfigValues(), new GerritCallback<ConfigInfo>() {
@Override
public void onSuccess(ConfigInfo result) {
@@ -589,11 +591,11 @@
private Map<String, Map<String, ConfigParameterValue>> getPluginConfigValues() {
Map<String, Map<String, ConfigParameterValue>> pluginConfigValues =
new HashMap<>(pluginConfigWidgets.size());
- for (Entry<String, Map<String, FocusWidget>> e : pluginConfigWidgets.entrySet()) {
+ for (Entry<String, Map<String, HasEnabled>> e : pluginConfigWidgets.entrySet()) {
Map<String, ConfigParameterValue> values = new HashMap<>(e.getValue().size());
pluginConfigValues.put(e.getKey(), values);
- for (Entry<String, FocusWidget> e2 : e.getValue().entrySet()) {
- FocusWidget widget = e2.getValue();
+ for (Entry<String, HasEnabled> e2 : e.getValue().entrySet()) {
+ HasEnabled widget = e2.getValue();
if (widget instanceof TextBox) {
values.put(e2.getKey(), ConfigParameterValue.create()
.value(((TextBox) widget).getValue().trim()));
@@ -608,10 +610,11 @@
? listBox.getValue(listBox.getSelectedIndex()) : null;
values.put(e2.getKey(), ConfigParameterValue.create()
.value(value));
- } else if (widget instanceof NpTextArea) {
- String text = ((NpTextArea) widget).getText().trim();
- values.put(e2.getKey(), ConfigParameterValue.create()
- .values(text.split("\n")));
+ } else if (widget instanceof StringListPanel) {
+ values.put(e2.getKey(),
+ ConfigParameterValue.create().values(
+ ((StringListPanel) widget).getValues(0)
+ .toArray(new String[] {})));
} else {
throw new UnsupportedOperationException("unsupported widget type");
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java
index 3a6cb7d..3bd05e0 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectListScreen.java
@@ -19,9 +19,11 @@
import com.google.gerrit.client.Dispatcher;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.GitwebLink;
+import com.google.gerrit.client.WebLinkInfo;
import com.google.gerrit.client.projects.ProjectInfo;
import com.google.gerrit.client.projects.ProjectMap;
import com.google.gerrit.client.rpc.GerritCallback;
+import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.ui.FilteredUserInterface;
import com.google.gerrit.client.ui.HighlightingInlineHyperlink;
import com.google.gerrit.client.ui.Hyperlink;
@@ -43,6 +45,8 @@
import com.google.gwt.user.client.ui.Label;
import com.google.gwtexpui.globalkey.client.NpTextBox;
+import java.util.List;
+
public class ProjectListScreen extends Screen implements FilteredUserInterface {
private Hyperlink prev;
private Hyperlink next;
@@ -167,13 +171,11 @@
@Override
protected void initColumnHeaders() {
super.initColumnHeaders();
- if (Gerrit.getGitwebLink() != null) {
- table.setText(0, ProjectsTable.C_REPO_BROWSER,
- Util.C.projectRepoBrowser());
- table.getFlexCellFormatter().
- addStyleName(0, ProjectsTable.C_REPO_BROWSER,
- Gerrit.RESOURCES.css().dataHeader());
- }
+ table.setText(0, ProjectsTable.C_REPO_BROWSER,
+ Util.C.projectRepoBrowser());
+ table.getFlexCellFormatter().
+ addStyleName(0, ProjectsTable.C_REPO_BROWSER,
+ Gerrit.RESOURCES.css().dataHeader());
}
@Override
@@ -188,11 +190,8 @@
@Override
protected void insert(int row, ProjectInfo k) {
super.insert(row, k);
- if (Gerrit.getGitwebLink() != null) {
- table.getFlexCellFormatter().
- addStyleName(row, ProjectsTable.C_REPO_BROWSER,
- Gerrit.RESOURCES.css().dataCell());
- }
+ table.getFlexCellFormatter().addStyleName(row,
+ ProjectsTable.C_REPO_BROWSER, Gerrit.RESOURCES.css().dataCell());
}
@Override
@@ -219,15 +218,33 @@
fp.add(new HighlightingInlineHyperlink(k.name(), link(k), subname));
table.setWidget(row, ProjectsTable.C_NAME, fp);
table.setText(row, ProjectsTable.C_DESCRIPTION, k.description());
- GitwebLink l = Gerrit.getGitwebLink();
- if (l != null) {
- table.setWidget(row, ProjectsTable.C_REPO_BROWSER,
- new Anchor(l.getLinkName(), false, l.toProject(k
- .name_key())));
- }
+ addWebLinks(row, k);
setRowItem(row, k);
}
+
+ private void addWebLinks(int row, ProjectInfo k) {
+ GitwebLink gitWebLink = Gerrit.getGitwebLink();
+ List<WebLinkInfo> webLinks = Natives.asList(k.web_links());
+ if (gitWebLink != null || (webLinks != null && !webLinks.isEmpty())) {
+ FlowPanel p = new FlowPanel();
+ table.setWidget(row, ProjectsTable.C_REPO_BROWSER, p);
+
+ if (gitWebLink != null) {
+ Anchor a = new Anchor();
+ a.setText(gitWebLink.getLinkName());
+ a.setHref(gitWebLink.toProject(k.name_key()));
+ p.add(a);
+ }
+
+ for (WebLinkInfo weblink : webLinks) {
+ Anchor a = new Anchor();
+ a.setText("(" + weblink.name() + ")");
+ a.setHref(weblink.url());
+ p.add(a);
+ }
+ }
+ }
};
projects.setSavePointerId(PageLinks.ADMIN_PROJECTS);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RangeBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RangeBox.java
index bf04b07..088899e 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RangeBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RangeBox.java
@@ -49,7 +49,7 @@
final ValueListBox<Integer> list;
List() {
- list = new ValueListBox<Integer>(rangeRenderer);
+ list = new ValueListBox<>(rangeRenderer);
initWidget(list);
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/Util.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/Util.java
index 1696c43..5b8fe38 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/Util.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/Util.java
@@ -15,7 +15,8 @@
package com.google.gerrit.client.admin;
import com.google.gerrit.common.data.ProjectAdminService;
-import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.extensions.api.projects.ProjectState;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gwt.core.client.GWT;
import com.google.gwtjsonrpc.client.JsonUtil;
@@ -31,7 +32,7 @@
AdminResources.I.css().ensureInjected();
}
- public static String toLongString(final Project.SubmitType type) {
+ public static String toLongString(final SubmitType type) {
if (type == null) {
return "";
}
@@ -51,7 +52,7 @@
}
}
- public static String toLongString(final Project.State type) {
+ public static String toLongString(final ProjectState type) {
if (type == null) {
return "";
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ActionContext.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ActionContext.java
index 453a3f2..7490d82 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ActionContext.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ActionContext.java
@@ -18,6 +18,7 @@
import com.google.gerrit.client.actions.ActionInfo;
import com.google.gerrit.client.changes.ChangeInfo;
import com.google.gerrit.client.changes.ChangeInfo.RevisionInfo;
+import com.google.gerrit.client.projects.BranchInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.RestApi;
@@ -137,6 +138,7 @@
final native void set(ActionInfo a) /*-{ this.action=a; }-*/;
final native void set(ChangeInfo c) /*-{ this.change=c; }-*/;
final native void set(Project.NameKey p) /*-{ this.project=p; }-*/;
+ final native void set(BranchInfo b) /*-{ this.branch=b }-*/;
final native void set(RevisionInfo r) /*-{ this.revision=r; }-*/;
final native void button(ActionButton b) /*-{ this._b=b; }-*/;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ApiGlue.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ApiGlue.java
index 976dc0c..8da896e 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ApiGlue.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ApiGlue.java
@@ -43,6 +43,7 @@
change_actions: {},
revision_actions: {},
project_actions: {},
+ branch_actions: {},
getPluginName: @com.google.gerrit.client.api.ApiGlue::getPluginName(),
injectCss: @com.google.gwt.dom.client.StyleInjector::inject(Ljava/lang/String;),
@@ -72,6 +73,7 @@
if ('change' == t) this.change_actions[i]=c;
else if ('revision' == t) this.revision_actions[i]=c;
else if ('project' == t) this.project_actions[i]=c;
+ else if ('branch' == t) this.branch_actions[i]=c;
else if ('screen' == t) _screen(p,t,c);
},
screen: function(r,c){this._screen(this.getPluginName(),r,c)},
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/DefaultActions.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/DefaultActions.java
index 53a3784..0e4048d 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/DefaultActions.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/DefaultActions.java
@@ -21,50 +21,54 @@
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gerrit.common.PageLinks;
-import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.Window.Location;
import com.google.gwt.user.client.rpc.AsyncCallback;
class DefaultActions {
static void invoke(ChangeInfo change, ActionInfo action, RestApi api) {
- final Change.Id id = change.legacy_id();
- AsyncCallback<JavaScriptObject> cb = new GerritCallback<JavaScriptObject>() {
- @Override
- public void onSuccess(JavaScriptObject msg) {
- if (NativeString.is(msg)) {
- NativeString str = (NativeString) msg;
- if (!str.asString().isEmpty()) {
- Window.alert(str.asString());
- }
- }
- Gerrit.display(PageLinks.toChange(id));
- }
- };
- invoke(action, api, cb);
+ invoke(action, api, callback(PageLinks.toChange(change.legacy_id())));
}
- static void invokeProjectAction(final Project.NameKey project,
- ActionInfo action, RestApi api) {
- AsyncCallback<JavaScriptObject> cb = new GerritCallback<JavaScriptObject>() {
+ static void invoke(Project.NameKey project, ActionInfo action, RestApi api) {
+ invoke(action, api, callback(PageLinks.toProject(project)));
+ }
+
+ private static AsyncCallback<JavaScriptObject> callback(final String target) {
+ return new GerritCallback<JavaScriptObject>() {
@Override
- public void onSuccess(JavaScriptObject msg) {
- if (NativeString.is(msg)) {
- NativeString str = (NativeString) msg;
- if (!str.asString().isEmpty()) {
- Window.alert(str.asString());
- }
+ public void onSuccess(JavaScriptObject in) {
+ UiResult result = asUiResult(in);
+ if (result.alert() != null) {
+ Window.alert(result.alert());
}
- Gerrit.display(PageLinks.toProject(project));
+
+ if (result.redirectUrl() != null && result.openWindow()) {
+ Window.open(result.redirectUrl(), "_blank", null);
+ } else if (result.redirectUrl() != null) {
+ Location.assign(result.redirectUrl());
+ } else {
+ Gerrit.display(target);
+ }
+ }
+
+ private UiResult asUiResult(JavaScriptObject in) {
+ if (NativeString.is(in)) {
+ String str = ((NativeString) in).asString();
+ return str.isEmpty() ? UiResult.none() : UiResult.alert(str);
+ }
+ return in.cast();
}
};
- invoke(action, api, cb);
}
private static void invoke(ActionInfo action, RestApi api,
AsyncCallback<JavaScriptObject> cb) {
- if ("PUT".equalsIgnoreCase(action.method())) {
+ if ("GET".equalsIgnoreCase(action.method())) {
+ api.get(cb);
+ } else if ("PUT".equalsIgnoreCase(action.method())) {
api.put(JavaScriptObject.createObject(), cb);
} else if ("DELETE".equalsIgnoreCase(action.method())) {
api.delete(cb);
@@ -75,4 +79,16 @@
private DefaultActions() {
}
+
+ private static class UiResult extends JavaScriptObject {
+ static native UiResult alert(String m) /*-{ return {'alert':m} }-*/;
+ static native UiResult none() /*-{ return {} }-*/;
+
+ final native String alert() /*-{ return this.alert }-*/;
+ final native String redirectUrl() /*-{ return this.url }-*/;
+ final native boolean openWindow() /*-{ return this.open_window || false }-*/;
+
+ protected UiResult() {
+ }
+ }
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java
index 8b5c93e..f0fb436 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/PluginLoader.java
@@ -16,6 +16,7 @@
import com.google.gerrit.client.ErrorDialog;
import com.google.gerrit.client.Gerrit;
+import com.google.gerrit.client.VoidResult;
import com.google.gerrit.client.rpc.NativeMap;
import com.google.gerrit.client.rpc.Natives;
import com.google.gwt.core.client.Callback;
@@ -23,6 +24,7 @@
import com.google.gwt.core.client.ScriptInjector;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwtexpui.progress.client.ProgressBar;
@@ -33,11 +35,12 @@
private static final int MAX_LOAD_TIME_MILLIS = 5000;
private static PluginLoader self;
- public static void load(List<String> plugins, final String token) {
+ public static void load(List<String> plugins,
+ AsyncCallback<VoidResult> callback) {
if (plugins == null || plugins.isEmpty()) {
- Gerrit.display(token);
+ callback.onSuccess(VoidResult.create());
} else {
- self = new PluginLoader(token);
+ self = new PluginLoader(callback);
self.load(plugins);
self.startTimers();
self.center();
@@ -48,16 +51,16 @@
self.loadedOne();
}
- private final String token;
+ private final AsyncCallback<VoidResult> callback;
private ProgressBar progress;
private Timer show;
private Timer update;
private Timer timeout;
private boolean visible;
- private PluginLoader(String tokenToDisplay) {
+ private PluginLoader(AsyncCallback<VoidResult> cb) {
super(/* auto hide */false, /* modal */true);
- token = tokenToDisplay;
+ callback = cb;
progress = new ProgressBar(Gerrit.C.loadingPlugins());
setStyleName(Gerrit.RESOURCES.css().errorDialog());
@@ -139,7 +142,7 @@
}
}
- Gerrit.display(token);
+ callback.onSuccess(VoidResult.create());
}
private boolean hadFailures() {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ProjectGlue.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ProjectGlue.java
index bce691c..3f2e794 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ProjectGlue.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/api/ProjectGlue.java
@@ -16,6 +16,7 @@
import com.google.gerrit.client.actions.ActionButton;
import com.google.gerrit.client.actions.ActionInfo;
+import com.google.gerrit.client.projects.BranchInfo;
import com.google.gerrit.client.projects.ProjectApi;
import com.google.gerrit.client.rpc.RestApi;
import com.google.gerrit.reviewdb.client.Project;
@@ -24,10 +25,31 @@
public class ProjectGlue {
public static void onAction(
Project.NameKey project,
+ BranchInfo branch,
+ ActionInfo action,
+ ActionButton button) {
+ RestApi api = ProjectApi.project(project)
+ .view("branches").id(branch.ref())
+ .view(action.id());
+ JavaScriptObject f = branchAction(action.id());
+ if (f != null) {
+ ActionContext c = ActionContext.create(api);
+ c.set(action);
+ c.set(project);
+ c.set(branch);
+ c.button(button);
+ ApiGlue.invoke(f, c);
+ } else {
+ DefaultActions.invoke(project, action, api);
+ }
+ }
+
+ public static void onAction(
+ Project.NameKey project,
ActionInfo action,
ActionButton button) {
RestApi api = ProjectApi.project(project).view(action.id());
- JavaScriptObject f = get(action.id());
+ JavaScriptObject f = projectAction(action.id());
if (f != null) {
ActionContext c = ActionContext.create(api);
c.set(action);
@@ -35,14 +57,18 @@
c.button(button);
ApiGlue.invoke(f, c);
} else {
- DefaultActions.invokeProjectAction(project, action, api);
+ DefaultActions.invoke(project, action, api);
}
}
- private static final native JavaScriptObject get(String id) /*-{
+ private static final native JavaScriptObject projectAction(String id) /*-{
return $wnd.Gerrit.project_actions[id];
}-*/;
+ private static final native JavaScriptObject branchAction(String id) /*-{
+ return $wnd.Gerrit.branch_actions[id];
+ }-*/;
+
private ProjectGlue() {
}
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/arrowDown.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/arrowDown.png
new file mode 100644
index 0000000..ba67de7
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/arrowDown.png
Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/arrowUp.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/arrowUp.png
new file mode 100644
index 0000000..5674d6c
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/arrowUp.png
Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java
index e0c1105..b6fdd32 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java
@@ -49,11 +49,10 @@
import com.google.gerrit.client.ui.UserActivityMonitor;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.extensions.common.ListChangesOption;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Change.Status;
import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
@@ -206,7 +205,8 @@
RestApi call = ChangeApi.detail(changeId.get());
ChangeList.addOptions(call, EnumSet.of(
ListChangesOption.CURRENT_ACTIONS,
- ListChangesOption.ALL_REVISIONS));
+ ListChangesOption.ALL_REVISIONS,
+ ListChangesOption.WEB_LINKS));
if (!fg) {
call.background();
}
@@ -800,7 +800,7 @@
if (Gerrit.isSignedIn()) {
initEditMessageAction(info, revision);
replyAction = new ReplyAction(info, revision,
- style, commentLinkProcessor, reply);
+ style, commentLinkProcessor, reply, quickApprove);
if (topic.canEdit()) {
keysAction.add(new KeyCommand(0, 't', Util.C.keyEditTopic()) {
@Override
@@ -849,7 +849,7 @@
private void renderSubmitType(String action) {
try {
- SubmitType type = Project.SubmitType.valueOf(action);
+ SubmitType type = SubmitType.valueOf(action);
submitActionText.setInnerText(
com.google.gerrit.client.admin.Util.toLongString(type));
} catch (IllegalArgumentException e) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.java
index 931a94b..d6b7feb 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.java
@@ -17,28 +17,32 @@
import com.google.gerrit.client.FormatUtil;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.GitwebLink;
+import com.google.gerrit.client.WebLinkInfo;
import com.google.gerrit.client.changes.ChangeInfo;
import com.google.gerrit.client.changes.ChangeInfo.CommitInfo;
import com.google.gerrit.client.changes.ChangeInfo.GitPerson;
import com.google.gerrit.client.changes.ChangeInfo.RevisionInfo;
+import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.ui.CommentLinkProcessor;
import com.google.gerrit.client.ui.InlineHyperlink;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.reviewdb.client.Change.Status;
import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.JsArray;
import com.google.gwt.dom.client.AnchorElement;
import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.TableCellElement;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
+import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
-import com.google.gwt.user.client.ui.UIObject;
import com.google.gwtexpui.clippy.client.CopyableLabel;
import com.google.gwtexpui.safehtml.client.SafeHtmlBuilder;
@@ -53,7 +57,7 @@
@UiField Style style;
@UiField CopyableLabel commitName;
- @UiField AnchorElement browserLink;
+ @UiField TableCellElement webLinkCell;
@UiField InlineHyperlink authorNameEmail;
@UiField Element authorDate;
@UiField InlineHyperlink committerNameEmail;
@@ -100,14 +104,29 @@
committerDate, change.status());
text.setHTML(commentLinkProcessor.apply(
new SafeHtmlBuilder().append(commit.message()).linkify()));
+ setWebLinks(change, revision, revInfo);
+ }
+ private void setWebLinks(ChangeInfo change, String revision,
+ RevisionInfo revInfo) {
GitwebLink gw = Gerrit.getGitwebLink();
if (gw != null && gw.canLink(revInfo)) {
- browserLink.setInnerText(gw.getLinkName());
- browserLink.setHref(gw.toRevision(change.project(), revision));
- } else {
- UIObject.setVisible(browserLink, false);
+ addWebLink(gw.toRevision(change.project(), revision), gw.getLinkName());
}
+
+ JsArray<WebLinkInfo> links = revInfo.web_links();
+ if (links != null) {
+ for (WebLinkInfo link : Natives.asList(links)) {
+ addWebLink(link.url(), parenthesize(link.name()));
+ }
+ }
+ }
+
+ private void addWebLink(String href, String name) {
+ AnchorElement a = DOM.createAnchor().cast();
+ a.setHref(href);
+ a.setInnerText(name);
+ webLinkCell.appendChild(a);
}
private static void formatLink(GitPerson person, InlineHyperlink name,
@@ -118,6 +137,14 @@
date.setInnerText(FormatUtil.mediumFormat(person.date()));
}
+ private static String parenthesize(String str) {
+ return new StringBuilder()
+ .append("(")
+ .append(str)
+ .append(")")
+ .toString();
+ }
+
private static String renderName(GitPerson person) {
return person.name() + " <" + person.email() + ">";
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.ui.xml
index c02e9f8..7ca66f9 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/CommitBox.ui.xml
@@ -79,6 +79,10 @@
top: 0px;
right: -16px;
}
+ <!-- To make room for the copyableLabel from the adjacent column -->
+ .webLinkCell a:first-child {
+ margin-left:16px;
+ }
</ui:style>
<g:HTMLPanel>
<g:ScrollPanel styleName='{style.scroll}' ui:field='scroll'>
@@ -114,7 +118,7 @@
<tr>
<th><ui:msg>Commit</ui:msg></th>
<td><clippy:CopyableLabel styleName='{style.clippy}' ui:field='commitName'/></td>
- <td><a style="margin-left:16px;" ui:field='browserLink' href=""/></td>
+ <td ui:field='webLinkCell' class='{style.webLinkCell}'></td>
</tr>
<tr>
<th><ui:msg>Change-Id</ui:msg></th>
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DownloadBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DownloadBox.java
index 929bf90..09335c1 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DownloadBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/DownloadBox.java
@@ -46,7 +46,6 @@
import java.util.List;
class DownloadBox extends VerticalPanel {
- private final static String ARCHIVE[] = {"tar", "tbz2", "tgz", "txz"};
private final ChangeInfo change;
private final String revision;
private final PatchSet.Id psId;
@@ -149,8 +148,13 @@
}
private void insertArchive() {
- List<Anchor> formats = new ArrayList<>(ARCHIVE.length);
- for (String f : ARCHIVE) {
+ List<String> activated = Gerrit.getConfig().getArchiveFormats();
+ if (activated.isEmpty()) {
+ return;
+ }
+
+ List<Anchor> anchors = new ArrayList<>(activated.size());
+ for (String f : activated) {
Anchor archive = new Anchor(f);
archive.setHref(new RestApi("/changes/")
.id(psId.getParentKey().get())
@@ -159,11 +163,11 @@
.view("archive")
.addParameter("format", f)
.url());
- formats.add(archive);
+ anchors.add(archive);
}
HorizontalPanel p = new HorizontalPanel();
- Iterator<Anchor> it = formats.iterator();
+ Iterator<Anchor> it = anchors.iterator();
while (it.hasNext()) {
Anchor a = it.next();
p.add(a);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/QuickApprove.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/QuickApprove.java
index 98d495a..6e86730 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/QuickApprove.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/QuickApprove.java
@@ -109,16 +109,17 @@
@Override
public void onClick(ClickEvent event) {
- if (replyAction != null) {
- input.message(replyAction.getMessage());
+ if (replyAction != null && replyAction.isVisible()) {
+ replyAction.quickApprove(input);
+ } else {
+ ChangeApi.revision(changeId.get(), revision)
+ .view("review")
+ .post(input, new GerritCallback<ReviewInput>() {
+ @Override
+ public void onSuccess(ReviewInput result) {
+ Gerrit.display(PageLinks.toChange(changeId));
+ }
+ });
}
- ChangeApi.revision(changeId.get(), revision)
- .view("review")
- .post(input, new GerritCallback<ReviewInput>() {
- @Override
- public void onSuccess(ReviewInput result) {
- Gerrit.display(PageLinks.toChange(changeId));
- }
- });
}
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyAction.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyAction.java
index aaa301c..b234fe3 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyAction.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ReplyAction.java
@@ -17,6 +17,7 @@
import com.google.gerrit.client.changes.ChangeInfo;
import com.google.gerrit.client.changes.ChangeInfo.LabelInfo;
import com.google.gerrit.client.changes.ChangeInfo.MessageInfo;
+import com.google.gerrit.client.changes.ReviewInput;
import com.google.gerrit.client.rpc.NativeMap;
import com.google.gerrit.client.ui.CommentLinkProcessor;
import com.google.gerrit.reviewdb.client.PatchSet;
@@ -35,6 +36,7 @@
private final ChangeScreen2.Style style;
private final CommentLinkProcessor clp;
private final Widget replyButton;
+ private final Widget quickApproveButton;
private NativeMap<LabelInfo> allLabels;
private NativeMap<JsArrayString> permittedLabels;
@@ -47,7 +49,8 @@
String revision,
ChangeScreen2.Style style,
CommentLinkProcessor clp,
- Widget replyButton) {
+ Widget replyButton,
+ Widget quickApproveButton) {
this.psId = new PatchSet.Id(
info.legacy_id(),
info.revisions().get(revision)._number());
@@ -55,6 +58,7 @@
this.style = style;
this.clp = clp;
this.replyButton = replyButton;
+ this.quickApproveButton = quickApproveButton;
boolean current = revision.equals(info.current_revision());
allLabels = info.all_labels();
@@ -63,8 +67,12 @@
: NativeMap.<JsArrayString> create();
}
- String getMessage() {
- return replyBox != null ? replyBox.getMessage() : null;
+ boolean isVisible() {
+ return popup != null;
+ }
+
+ void quickApprove(ReviewInput input) {
+ replyBox.quickApprove(input);
}
void hide() {
@@ -96,9 +104,8 @@
final PluginSafePopupPanel p = new PluginSafePopupPanel(true, false);
p.setStyleName(style.replyBox());
- p.setGlassEnabled(true);
- p.setGlassStyleName("");
p.addAutoHidePartner(replyButton.getElement());
+ p.addAutoHidePartner(quickApproveButton.getElement());
p.addCloseHandler(new CloseHandler<PopupPanel>() {
@Override
public void onClose(CloseEvent<PopupPanel> event) {
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 64dcd28..4e77041 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
@@ -199,7 +199,16 @@
@UiHandler("post")
void onPost(ClickEvent e) {
- in.message(getMessage());
+ postReview();
+ }
+
+ void quickApprove(ReviewInput quickApproveInput) {
+ in.mergeLabels(quickApproveInput);
+ postReview();
+ }
+
+ private void postReview() {
+ in.message(message.getText().trim());
in.prePost();
ChangeApi.revision(psId.getParentKey().get(), revision)
.view("review")
@@ -214,12 +223,9 @@
hide();
}
- String getMessage() {
- return message.getText().trim();
- }
-
@UiHandler("cancel")
void onCancel(ClickEvent e) {
+ message.setText("");
hide();
}
@@ -316,10 +322,23 @@
}
}
+ private Short normalizeDefaultValue(Short defaultValue, Set<Short> permittedValues) {
+ Short pmin = Collections.min(permittedValues);
+ Short pmax = Collections.max(permittedValues);
+ Short dv = defaultValue;
+ if (dv > pmax) {
+ dv = pmax;
+ } else if (dv < pmin) {
+ dv = pmin;
+ }
+ return dv;
+ }
+
private void renderRadio(int row,
List<Short> columns,
LabelAndValues lv) {
String id = lv.info.name();
+ Short dv = normalizeDefaultValue(lv.info.defaultValue(), lv.permitted);
labelHelpColumn = 1 + columns.size();
labelsTable.setText(row, 0, id);
@@ -339,9 +358,10 @@
if (lv.permitted.contains(v)) {
String text = lv.info.value_text(LabelValue.formatValue(v));
LabelRadioButton b = new LabelRadioButton(group, text, v);
- if ((self != null && v == self.value()) || (self == null && v == 0)) {
+ if ((self != null && v == self.value()) || (self == null && v.equals(dv))) {
b.setValue(true);
group.select(b);
+ in.label(group.label, v);
labelsTable.setText(row, labelHelpColumn, b.text);
}
group.buttons.add(b);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java
index 57ba4b9..10a140d 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.java
@@ -146,6 +146,12 @@
}
}
+ @UiHandler("addme")
+ void onAddMe(ClickEvent e) {
+ String accountId = String.valueOf(Gerrit.getUserAccountInfo()._account_id());
+ addReviewer(accountId, false);
+ }
+
@UiHandler("cancel")
void onCancel(ClickEvent e) {
openForm.setVisible(true);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.ui.xml
index dd2ef78..4e3b0c6 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Reviewers.ui.xml
@@ -72,6 +72,9 @@
<g:Button ui:field='add' styleName='{res.style.button}'>
<div>Add</div>
</g:Button>
+ <g:Button ui:field='addme' styleName='{res.style.button}'>
+ <div>Add Me</div>
+ </g:Button>
<g:Button ui:field='cancel'
styleName='{res.style.button}'
addStyleNames='{style.cancel}'>
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeInfo.java
index bfe70b8..0c1815f 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeInfo.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeInfo.java
@@ -14,6 +14,7 @@
package com.google.gerrit.client.changes;
+import com.google.gerrit.client.WebLinkInfo;
import com.google.gerrit.client.account.AccountInfo;
import com.google.gerrit.client.actions.ActionInfo;
import com.google.gerrit.client.diff.FileInfo;
@@ -161,6 +162,7 @@
public final native boolean optional() /*-{ return this.optional ? true : false; }-*/;
public final native boolean blocking() /*-{ return this.blocking ? true : false; }-*/;
+ public final native short defaultValue() /*-{ return this.default_value; }-*/;
final native short _value()
/*-{
if (this.value) return this.value;
@@ -218,6 +220,7 @@
public final native boolean has_fetch() /*-{ return this.hasOwnProperty('fetch') }-*/;
public final native NativeMap<FetchInfo> fetch() /*-{ return this.fetch; }-*/;
+ public final native JsArray<WebLinkInfo> web_links() /*-{ return this.web_links; }-*/;
public static void sortRevisionInfoByNumber(JsArray<RevisionInfo> list) {
Collections.sort(Natives.asList(list), new Comparator<RevisionInfo>() {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java
index 1d760f9..aa01ef2 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java
@@ -42,6 +42,7 @@
import com.google.gerrit.common.data.ChangeInfo;
import com.google.gerrit.common.data.SubmitTypeRecord;
import com.google.gerrit.extensions.common.ListChangesOption;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.CommentVisibilityStrategy;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Change.Status;
@@ -50,7 +51,6 @@
import com.google.gerrit.reviewdb.client.Patch.ChangeType;
import com.google.gerrit.reviewdb.client.Patch.PatchType;
import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.event.dom.client.ChangeEvent;
@@ -300,7 +300,7 @@
CallbackGroup cbs1 = new CallbackGroup();
final CallbackGroup cbs2 = new CallbackGroup();
final PatchSet.Id psId = event.getValue().getCurrentPatchSet().getId();
- final Map<String, Patch> patches = new HashMap<String, Patch>();
+ final Map<String, Patch> patches = new HashMap<>();
String revId =
event.getValue().getCurrentPatchSetDetail().getInfo().getRevId();
@@ -311,7 +311,7 @@
@Override
public void onSuccess(NativeString result) {
event.getValue().setSubmitTypeRecord(SubmitTypeRecord.OK(
- Project.SubmitType.valueOf(result.asString())));
+ SubmitType.valueOf(result.asString())));
}
public void onFailure(Throwable caught) {}
}));
@@ -330,7 +330,7 @@
private void dependsOn(RelatedChanges.RelatedInfo info) {
ChangeAndCommit self = null;
- Map<String, ChangeAndCommit> m = new HashMap<String, ChangeAndCommit>();
+ Map<String, ChangeAndCommit> m = new HashMap<>();
for (int i = 0; i < info.changes().length(); i++) {
ChangeAndCommit c = info.changes().get(i);
if (changeId.equals(c.legacy_id())) {
@@ -342,7 +342,7 @@
}
if (self != null && self.commit() != null
&& self.commit().parents() != null) {
- List<ChangeInfo> d = new ArrayList<ChangeInfo>();
+ List<ChangeInfo> d = new ArrayList<>();
for (CommitInfo p : Natives.asList(self.commit().parents())) {
ChangeAndCommit pc = m.get(p.commit());
if (pc != null && pc.has_change_number()) {
@@ -356,12 +356,12 @@
}
private void neededBy(RelatedChanges.RelatedInfo info) {
- Set<String> mine = new HashSet<String>();
+ Set<String> mine = new HashSet<>();
for (PatchSet ps : event.getValue().getPatchSets()) {
mine.add(ps.getRevision().get());
}
- List<ChangeInfo> n = new ArrayList<ChangeInfo>();
+ List<ChangeInfo> n = new ArrayList<>();
for (int i = 0; i < info.changes().length(); i++) {
ChangeAndCommit c = info.changes().get(i);
if (c.has_change_number()
@@ -418,7 +418,7 @@
}
public void onFailure(Throwable caught) {}
}));
- final Set<PatchSet.Id> withDrafts = new HashSet<PatchSet.Id>();
+ final Set<PatchSet.Id> withDrafts = new HashSet<>();
event.getValue().setPatchSetsWithDraftComments(withDrafts);
for (PatchSet ps : event.getValue().getPatchSets()) {
if (!ps.getId().equals(psId)) {
@@ -478,7 +478,7 @@
public void onSuccess(NativeMap<FileInfo> result) {
JsArray<FileInfo> fileInfos = result.values();
FileInfo.sortFileInfoByPath(fileInfos);
- List<Patch> list = new ArrayList<Patch>(fileInfos.length());
+ List<Patch> list = new ArrayList<>(fileInfos.length());
for (FileInfo f : Natives.asList(fileInfos)) {
Patch p = patches.get(f.path());
if (p == null) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java
index 1cdf30f..4999795 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeTable.java
@@ -59,7 +59,7 @@
keysAction.add(new StarKeyCommand(0, 's', Util.C.changeTableStar()));
}
- sections = new ArrayList<Section>();
+ sections = new ArrayList<>();
table.setText(0, C_STAR, "");
table.setText(0, C_SUBJECT, Util.C.changeTableColumnSubject());
table.setText(0, C_OWNER, Util.C.changeTableColumnOwner());
@@ -307,7 +307,7 @@
parent.insertNoneRow(dataBegin);
}
} else {
- Set<Change.Id> cids = new HashSet<Change.Id>();
+ Set<Change.Id> cids = new HashSet<>();
if (!hadData) {
parent.removeRow(dataBegin);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CustomDashboardScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CustomDashboardScreen.java
index 840ebaa..320976e 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CustomDashboardScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/CustomDashboardScreen.java
@@ -26,12 +26,7 @@
@Override
protected void onInitUI() {
- table = new DashboardTable(params) {
- @Override
- protected void onLoad() {
- super.onLoad();
- }
-
+ table = new DashboardTable(this, params) {
@Override
public void finishDisplay() {
super.finishDisplay();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/DashboardTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/DashboardTable.java
index ac68722..978d4e5 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/DashboardTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/DashboardTable.java
@@ -18,10 +18,13 @@
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.Natives;
import com.google.gerrit.client.ui.InlineHyperlink;
+import com.google.gerrit.client.ui.Screen;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.extensions.common.ListChangesOption;
import com.google.gwt.core.client.JsArray;
+import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.http.client.URL;
+import com.google.gwtexpui.globalkey.client.KeyCommand;
import java.util.ArrayList;
import java.util.EnumSet;
@@ -34,7 +37,7 @@
private List<String> titles;
private List<String> queries;
- public DashboardTable(String params) {
+ public DashboardTable(final Screen screen, String params) {
titles = new ArrayList<>();
queries = new ArrayList<>();
String foreach = null;
@@ -72,6 +75,13 @@
addSection(s);
sections.add(s);
}
+
+ keysNavigation.add(new KeyCommand(0, 'R', Util.C.keyReloadSearch()) {
+ @Override
+ public void onKeyPress(KeyPressEvent event) {
+ Gerrit.display(screen.getToken());
+ }
+ });
}
private String removeLimit(String query) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
index 31685e4..b7a0ec8 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetComplexDisclosurePanel.java
@@ -76,7 +76,7 @@
private Grid infoTable;
private Panel actionsPanel;
private PatchTable patchTable;
- private final Set<ClickHandler> registeredClickHandler = new HashSet<ClickHandler>();
+ private final Set<ClickHandler> registeredClickHandler = new HashSet<>();
private PatchSet.Id diffBaseId;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetsBlock.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetsBlock.java
index 4805185..01c8fdb 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetsBlock.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchSetsBlock.java
@@ -44,7 +44,7 @@
*/
public class PatchSetsBlock extends Composite {
private final Map<PatchSet.Id, PatchSetComplexDisclosurePanel> patchSetPanels =
- new HashMap<PatchSet.Id, PatchSetComplexDisclosurePanel>();
+ new HashMap<>();
private final FlowPanel body;
private HandlerRegistration regNavigation;
@@ -84,7 +84,7 @@
}
}
- patchSetPanelsList = new ArrayList<PatchSetComplexDisclosurePanel>();
+ patchSetPanelsList = new ArrayList<>();
for (final PatchSet ps : patchSets) {
final PatchSetComplexDisclosurePanel p =
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchTable.java
index b89d1cc..425309d 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PatchTable.java
@@ -105,7 +105,7 @@
private Map<Key, Integer> patchMap() {
if (patchMap == null) {
- patchMap = new HashMap<Patch.Key, Integer>();
+ patchMap = new HashMap<>();
for (int i = 0; i < patchList.size(); i++) {
patchMap.put(patchList.get(i).getKey(), i);
}
@@ -154,7 +154,7 @@
myTable.addClickHandler(clickHandler);
} else {
if (clickHandlers == null) {
- clickHandlers = new ArrayList<ClickHandler>(2);
+ clickHandlers = new ArrayList<>(2);
}
clickHandlers.add(clickHandler);
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ProjectDashboardScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ProjectDashboardScreen.java
index 899e86b..d2eec27 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ProjectDashboardScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ProjectDashboardScreen.java
@@ -32,12 +32,7 @@
@Override
protected void onInitUI() {
- table = new DashboardTable(params) {
- @Override
- protected void onLoad() {
- super.onLoad();
- }
-
+ table = new DashboardTable(this, params) {
@Override
public void finishDisplay() {
super.finishDisplay();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java
index 38a8cf9..f718b5d 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java
@@ -36,11 +36,11 @@
import com.google.gerrit.common.data.ChangeDetail;
import com.google.gerrit.common.data.SubmitTypeRecord;
import com.google.gerrit.extensions.common.ListChangesOption;
+import com.google.gerrit.extensions.common.SubmitType;
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.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.event.dom.client.ClickEvent;
@@ -97,7 +97,7 @@
super.onInitUI();
addStyleName(Gerrit.RESOURCES.css().publishCommentsScreen());
- approvalButtons = new ArrayList<ValueRadioButton>();
+ approvalButtons = new ArrayList<>();
descBlock = new ChangeDescriptionBlock(null);
add(descBlock);
@@ -169,7 +169,7 @@
@Override
public void onSuccess(NativeString result) {
submitTypeRecord = SubmitTypeRecord.OK(
- Project.SubmitType.valueOf(result.asString()));
+ SubmitType.valueOf(result.asString()));
}
public void onFailure(Throwable caught) {}
}));
@@ -289,7 +289,7 @@
if (nativeValues == null || nativeValues.length() == 0) {
return;
}
- List<String> values = new ArrayList<String>(nativeValues.length());
+ List<String> values = new ArrayList<>(nativeValues.length());
for (int i = 0; i < nativeValues.length(); i++) {
values.add(nativeValues.get(i));
}
@@ -350,7 +350,7 @@
}
draftsPanel.clear();
- commentEditors = new ArrayList<CommentEditorPanel>();
+ commentEditors = new ArrayList<>();
if (!drafts.isEmpty()) {
draftsPanel.add(new SmallHeading(Util.C.headingPatchComments()));
@@ -468,8 +468,8 @@
}
private List<PatchLineComment> draftList() {
- List<PatchLineComment> d = new ArrayList<PatchLineComment>();
- List<String> paths = new ArrayList<String>(drafts.keySet());
+ List<PatchLineComment> d = new ArrayList<>();
+ List<String> paths = new ArrayList<>(drafts.keySet());
Collections.sort(paths);
for (String path : paths) {
JsArray<CommentInfo> comments = drafts.get(path);
@@ -512,7 +512,7 @@
SavedState(final PublishCommentScreen p) {
patchSetId = p.patchSetId;
message = p.message.getText();
- approvals = new HashMap<String, String>();
+ approvals = new HashMap<>();
for (final ValueRadioButton b : p.approvalButtons) {
if (b.getValue()) {
approvals.put(b.label.name(), b.value);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ReviewInput.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ReviewInput.java
index 0599a8b..812cadb 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ReviewInput.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ReviewInput.java
@@ -69,6 +69,14 @@
}
}-*/;
+ public final native void mergeLabels(ReviewInput o) /*-{
+ var l=o.labels;
+ if (l) {
+ for (var n in l)
+ this.labels[n]=l[n];
+ }
+ }-*/;
+
protected ReviewInput() {
}
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/config/ConfigServerApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/config/ConfigServerApi.java
index 9cb6c37..5dedaf0 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/config/ConfigServerApi.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/config/ConfigServerApi.java
@@ -14,6 +14,7 @@
package com.google.gerrit.client.config;
+import com.google.gerrit.client.account.Preferences;
import com.google.gerrit.client.extensions.TopMenuList;
import com.google.gerrit.client.rpc.NativeMap;
import com.google.gerrit.client.rpc.RestApi;
@@ -32,4 +33,8 @@
public static void topMenus(AsyncCallback<TopMenuList> cb) {
new RestApi("/config/server/top-menus").get(cb);
}
+
+ public static void defaultPreferences(AsyncCallback<Preferences> cb) {
+ new RestApi("/config/server/preferences").get(cb);
+ }
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ChunkManager.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ChunkManager.java
index 36bd64f..dcea18c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ChunkManager.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ChunkManager.java
@@ -14,6 +14,8 @@
package com.google.gerrit.client.diff;
+import static com.google.gerrit.client.diff.DisplaySide.A;
+import static com.google.gerrit.client.diff.DisplaySide.B;
import static com.google.gerrit.client.diff.OverviewBar.MarkType.DELETE;
import static com.google.gerrit.client.diff.OverviewBar.MarkType.EDIT;
import static com.google.gerrit.client.diff.OverviewBar.MarkType.INSERT;
@@ -21,11 +23,14 @@
import com.google.gerrit.client.diff.DiffInfo.Region;
import com.google.gerrit.client.diff.DiffInfo.Span;
import com.google.gerrit.client.rpc.Natives;
+import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.EventListener;
import net.codemirror.lib.CodeMirror;
import net.codemirror.lib.CodeMirror.LineClassWhere;
@@ -41,6 +46,34 @@
/** Colors modified regions for {@link SideBySide2}. */
class ChunkManager {
+ private static final JavaScriptObject focusA = initOnClick(A);
+ private static final JavaScriptObject focusB = initOnClick(B);
+ private static final native JavaScriptObject initOnClick(DisplaySide s) /*-{
+ return $entry(function(e){
+ @com.google.gerrit.client.diff.ChunkManager::focus(
+ Lcom/google/gwt/dom/client/NativeEvent;
+ Lcom/google/gerrit/client/diff/DisplaySide;)(e,s)
+ });
+ }-*/;
+
+ private static void focus(NativeEvent event, DisplaySide side) {
+ Element e = Element.as(event.getEventTarget());
+ for (e = DOM.getParent(e); e != null; e = DOM.getParent(e)) {
+ EventListener l = DOM.getEventListener(e);
+ if (l instanceof SideBySide2) {
+ ((SideBySide2) l).getCmFromSide(side).focus();
+ event.stopPropagation();
+ }
+ }
+ };
+
+ static void focusOnClick(Element e, DisplaySide side) {
+ onClick(e, side == A ? focusA : focusB);
+ }
+
+ private static final native void onClick(Element e, JavaScriptObject f)
+ /*-{ e.onclick = f }-*/;
+
private final SideBySide2 host;
private final CodeMirror cmA;
private final CodeMirror cmB;
@@ -68,15 +101,7 @@
}
DiffChunkInfo getFirst() {
- if (!chunks.isEmpty()) {
- for (DiffChunkInfo d : chunks) {
- if (d.getSide() == DisplaySide.B) {
- return d;
- }
- }
- return chunks.get(0);
- }
- return null;
+ return !chunks.isEmpty() ? chunks.get(0) : null;
}
void reset() {
@@ -228,6 +253,7 @@
pad.setClassName(DiffTable.style.padding());
pad.getStyle().setHeight(len, Unit.EM);
pad.getStyle().setPaddingBottom(len, Unit.PX);
+ focusOnClick(pad, cm.side());
padding.add(cm.addLineWidget(
line == -1 ? 0 : line,
pad,
@@ -263,7 +289,7 @@
DiffChunkInfo lookUp = chunks.get(res);
// If edit, skip the deletion chunk and set focus on the insertion one.
- if (lookUp.isEdit() && lookUp.getSide() == DisplaySide.A) {
+ if (lookUp.isEdit() && lookUp.getSide() == A) {
res = res + (dir == Direction.PREV ? -1 : 1);
if (res < 0 || chunks.size() <= res) {
return;
@@ -291,7 +317,7 @@
public int compare(DiffChunkInfo a, DiffChunkInfo b) {
if (a.getSide() == b.getSide()) {
return a.getStart() - b.getStart();
- } else if (a.getSide() == DisplaySide.A) {
+ } else if (a.getSide() == A) {
int comp = mapper.lineOnOther(a.getSide(), a.getStart())
.getLine() - b.getStart();
return comp == 0 ? -1 : comp;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBoxUi.css b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBoxUi.css
index b95a86e..523cadc 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBoxUi.css
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentBoxUi.css
@@ -73,7 +73,7 @@
.message p,
.message ul,
.message blockquote {
- -webkit-margin-before: 0;
+ -webkit-margin-before: 0.2em;
-webkit-margin-after: 0.3em;
}
.commentBox button {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentGroup.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentGroup.java
index 9fc36b0..7bcf4da 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentGroup.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/CommentGroup.java
@@ -61,6 +61,7 @@
padding = DOM.createDiv();
padding.setClassName(DiffTable.style.padding());
+ ChunkManager.focusOnClick(padding, cm.side());
getElement().appendChild(padding);
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
index 8a64e76..2a9f7ba 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
@@ -18,7 +18,9 @@
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArray;
+import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
@@ -28,6 +30,8 @@
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwt.user.client.ui.Widget;
+import net.codemirror.lib.CodeMirror;
+
/**
* A table with one row and two columns to hold the two CodeMirrors displaying
* the files to be diffed.
@@ -47,6 +51,7 @@
String rangeHighlight();
String showTabs();
String showLineNumbers();
+ String hideA();
String columnMargin();
String padding();
}
@@ -57,6 +62,8 @@
@UiField Element patchSetNavRow;
@UiField Element patchSetNavCellA;
@UiField Element patchSetNavCellB;
+ @UiField Element diffHeaderRow;
+ @UiField Element diffHeaderText;
@UiField FlowPanel widgets;
@UiField static DiffTableStyle style;
@@ -67,7 +74,9 @@
PatchSetSelectBox2 patchSetSelectBoxB;
private SideBySide2 parent;
+ private boolean header;
private boolean headerVisible;
+ private boolean visibleA;
DiffTable(SideBySide2 parent, PatchSet.Id base, PatchSet.Id revision,
String path) {
@@ -80,6 +89,30 @@
initWidget(uiBinder.createAndBindUi(this));
this.parent = parent;
this.headerVisible = true;
+ this.visibleA = true;
+ }
+
+ boolean isVisibleA() {
+ return visibleA;
+ }
+
+ void setVisibleA(boolean show) {
+ visibleA = show;
+ if (show) {
+ removeStyleName(style.hideA());
+ parent.syncScroll(DisplaySide.B); // match B's viewport
+ } else {
+ addStyleName(style.hideA());
+ }
+ }
+
+ Runnable toggleA() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ setVisibleA(!isVisibleA());
+ }
+ };
}
boolean isHeaderVisible() {
@@ -89,6 +122,7 @@
void setHeaderVisible(boolean show) {
headerVisible = show;
UIObject.setVisible(patchSetNavRow, show);
+ UIObject.setVisible(diffHeaderRow, show && header);
if (show) {
parent.header.removeStyleName(style.fullscreen());
} else {
@@ -98,12 +132,49 @@
}
int getHeaderHeight() {
- return patchSetSelectBoxA.getOffsetHeight();
+ int h = patchSetSelectBoxA.getOffsetHeight();
+ if (header) {
+ h += diffHeaderRow.getOffsetHeight();
+ }
+ return h;
}
- void setUpPatchSetNav(JsArray<RevisionInfo> list, DiffInfo info) {
+ void set(JsArray<RevisionInfo> list, DiffInfo info) {
patchSetSelectBoxA.setUpPatchSetNav(list, info.meta_a());
patchSetSelectBoxB.setUpPatchSetNav(list, info.meta_b());
+
+ JsArrayString hdr = info.diff_header();
+ if (hdr != null) {
+ StringBuilder b = new StringBuilder();
+ for (int i = 1; i < hdr.length(); i++) {
+ String s = hdr.get(i);
+ if (s.startsWith("diff --git ")
+ || s.startsWith("index ")
+ || s.startsWith("+++ ")
+ || s.startsWith("--- ")) {
+ continue;
+ }
+ b.append(s).append('\n');
+ }
+
+ String hdrTxt = b.toString().trim();
+ header = !hdrTxt.isEmpty();
+ diffHeaderText.setInnerText(hdrTxt);
+ UIObject.setVisible(diffHeaderRow, header);
+ } else {
+ header = false;
+ UIObject.setVisible(diffHeaderRow, false);
+ }
+ }
+
+ void refresh() {
+ overview.refresh();
+ if (header) {
+ CodeMirror cm = parent.getCmFromSide(DisplaySide.A);
+ diffHeaderText.getStyle().setMarginLeft(
+ cm.getGutterElement().getOffsetWidth(),
+ Unit.PX);
+ }
}
void add(Widget widget) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml
index 09eacaa..69f0167 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml
@@ -52,6 +52,11 @@
padding-bottom: 1px;
}
+ .hideA .psNavA,
+ .hideA .a {
+ display: none;
+ }
+
.table {
width: 100%;
table-layout: fixed;
@@ -59,6 +64,7 @@
}
.table td { padding: 0 }
.a, .b { width: 50% }
+ .hideA .b { width: 100% }
.overview {
width: 10px;
@@ -152,11 +158,17 @@
z-index: 2;
cursor: text;
}
+ .diff_header {
+ margin: 0 0 3px 0;
+ font-size: 12px;
+ font-weight: bold;
+ color: #5252ad;
+ }
</ui:style>
<g:HTMLPanel styleName='{style.difftable}'>
<table class='{style.table}'>
<tr ui:field='patchSetNavRow' class='{style.patchSetNav}'>
- <td ui:field='patchSetNavCellA'>
+ <td ui:field='patchSetNavCellA' class='{style.psNavA}'>
<d:PatchSetSelectBox2 ui:field='patchSetSelectBoxA' />
</td>
<td ui:field='patchSetNavCellB'>
@@ -164,6 +176,12 @@
</td>
<td class='{style.overview}' />
</tr>
+ <tr ui:field='diffHeaderRow' class='{style.patchSetNav}'>
+ <td colspan='2'><pre
+ ui:field='diffHeaderText'
+ class='{style.diff_header}' /></td>
+ <td class='{style.overview}' />
+ </tr>
<tr>
<td ui:field='cmA' class='{style.a}' />
<td ui:field='cmB' class='{style.b}' />
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java
index ed7c3b6..5021758 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.java
@@ -32,6 +32,8 @@
import com.google.gerrit.reviewdb.client.AccountDiffPreference.Theme;
import com.google.gerrit.reviewdb.client.AccountDiffPreference.Whitespace;
import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.RepeatingCommand;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.KeyDownEvent;
@@ -52,6 +54,12 @@
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.ToggleButton;
+import net.codemirror.lib.ModeInjector;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
/** Displays current diff preferences. */
class PreferencesBox extends Composite {
interface Binder extends UiBinder<HTMLPanel, PreferencesBox> {}
@@ -78,11 +86,13 @@
@UiField ToggleButton whitespaceErrors;
@UiField ToggleButton showTabs;
@UiField ToggleButton lineNumbers;
+ @UiField ToggleButton leftSide;
@UiField ToggleButton topMenu;
@UiField ToggleButton manualReview;
@UiField ToggleButton expandAllComments;
@UiField ToggleButton renderEntireFile;
@UiField ListBox theme;
+ @UiField ListBox mode;
@UiField Button apply;
@UiField Button save;
@@ -92,6 +102,7 @@
initWidget(uiBinder.createAndBindUi(this));
initIgnoreWhitespace();
initTheme();
+ initMode();
}
@Override
@@ -114,6 +125,16 @@
if (prefs.context() == WHOLE_FILE_CONTEXT) {
contextEntireFile.setValue(true);
}
+ if (view.canEnableRenderEntireFile(prefs)) {
+ renderEntireFile.setEnabled(true);
+ } else {
+ if (prefs.renderEntireFile()) {
+ prefs.renderEntireFile(false);
+ renderEntireFile.setValue(false);
+ view.updateRenderEntireFile();
+ }
+ renderEntireFile.setEnabled(false);
+ }
view.setContext(prefs.context());
}
};
@@ -129,12 +150,19 @@
whitespaceErrors.setValue(prefs.showWhitespaceErrors());
showTabs.setValue(prefs.showTabs());
lineNumbers.setValue(prefs.showLineNumbers());
+ leftSide.setValue(view.diffTable.isVisibleA());
topMenu.setValue(!prefs.hideTopMenu());
manualReview.setValue(prefs.manualReview());
expandAllComments.setValue(prefs.expandAllComments());
renderEntireFile.setValue(prefs.renderEntireFile());
+ renderEntireFile.setEnabled(view.canEnableRenderEntireFile(prefs));
setTheme(prefs.theme());
+ mode.setEnabled(prefs.syntaxHighlighting());
+ if (prefs.syntaxHighlighting()) {
+ setMode(view.getCmFromSide(DisplaySide.B).getStringOption("mode"));
+ }
+
switch (view.getIntraLineStatus()) {
case OFF:
case OK:
@@ -262,6 +290,11 @@
view.setShowLineNumbers(prefs.showLineNumbers());
}
+ @UiHandler("leftSide")
+ void onLeftSide(ValueChangeEvent<Boolean> e) {
+ view.diffTable.setVisibleA(e.getValue());
+ }
+
@UiHandler("topMenu")
void onTopMenu(ValueChangeEvent<Boolean> e) {
prefs.hideTopMenu(!e.getValue());
@@ -277,9 +310,36 @@
@UiHandler("syntaxHighlighting")
void onSyntaxHighlighting(ValueChangeEvent<Boolean> e) {
prefs.syntaxHighlighting(e.getValue());
+ mode.setEnabled(prefs.syntaxHighlighting());
+ if (prefs.syntaxHighlighting()) {
+ setMode(view.getContentType());
+ }
view.setSyntaxHighlighting(prefs.syntaxHighlighting());
}
+ @UiHandler("mode")
+ void onMode(ChangeEvent e) {
+ final String m = mode.getValue(mode.getSelectedIndex());
+ prefs.syntaxHighlighting(true);
+ syntaxHighlighting.setValue(true, false);
+ Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
+ @Override
+ public boolean execute() {
+ if (prefs.syntaxHighlighting() && view.isAttached()) {
+ view.operation(new Runnable() {
+ @Override
+ public void run() {
+ String mode = m != null && !m.isEmpty() ? m : null;
+ view.getCmFromSide(DisplaySide.A).setOption("mode", mode);
+ view.getCmFromSide(DisplaySide.B).setOption("mode", mode);
+ }
+ });
+ }
+ return false;
+ }
+ }, 50);
+ }
+
@UiHandler("whitespaceErrors")
void onWhitespaceErrors(ValueChangeEvent<Boolean> e) {
prefs.showWhitespaceErrors(e.getValue());
@@ -374,6 +434,52 @@
IGNORE_ALL_SPACE.name());
}
+ private static final Map<String, String> NAME_TO_MODE;
+ private static final Map<String, String> NORMALIZED_MODES;
+ static {
+ NAME_TO_MODE = new TreeMap<>();
+ NORMALIZED_MODES = new HashMap<>();
+ for (String type : ModeInjector.getKnownMimeTypes()) {
+ String name = type;
+ if (name.startsWith("text/x-")) {
+ name = name.substring("text/x-".length());
+ } else if (name.startsWith("text/")) {
+ name = name.substring("text/".length());
+ } else if (name.startsWith("application/")) {
+ name = name.substring("application/".length());
+ }
+
+ String normalized = NAME_TO_MODE.get(name);
+ if (normalized == null) {
+ normalized = type;
+ NAME_TO_MODE.put(name, normalized);
+ }
+ NORMALIZED_MODES.put(type, normalized);
+ }
+ }
+
+ private void initMode() {
+ mode.addItem("", "");
+ for (Map.Entry<String, String> e : NAME_TO_MODE.entrySet()) {
+ mode.addItem(e.getKey(), e.getValue());
+ }
+ }
+
+ private void setMode(String modeType) {
+ if (modeType != null && !modeType.isEmpty()) {
+ if (NORMALIZED_MODES.containsKey(modeType)) {
+ modeType = NORMALIZED_MODES.get(modeType);
+ }
+ for (int i = 0; i < mode.getItemCount(); i++) {
+ if (mode.getValue(i).equals(modeType)) {
+ mode.setSelectedIndex(i);
+ return;
+ }
+ }
+ }
+ mode.setSelectedIndex(0);
+ }
+
private void setTheme(Theme v) {
String name = v != null ? v.name() : Theme.DEFAULT.name();
for (int i = 0; i < theme.getItemCount(); i++) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.ui.xml
index d940590..670c3e3 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/PreferencesBox.ui.xml
@@ -204,6 +204,10 @@
</g:ToggleButton></td>
</tr>
<tr>
+ <th><ui:msg>Language</ui:msg></th>
+ <td><g:ListBox ui:field='mode'/></td>
+ </tr>
+ <tr>
<th><ui:msg>Whitespace Errors</ui:msg></th>
<td><g:ToggleButton ui:field='whitespaceErrors'>
<g:upFace><ui:msg>Hide</ui:msg></g:upFace>
@@ -225,6 +229,13 @@
</g:ToggleButton></td>
</tr>
<tr>
+ <th><ui:msg>Left Side</ui:msg></th>
+ <td><g:ToggleButton ui:field='leftSide'>
+ <g:upFace><ui:msg>Hide</ui:msg></g:upFace>
+ <g:downFace><ui:msg>Show</ui:msg></g:downFace>
+ </g:ToggleButton></td>
+ </tr>
+ <tr>
<th><ui:msg>Top Menu</ui:msg></th>
<td><g:ToggleButton ui:field='topMenu'>
<g:upFace><ui:msg>Hide</ui:msg></g:upFace>
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollSynchronizer.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollSynchronizer.java
index ba74202..abff8ef 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollSynchronizer.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/ScrollSynchronizer.java
@@ -24,6 +24,8 @@
private LineMapper mapper;
private OverviewBar overview;
private ScrollCallback active;
+ private ScrollCallback callbackA;
+ private ScrollCallback callbackB;
ScrollSynchronizer(DiffTable diffTable,
CodeMirror cmA, CodeMirror cmB,
@@ -32,8 +34,14 @@
this.mapper = mapper;
this.overview = diffTable.overview;
- cmA.on("scroll", new ScrollCallback(cmA, cmB, DisplaySide.A));
- cmB.on("scroll", new ScrollCallback(cmB, cmA, DisplaySide.B));
+ callbackA = new ScrollCallback(cmA, cmB, DisplaySide.A);
+ callbackB = new ScrollCallback(cmB, cmA, DisplaySide.B);
+ cmA.on("scroll", callbackA);
+ cmB.on("scroll", callbackB);
+ }
+
+ void syncScroll(DisplaySide masterSide) {
+ (masterSide == DisplaySide.A ? callbackA : callbackB).sync();
}
private void updateScreenHeader(ScrollInfo si) {
@@ -66,6 +74,10 @@
};
}
+ void sync() {
+ dst.scrollToY(align(src.getScrollInfo().getTop()));
+ }
+
@Override
public void run() {
if (active == null) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java
index 364d94c..96a9ff5 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java
@@ -14,6 +14,7 @@
package com.google.gerrit.client.diff;
+import static com.google.gerrit.reviewdb.client.AccountDiffPreference.WHOLE_FILE_CONTEXT;
import static java.lang.Double.POSITIVE_INFINITY;
import com.google.gerrit.client.Gerrit;
@@ -24,6 +25,7 @@
import com.google.gerrit.client.changes.ChangeInfo;
import com.google.gerrit.client.changes.ChangeInfo.RevisionInfo;
import com.google.gerrit.client.changes.ChangeList;
+import com.google.gerrit.client.diff.DiffInfo.FileMeta;
import com.google.gerrit.client.diff.LineMapper.LineOnOtherInfo;
import com.google.gerrit.client.patches.PatchUtil;
import com.google.gerrit.client.projects.ConfigInfoCache;
@@ -83,6 +85,18 @@
interface Binder extends UiBinder<FlowPanel, SideBySide2> {}
private static final Binder uiBinder = GWT.create(Binder.class);
+ enum FileSize {
+ SMALL(0),
+ LARGE(500),
+ HUGE(4000);
+
+ final int lines;
+
+ FileSize(int n) {
+ this.lines = n;
+ }
+ }
+
@UiField(provided = true)
Header header;
@@ -102,8 +116,9 @@
private Element columnMarginA;
private Element columnMarginB;
private HandlerRegistration resizeHandler;
+ private ScrollSynchronizer scrollSynchronizer;
private DiffInfo diff;
- private boolean largeFile;
+ private FileSize fileSize;
private ChunkManager chunkManager;
private CommentManager commentManager;
private SkipManager skipManager;
@@ -162,9 +177,9 @@
@Override
public void onSuccess(DiffInfo diffInfo) {
diff = diffInfo;
+ fileSize = bucketFileSize(diffInfo);
if (prefs.syntaxHighlighting()) {
- largeFile = isLargeFile(diffInfo);
- if (largeFile) {
+ if (fileSize.compareTo(FileSize.SMALL) > 0) {
modeInjectorCb.onSuccess(null);
} else {
injectMode(diffInfo, modeInjectorCb);
@@ -187,7 +202,7 @@
info.revisions().copyKeysIntoChildren("name");
JsArray<RevisionInfo> list = info.revisions().values();
RevisionInfo.sortRevisionInfoByNumber(list);
- diffTable.setUpPatchSetNav(list, diff);
+ diffTable.set(list, diff);
header.setChangeInfo(info);
}}));
@@ -231,13 +246,18 @@
}
});
setLineLength(prefs.lineLength());
- diffTable.overview.refresh();
+ diffTable.refresh();
- if (startLine == 0 && diff.meta_b() != null) {
+ if (startLine == 0) {
DiffChunkInfo d = chunkManager.getFirst();
if (d != null) {
- startSide = d.getSide();
- startLine = d.getStart() + 1;
+ if (d.isEdit() && d.getSide() == DisplaySide.A) {
+ startSide = DisplaySide.B;
+ startLine = lineOnOther(d.getSide(), d.getStart()).getLine() + 1;
+ } else {
+ startSide = d.getSide();
+ startLine = d.getStart() + 1;
+ }
}
}
if (startSide != null && startLine > 0) {
@@ -310,8 +330,9 @@
.on("C", commentManager.insertNewDraft(cm))
.on("N", maybeNextVimSearch(cm))
.on("P", chunkManager.diffChunkNav(cm, Direction.PREV))
+ .on("Shift-A", diffTable.toggleA())
.on("Shift-M", header.reviewedAndNext())
- .on("Shift-N", commentManager.commentNav(cm, Direction.NEXT))
+ .on("Shift-N", maybePrevVimSearch(cm))
.on("Shift-P", commentManager.commentNav(cm, Direction.PREV))
.on("Shift-O", commentManager.openCloseAll(cm))
.on("Shift-Left", moveCursorToSide(cm, DisplaySide.A))
@@ -404,6 +425,9 @@
keysNavigation.add(new UpToChangeCommand2(revision, 0, 'u'));
keysNavigation.add(
+ new NoOpKeyCommand(KeyCommand.M_SHIFT, KeyCodes.KEY_LEFT, PatchUtil.C.focusSideA()),
+ new NoOpKeyCommand(KeyCommand.M_SHIFT, KeyCodes.KEY_RIGHT, PatchUtil.C.focusSideB()));
+ keysNavigation.add(
new NoOpKeyCommand(0, 'j', PatchUtil.C.lineNext()),
new NoOpKeyCommand(0, 'k', PatchUtil.C.linePrev()));
keysNavigation.add(
@@ -440,6 +464,13 @@
upToChange(true).run();
}
});
+ keysAction.add(new KeyCommand(
+ KeyCommand.M_SHIFT, 'a', PatchUtil.C.toggleSideA()) {
+ @Override
+ public void onKeyPress(KeyPressEvent event) {
+ diffTable.toggleA().run();
+ }
+ });
keysAction.add(new KeyCommand(0, ',', PatchUtil.C.showPreferences()) {
@Override
public void onKeyPress(KeyPressEvent event) {
@@ -468,11 +499,11 @@
}
removeKeyHandlerRegistrations();
+ handlers.add(GlobalKey.add(this, keysAction));
handlers.add(GlobalKey.add(this, keysNavigation));
if (keysComment != null) {
handlers.add(GlobalKey.add(this, keysComment));
}
- handlers.add(GlobalKey.add(this, keysAction));
handlers.add(ShowHelpCommand.addFocusHandler(new FocusHandler() {
@Override
public void onFocus(FocusEvent event) {
@@ -502,6 +533,11 @@
cmA.getMoverElement().appendChild(columnMarginA);
cmB.getMoverElement().appendChild(columnMarginB);
+ if (prefs.renderEntireFile() && !canEnableRenderEntireFile(prefs)) {
+ // CodeMirror is too slow to layout an entire huge file.
+ prefs.renderEntireFile(false);
+ }
+
operation(new Runnable() {
public void run() {
// Estimate initial CM3 height, fixed up in onShowView.
@@ -518,12 +554,13 @@
registerCmEvents(cmA);
registerCmEvents(cmB);
- new ScrollSynchronizer(diffTable, cmA, cmB, chunkManager.getLineMapper());
+ scrollSynchronizer = new ScrollSynchronizer(diffTable, cmA, cmB,
+ chunkManager.getLineMapper());
prefsAction = new PreferencesAction(this, prefs);
header.init(prefsAction);
- if (largeFile && prefs.syntaxHighlighting()) {
+ if (prefs.syntaxHighlighting() && fileSize.compareTo(FileSize.SMALL) > 0) {
Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
@Override
public boolean execute() {
@@ -541,13 +578,16 @@
String contents,
DisplaySide side,
Element parent) {
+ String mode = fileSize == FileSize.SMALL
+ ? getContentType(meta)
+ : null;
return CodeMirror.create(side, parent, Configuration.create()
.set("readOnly", true)
.set("cursorBlinkRate", 0)
.set("cursorHeight", 0.85)
.set("lineNumbers", prefs.showLineNumbers())
.set("tabSize", prefs.tabSize())
- .set("mode", largeFile ? null : getContentType(meta))
+ .set("mode", mode)
.set("lineWrapping", false)
.set("styleSelectedText", true)
.set("showTrailingSpace", prefs.showWhitespaceErrors())
@@ -561,6 +601,15 @@
return diff.intraline_status();
}
+ boolean canEnableRenderEntireFile(DiffPreferences prefs) {
+ return fileSize.compareTo(FileSize.HUGE) < 0
+ || (prefs.context() != WHOLE_FILE_CONTEXT && prefs.context() < 100);
+ }
+
+ String getContentType() {
+ return getContentType(diff.meta_b());
+ }
+
void setThemeStyles(boolean d) {
if (d) {
diffTable.addStyleName(DiffTable.style.dark());
@@ -781,6 +830,19 @@
};
}
+ private Runnable maybePrevVimSearch(final CodeMirror cm) {
+ return new Runnable() {
+ @Override
+ public void run() {
+ if (cm.hasVimSearchHighlight()) {
+ CodeMirror.handleVimKey(cm, "N");
+ } else {
+ commentManager.commentNav(cm, Direction.NEXT).run();
+ }
+ }
+ };
+ }
+
private Runnable maybeNextVimSearch(final CodeMirror cm) {
return new Runnable() {
@Override
@@ -821,6 +883,10 @@
return Window.getClientHeight() - rest;
}
+ void syncScroll(DisplaySide masterSide) {
+ scrollSynchronizer.syncScroll(masterSide);
+ }
+
private String getContentType(DiffInfo.FileMeta meta) {
return prefs.syntaxHighlighting()
&& meta != null
@@ -918,8 +984,17 @@
});
}
- private static boolean isLargeFile(DiffInfo diffInfo) {
- return (diffInfo.meta_a() != null && diffInfo.meta_a().lines() > 500)
- || (diffInfo.meta_b() != null && diffInfo.meta_b().lines() > 500);
+ private static FileSize bucketFileSize(DiffInfo diff) {
+ FileMeta a = diff.meta_a();
+ FileMeta b = diff.meta_b();
+ FileSize[] sizes = FileSize.values();
+ for (int i = sizes.length - 1; 0 <= i; i--) {
+ FileSize s = sizes[i];
+ if ((a != null && s.lines <= a.lines())
+ || (b != null && s.lines <= b.lines())) {
+ return s;
+ }
+ }
+ return FileSize.SMALL;
}
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/extensions/TopMenuItem.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/extensions/TopMenuItem.java
index 22bb981..ba43068 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/extensions/TopMenuItem.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/extensions/TopMenuItem.java
@@ -17,11 +17,21 @@
import com.google.gwt.core.client.JavaScriptObject;
public class TopMenuItem extends JavaScriptObject {
+ public static TopMenuItem create(String name, String url) {
+ TopMenuItem i = createObject().cast();
+ i.name(name);
+ i.url(url);
+ return i;
+ }
+
public final native String getName() /*-{ return this.name; }-*/;
public final native String getUrl() /*-{ return this.url; }-*/;
public final native String getTarget() /*-{ return this.target; }-*/;
public final native String getId() /*-{ return this.id; }-*/;
+ public final native void name(String n) /*-{ this.name = n }-*/;
+ public final native void url(String u) /*-{ this.url = u }-*/;
+
protected TopMenuItem() {
}
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css b/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css
index 77daccf..3c811a8 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/gerrit.css
@@ -1628,3 +1628,13 @@
padding-top: 5px;
padding-left: 5px;
}
+
+/* StringListPanel */
+.stringListPanelButtons {
+ margin-left: 0.5em;
+}
+.stringListPanelButtons .gwt-Button {
+ margin-right: 2em;
+ font-size: 7pt;
+ padding: 1px;
+}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/listAdd.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/listAdd.png
new file mode 100644
index 0000000..1aa7f09
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/listAdd.png
Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.java
index ae0b786..9ff9893 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.java
@@ -49,9 +49,12 @@
String chunkNext2();
String commentPrev();
String commentNext();
+ String focusSideA();
+ String focusSideB();
String fileList();
String expandComment();
String expandAllCommentsOnCurrentLine();
+ String toggleSideA();
String toggleIntraline();
String showPreferences();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.properties
index 3e021c7..0a47613 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.properties
@@ -31,9 +31,12 @@
chunkNext2 = Next diff chunk or search result
commentPrev = Previous comment
commentNext = Next comment
+focusSideA = Focus left side
+focusSideB = Focus right side
fileList = Browse files in patch set
expandComment = Expand or collapse comment
expandAllCommentsOnCurrentLine = Expand or collapse all comments on current line
+toggleSideA = Toggle left side
toggleIntraline = Toggle intraline difference
showPreferences = Show diff preferences
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchSetSelectBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchSetSelectBox.java
index e45ee1f..083820b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchSetSelectBox.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchSetSelectBox.java
@@ -90,7 +90,7 @@
this.idSideA = idSideA;
this.idSideB = idSideB;
this.idActive = (side == Side.A) ? idSideA : idSideB;
- this.links = new HashMap<Integer, Anchor>();
+ this.links = new HashMap<>();
linkPanel.clear();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/BranchInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/BranchInfo.java
index 3f79afe..849863e 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/BranchInfo.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/BranchInfo.java
@@ -14,6 +14,8 @@
package com.google.gerrit.client.projects;
+import com.google.gerrit.client.actions.ActionInfo;
+import com.google.gerrit.client.rpc.NativeMap;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gwt.core.client.JavaScriptObject;
@@ -27,6 +29,7 @@
public final native String ref() /*-{ return this.ref; }-*/;
public final native String revision() /*-{ return this.revision; }-*/;
public final native boolean canDelete() /*-{ return this['can_delete'] ? true : false; }-*/;
+ public final native NativeMap<ActionInfo> actions() /*-{ return this.actions }-*/;
protected BranchInfo() {
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfo.java
index 1d6e6b2..e3c77b8 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfo.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ConfigInfo.java
@@ -17,9 +17,9 @@
import com.google.gerrit.client.ErrorDialog;
import com.google.gerrit.client.actions.ActionInfo;
import com.google.gerrit.client.rpc.NativeMap;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
+import com.google.gerrit.extensions.api.projects.ProjectState;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayString;
@@ -63,11 +63,11 @@
private final native String submit_typeRaw()
/*-{ return this.submit_type }-*/;
- public final Project.State state() {
+ public final ProjectState state() {
if (stateRaw() == null) {
- return Project.State.ACTIVE;
+ return ProjectState.ACTIVE;
}
- return Project.State.valueOf(stateRaw());
+ return ProjectState.valueOf(stateRaw());
}
private final native String stateRaw()
/*-{ return this.state }-*/;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java
index 63f7e15..4762027 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectApi.java
@@ -19,9 +19,10 @@
import com.google.gerrit.client.rpc.NativeMap;
import com.google.gerrit.client.rpc.NativeString;
import com.google.gerrit.client.rpc.RestApi;
+import com.google.gerrit.extensions.api.projects.ProjectState;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -85,7 +86,7 @@
InheritableBoolean useContributorAgreements,
InheritableBoolean useContentMerge, InheritableBoolean useSignedOffBy,
InheritableBoolean requireChangeId, String maxObjectSizeLimit,
- SubmitType submitType, Project.State state,
+ SubmitType submitType, ProjectState state,
Map<String, Map<String, ConfigParameterValue>> pluginConfigValues,
AsyncCallback<ConfigInfo> cb) {
ConfigInput in = ConfigInput.create();
@@ -217,7 +218,7 @@
private final native void setSubmitTypeRaw(String t)
/*-{ if(t)this.submit_type=t; }-*/;
- final void setState(Project.State s) {
+ final void setState(ProjectState s) {
setStateRaw(s.name());
}
private final native void setStateRaw(String s)
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectInfo.java
index cab45b5..048ebbd 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectInfo.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/projects/ProjectInfo.java
@@ -14,8 +14,11 @@
package com.google.gerrit.client.projects;
+import com.google.gerrit.client.WebLinkInfo;
+import com.google.gerrit.extensions.api.projects.ProjectState;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.core.client.JsArray;
import com.google.gwt.user.client.ui.SuggestOracle;
public class ProjectInfo
@@ -27,9 +30,10 @@
public final native String name() /*-{ return this.name; }-*/;
public final native String description() /*-{ return this.description; }-*/;
+ public final native JsArray<WebLinkInfo> web_links() /*-{ return this.web_links; }-*/;
- public final Project.State state() {
- return Project.State.valueOf(getStringState());
+ public final ProjectState state() {
+ return ProjectState.valueOf(getStringState());
}
private final native String getStringState() /*-{ return this.state; }-*/;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/RestApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/RestApi.java
index da620d8..2bc4ac1 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/RestApi.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/RestApi.java
@@ -327,7 +327,7 @@
private <T extends JavaScriptObject> void send(
Method method, AsyncCallback<T> cb) {
- HttpCallback<T> httpCallback = new HttpCallback<T>(background, cb);
+ HttpCallback<T> httpCallback = new HttpCallback<>(background, cb);
try {
if (!background) {
RpcStatus.INSTANCE.onRpcStart();
@@ -367,7 +367,7 @@
private <T extends JavaScriptObject> void sendJSON(
Method method, JavaScriptObject content,
AsyncCallback<T> cb) {
- HttpCallback<T> httpCallback = new HttpCallback<T>(background, cb);
+ HttpCallback<T> httpCallback = new HttpCallback<>(background, cb);
try {
if (!background) {
RpcStatus.INSTANCE.onRpcStart();
@@ -384,7 +384,7 @@
private <T extends JavaScriptObject> void sendRaw(Method method, String body,
AsyncCallback<T> cb) {
- HttpCallback<T> httpCallback = new HttpCallback<T>(background, cb);
+ HttpCallback<T> httpCallback = new HttpCallback<>(background, cb);
try {
if (!background) {
RpcStatus.INSTANCE.onRpcStart();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CherryPickDialog.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CherryPickDialog.java
index 1d5a74f..54c4c53 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CherryPickDialog.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/CherryPickDialog.java
@@ -50,8 +50,7 @@
newBranch = new SuggestBox(new HighlightSuggestOracle() {
@Override
protected void onRequestSuggestions(Request request, Callback done) {
- LinkedList<BranchSuggestion> suggestions =
- new LinkedList<BranchSuggestion>();
+ LinkedList<BranchSuggestion> suggestions = new LinkedList<>();
for (final BranchInfo b : branches) {
if (b.ref().contains(request.getQuery())) {
suggestions.add(new BranchSuggestion(b));
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/LinkMenuBar.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/LinkMenuBar.java
index bc88eed..deca808 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/LinkMenuBar.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/LinkMenuBar.java
@@ -41,10 +41,12 @@
}
public void addItem(final LinkMenuItem i) {
+ i.setMenuBar(this);
add(i);
}
public void insertItem(final LinkMenuItem i, int beforeIndex) {
+ i.setMenuBar(this);
insert(i, beforeIndex);
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/LinkMenuItem.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/LinkMenuItem.java
index 20569c3..29c053b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/LinkMenuItem.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/LinkMenuItem.java
@@ -19,6 +19,8 @@
import com.google.gwt.dom.client.AnchorElement;
public class LinkMenuItem extends InlineHyperlink implements ScreenLoadHandler {
+ private LinkMenuBar bar;
+
public LinkMenuItem(final String text, final String targetHistoryToken) {
super(text, targetHistoryToken);
setStyleName(Gerrit.RESOURCES.css().menuItem());
@@ -32,11 +34,20 @@
AnchorElement.as(getElement()).blur();
}
+ public void setMenuBar(LinkMenuBar bar) {
+ this.bar = bar;
+ }
+
public void onScreenLoad(ScreenLoadEvent event) {
- if (event.getScreen().getToken().equals(getTargetHistoryToken())){
+ if (match(event.getScreen().getToken())) {
+ Gerrit.selectMenu(bar);
addStyleName(Gerrit.RESOURCES.css().activeRow());
} else {
removeStyleName(Gerrit.RESOURCES.css().activeRow());
}
}
+
+ protected boolean match(String token) {
+ return token.equals(getTargetHistoryToken());
+ }
}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectLinkMenuItem.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectLinkMenuItem.java
new file mode 100644
index 0000000..2917505
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectLinkMenuItem.java
@@ -0,0 +1,47 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.client.ui;
+
+import com.google.gerrit.client.Dispatcher;
+import com.google.gerrit.client.admin.ProjectScreen;
+import com.google.gerrit.reviewdb.client.Project;
+
+public class ProjectLinkMenuItem extends LinkMenuItem {
+ private final String panel;
+
+ public ProjectLinkMenuItem(String text, String panel) {
+ super(text, "");
+ this.panel = panel;
+ }
+
+ @Override
+ public void onScreenLoad(ScreenLoadEvent event) {
+ Screen screen = event.getScreen();
+ Project.NameKey projectKey;
+ if (screen instanceof ProjectScreen) {
+ projectKey = ((ProjectScreen)screen).getProjectKey();
+ } else {
+ projectKey = ProjectScreen.getSavedKey();
+ }
+
+ if (projectKey != null) {
+ setVisible(true);
+ setTargetHistoryToken(Dispatcher.toProjectAdmin(projectKey, panel));
+ } else {
+ setVisible(false);
+ }
+ super.onScreenLoad(event);
+ }
+}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ScreenLoadEvent.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ScreenLoadEvent.java
index 562e53a..45ba808 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ScreenLoadEvent.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ScreenLoadEvent.java
@@ -24,7 +24,7 @@
this.screen = screen;
}
- public static final Type<ScreenLoadHandler> TYPE = new Type<ScreenLoadHandler>();
+ public static final Type<ScreenLoadHandler> TYPE = new Type<>();
@Override
protected void dispatch(ScreenLoadHandler handler) {
diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java
index 0e5f9a5..941ef7a 100644
--- a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java
+++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java
@@ -57,6 +57,7 @@
this.setOption(option, val);
}-*/;
+ public final native String getStringOption(String o) /*-{ return this.getOption(o) }-*/;
public final native void setValue(String v) /*-{ this.setValue(v); }-*/;
public final native void setWidth(double w) /*-{ this.setSize(w, null); }-*/;
diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/ModeInjector.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/ModeInjector.java
index 02faccb..3098c43 100644
--- a/gerrit-gwtui/src/main/java/net/codemirror/lib/ModeInjector.java
+++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/ModeInjector.java
@@ -21,6 +21,7 @@
import net.codemirror.mode.Modes;
+import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -43,19 +44,37 @@
Modes.I.clike(),
Modes.I.clojure(),
Modes.I.commonlisp(),
+ Modes.I.coffeescript(),
Modes.I.css(),
+ Modes.I.d(),
+ Modes.I.diff(),
+ Modes.I.dtd(),
+ Modes.I.erlang(),
+ Modes.I.gas(),
+ Modes.I.gerrit_commit(),
+ Modes.I.gfm(),
Modes.I.go(),
Modes.I.groovy(),
+ Modes.I.haskell(),
Modes.I.htmlmixed(),
Modes.I.javascript(),
+ Modes.I.lua(),
+ Modes.I.markdown(),
Modes.I.perl(),
+ Modes.I.php(),
+ Modes.I.pig(),
Modes.I.properties(),
Modes.I.python(),
+ Modes.I.r(),
Modes.I.ruby(),
+ Modes.I.scheme(),
Modes.I.shell(),
+ Modes.I.smalltalk(),
Modes.I.sql(),
Modes.I.velocity(),
+ Modes.I.verilog(),
Modes.I.xml(),
+ Modes.I.yaml(),
};
mimeAlias = new HashMap<>();
@@ -94,6 +113,10 @@
return real != null ? real : mode;
}
+ public static Collection<String> getKnownMimeTypes() {
+ return mimeModes.keySet();
+ }
+
private static native boolean isModeLoaded(String n)
/*-{ return $wnd.CodeMirror.modes.hasOwnProperty(n); }-*/;
diff --git a/gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java b/gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java
index 307403a..d51479f 100644
--- a/gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java
+++ b/gerrit-gwtui/src/main/java/net/codemirror/mode/Modes.java
@@ -27,19 +27,38 @@
@Source("clike/clike.js") @DoNotEmbed DataResource clike();
@Source("clojure/clojure.js") @DoNotEmbed DataResource clojure();
@Source("commonlisp/commonlisp.js") @DoNotEmbed DataResource commonlisp();
+ @Source("coffeescript/coffeescript.js") @DoNotEmbed DataResource coffeescript();
@Source("css/css.js") @DoNotEmbed DataResource css();
+ @Source("d/d.js") @DoNotEmbed DataResource d();
+ @Source("diff/diff.js") @DoNotEmbed DataResource diff();
+ @Source("dtd/dtd.js") @DoNotEmbed DataResource dtd();
+ @Source("erlang/erlang.js") @DoNotEmbed DataResource erlang();
+ @Source("gas/gas.js") @DoNotEmbed DataResource gas();
+ @Source("gerrit/commit.js") @DoNotEmbed DataResource gerrit_commit();
+ @Source("gfm/gfm.js") @DoNotEmbed DataResource gfm();
@Source("go/go.js") @DoNotEmbed DataResource go();
@Source("groovy/groovy.js") @DoNotEmbed DataResource groovy();
+ @Source("haskell/haskell.js") @DoNotEmbed DataResource haskell();
@Source("htmlmixed/htmlmixed.js") @DoNotEmbed DataResource htmlmixed();
@Source("javascript/javascript.js") @DoNotEmbed DataResource javascript();
+ @Source("lua/lua.js") @DoNotEmbed DataResource lua();
+ @Source("markdown/markdown.js") @DoNotEmbed DataResource markdown();
@Source("perl/perl.js") @DoNotEmbed DataResource perl();
+ @Source("php/php.js") @DoNotEmbed DataResource php();
+ @Source("pig/pig.js") @DoNotEmbed DataResource pig();
@Source("properties/properties.js") @DoNotEmbed DataResource properties();
@Source("python/python.js") @DoNotEmbed DataResource python();
+ @Source("r/r.js") @DoNotEmbed DataResource r();
@Source("ruby/ruby.js") @DoNotEmbed DataResource ruby();
+ @Source("scheme/scheme.js") @DoNotEmbed DataResource scheme();
@Source("shell/shell.js") @DoNotEmbed DataResource shell();
+ @Source("smalltalk/smalltalk.js") @DoNotEmbed DataResource smalltalk();
@Source("sql/sql.js") @DoNotEmbed DataResource sql();
+ @Source("tcl/tcl.js") @DoNotEmbed DataResource tcl();
@Source("velocity/velocity.js") @DoNotEmbed DataResource velocity();
+ @Source("verilog/verilog.js") @DoNotEmbed DataResource verilog();
@Source("xml/xml.js") @DoNotEmbed DataResource xml();
+ @Source("yaml/yaml.js") @DoNotEmbed DataResource yaml();
// When adding a resource, update static initializer in ModeInjector.
}
diff --git a/gerrit-gwtui/src/main/java/net/codemirror/mode/gerrit/commit.js b/gerrit-gwtui/src/main/java/net/codemirror/mode/gerrit/commit.js
new file mode 100644
index 0000000..a846e50
--- /dev/null
+++ b/gerrit-gwtui/src/main/java/net/codemirror/mode/gerrit/commit.js
@@ -0,0 +1,26 @@
+CodeMirror.defineMode('gerrit_commit', function() {
+ var header = /^(Parent|Author|AuthorDate|Commit|CommitDate):/;
+ var id = /^Change-Id: I[0-9a-f]{40}/;
+ var footer = /^[A-Z][A-Za-z0-9-]+:/;
+ var sha1 = /[0-9a-f]{6,40}/;
+
+ return {
+ token: function(stream) {
+ if (stream.sol()) {
+ if (stream.match(header))
+ return 'keyword';
+ if (stream.match(id) || stream.match(footer))
+ return 'builtin';
+ }
+
+ stream.eatSpace();
+ if (stream.match(sha1))
+ return 'variable-2';
+ if (stream.match(/".*"/))
+ return 'string';
+ stream.next();
+ return null;
+ }
+ };
+});
+CodeMirror.defineMIME('text/x-gerrit-commit-message', 'gerrit_commit');
diff --git a/gerrit-gwtui/src/main/java/net/codemirror/mode/mode_map b/gerrit-gwtui/src/main/java/net/codemirror/mode/mode_map
index c62920d..2bff364 100644
--- a/gerrit-gwtui/src/main/java/net/codemirror/mode/mode_map
+++ b/gerrit-gwtui/src/main/java/net/codemirror/mode/mode_map
@@ -11,6 +11,9 @@
clojure:
text/x-clojure
+coffeescript:
+text/x-coffeescript
+
commonlisp:
text/x-common-lisp
@@ -18,12 +21,36 @@
text/css
text/x-scss
+d:
+text/x-d
+
+diff:
+text/x-diff
+
+dtd:
+application/xml-dtd
+
+erlang:
+text/x-erlang
+
+gas:
+text/x-gas
+
+gerrit_commit:
+text/x-gerrit-commit-message
+
+gfm:
+text/x-github-markdown
+
go:
text/x-go
groovy:
text/x-groovy
+haskell:
+text/x-haskell
+
htmlmixed:
text/html
@@ -37,6 +64,12 @@
text/typescript
application/typescript
+lua:
+text/x-lua
+
+markdown:
+text/x-markdown
+
perl:
text/x-perl
@@ -47,30 +80,58 @@
perl:
text/x-perl
+php:
+application/x-httpd-php
+application/x-httpd-php-open
+text/x-php
+
+pig:
+text/x-pig
+
python:
text/x-python
+r:
+text/r-src
+
ruby:
text/x-ruby
+scheme:
+text/x-scheme
+
shell:
text/x-sh
application/x-shellscript
+smalltalk:
+text/x-stsrc
+
sql:
text/x-sql
text/x-mariadb
text/x-mysql
text/x-plsql
+tcl:
+text/x-tcl
+
velocity:
text/velocity
+verilog:
+text/x-verilog
+
xml:
text/xml
application/xml
+yaml:
+text/x-yaml
+
application/x-javascript = application/javascript
application/x-shellscript = text/x-sh
+application/x-tcl = text/x-tcl
text/x-h = text/x-c++hdr
text/x-java-source = text/x-java
+text/x-scripttcl = text/x-tcl
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java
index 402ea1b..11383ca 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java
@@ -50,7 +50,7 @@
protected void doGet(final HttpServletRequest req,
final HttpServletResponse rsp) throws IOException {
String query = CharMatcher.is('/').trimTrailingFrom(req.getPathInfo());
- HashSet<Change.Id> ids = new HashSet<Change.Id>();
+ HashSet<Change.Id> ids = new HashSet<>();
try {
ChangeQueryBuilder builder = queryBuilder.create(currentUser.get());
Predicate<ChangeData> visibleToMe = builder.is_visible();
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritConfigProvider.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritConfigProvider.java
index 7f6a2df..bbe6972 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritConfigProvider.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GerritConfigProvider.java
@@ -14,11 +14,16 @@
package com.google.gerrit.httpd;
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
import com.google.gerrit.common.data.GerritConfig;
import com.google.gerrit.common.data.GitwebConfig;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gerrit.server.account.Realm;
+import com.google.gerrit.server.change.ArchiveFormat;
+import com.google.gerrit.server.change.GetArchive;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.AnonymousCowardName;
import com.google.gerrit.server.config.AuthConfig;
@@ -46,6 +51,7 @@
private final Config cfg;
private final AuthConfig authConfig;
private final DownloadConfig downloadConfig;
+ private final GetArchive.AllowedFormats archiveFormats;
private final GitWebConfig gitWebConfig;
private final AllProjectsName wildProject;
private final SshInfo sshInfo;
@@ -60,11 +66,13 @@
final AuthConfig ac, final GitWebConfig gwc, final AllProjectsName wp,
final SshInfo si, final ContactStore cs,
final ServletContext sc, final DownloadConfig dc,
+ final GetArchive.AllowedFormats af,
final @AnonymousCowardName String acn) {
realm = r;
cfg = gsc;
authConfig = ac;
downloadConfig = dc;
+ archiveFormats = af;
gitWebConfig = gwc;
sshInfo = si;
wildProject = wp;
@@ -86,6 +94,7 @@
config.setRegisterUrl(cfg.getString("auth", null, "registerurl"));
config.setRegisterText(cfg.getString("auth", null, "registertext"));
config.setEditFullNameUrl(cfg.getString("auth", null, "editFullNameUrl"));
+ config.setHttpPasswordSettingsEnabled(!authConfig.isGitBasicAuth());
break;
case CUSTOM_EXTENSION:
@@ -127,6 +136,15 @@
"gerrit", null, "changeScreen",
AccountGeneralPreferences.ChangeScreen.CHANGE_SCREEN2));
config.setLargeChangeSize(cfg.getInt("change", "largeChange", 500));
+ config.setArchiveFormats(Lists.newArrayList(Iterables.transform(
+ archiveFormats.getAllowed(),
+ new Function<ArchiveFormat, String>() {
+ @Override
+ public String apply(ArchiveFormat in) {
+ return in.getShortName();
+ }
+ })));
+
config.setNewFeatures(cfg.getBoolean("gerrit", "enableNewFeatures", true));
final String reportBugUrl = cfg.getString("gerrit", null, "reportBugUrl");
@@ -134,9 +152,7 @@
reportBugUrl : "http://code.google.com/p/gerrit/issues/list");
config.setReportBugText(cfg.getString("gerrit", null, "reportBugText"));
- config.setGitBasicAuth(authConfig.isGitBasicAuth());
-
- final Set<Account.FieldName> fields = new HashSet<Account.FieldName>();
+ final Set<Account.FieldName> fields = new HashSet<>();
for (final Account.FieldName n : Account.FieldName.values()) {
if (realm.allowsEdit(n)) {
fields.add(n);
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java
index 03d54e4..24c2afa 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpServlet.java
@@ -356,7 +356,7 @@
if (isGet) {
cache.put(cacheKey, Collections.unmodifiableSet(
- new HashSet<ObjectId>(rp.getAdvertisedObjects())));
+ new HashSet<>(rp.getAdvertisedObjects())));
}
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java
index 0e41ef7..3a45089 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java
@@ -138,6 +138,14 @@
return false;
}
+ if (!authConfig.isLdapAuthType()
+ && !passwordMatchesTheUserGeneratedOne(who, username, password)) {
+ log.warn("Authentication failed for " + username
+ + ": password does not match the one stored in Gerrit");
+ rsp.sendError(SC_UNAUTHORIZED);
+ return false;
+ }
+
AuthRequest whoAuth = AuthRequest.forUser(username);
whoAuth.setPassword(password);
@@ -167,6 +175,13 @@
}
}
+ private boolean passwordMatchesTheUserGeneratedOne(AccountState who,
+ String username, String password) {
+ String accountPassword = who.getPassword(username);
+ return accountPassword != null && password != null
+ && accountPassword.equals(password);
+ }
+
private String encoding(HttpServletRequest req) {
return Objects.firstNonNull(req.getCharacterEncoding(), "UTF-8");
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java
index 45e4504..be22256 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java
@@ -231,7 +231,7 @@
}
private Map<String, String> parseAuthorization(String auth) {
- Map<String, String> p = new HashMap<String, String>();
+ Map<String, String> p = new HashMap<>();
int next = "Digest ".length();
while (next < auth.length()) {
if (next < auth.length() && auth.charAt(next) == ',') {
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 c2b0cc8..f831ab5 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
@@ -98,7 +98,7 @@
this.projectControl = projectControl;
this.anonymousUserProvider = anonymousUserProvider;
this.gitwebCgi = gitWebConfig.getGitwebCGI();
- this.deniedActions = new HashSet<String>();
+ this.deniedActions = new HashSet<>();
final String url = gitWebConfig.getUrl();
if ((url != null) && (!url.equals("gitweb"))) {
@@ -398,7 +398,7 @@
}
private static Map<String, String> getParameters(HttpServletRequest req) {
- final Map<String, String> params = new HashMap<String, String>();
+ final Map<String, String> params = new HashMap<>();
for (final String pair : req.getQueryString().split("[&;]")) {
final int eq = pair.indexOf('=');
if (0 < eq) {
@@ -669,11 +669,11 @@
private Map<String, String> envMap;
EnvList() {
- envMap = new HashMap<String, String>();
+ envMap = new HashMap<>();
}
EnvList(final EnvList l) {
- envMap = new HashMap<String, String>(l.envMap);
+ envMap = new HashMap<>(l.envMap);
}
/** Set a name/value pair, null values will be treated as an empty String */
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java
index fda2c0d..608aad6 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java
@@ -330,7 +330,7 @@
nocache.setAttribute("src", noCacheName);
opt = new Content(hostDoc);
- nocache.setAttribute("src", "gerrit_ui/gerrit_dbg.nocache.js");
+ nocache.setAttribute("src", "gerrit_ui/dbg_gerrit_ui.nocache.js");
debug = new Content(hostDoc);
}
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 ce450dc..2f41c94 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
@@ -206,7 +206,7 @@
RestResource rsrc = TopLevelResource.INSTANCE;
ViewData viewData = new ViewData(null, null);
if (path.isEmpty()) {
- if ("GET".equals(req.getMethod())) {
+ if (isGetOrHead(req)) {
viewData = new ViewData(null, rc.list());
} else if (rc instanceof AcceptsPost && "POST".equals(req.getMethod())) {
@SuppressWarnings("unchecked")
@@ -247,7 +247,7 @@
(RestCollection<RestResource, RestResource>) viewData.view;
if (path.isEmpty()) {
- if ("GET".equals(req.getMethod())) {
+ if (isGetOrHead(req)) {
viewData = new ViewData(null, c.list());
} else if (c instanceof AcceptsPost && "POST".equals(req.getMethod())) {
@SuppressWarnings("unchecked")
@@ -363,7 +363,7 @@
}
private static boolean notModified(HttpServletRequest req, RestResource rsrc) {
- if (!"GET".equals(req.getMethod())) {
+ if (!isGetOrHead(req)) {
return false;
}
@@ -386,7 +386,7 @@
private static <T> void configureCaching(HttpServletRequest req,
HttpServletResponse res, RestResource rsrc, CacheControl c) {
- if ("GET".equals(req.getMethod())) {
+ if (isGetOrHead(req)) {
switch (c.getType()) {
case NONE:
default:
@@ -716,11 +716,13 @@
res.setHeader("Content-Length", Long.toString(len));
}
- OutputStream dst = res.getOutputStream();
- try {
- bin.writeTo(dst);
- } finally {
- dst.close();
+ if (req == null || !"HEAD".equals(req.getMethod())) {
+ OutputStream dst = res.getOutputStream();
+ try {
+ bin.writeTo(dst);
+ } finally {
+ dst.close();
+ }
}
} finally {
appResult.close();
@@ -787,6 +789,8 @@
// is chosen, look for the projection based upon GET as the method as
// the client thinks it is a nested collection.
method = "GET";
+ } else if ("HEAD".equals(method)) {
+ method = "GET";
}
List<String> p = splitProjection(projection);
@@ -879,9 +883,12 @@
user.setAccessPath(AccessPath.REST_API);
}
+ private static boolean isGetOrHead(HttpServletRequest req) {
+ return "GET".equals(req.getMethod()) || "HEAD".equals(req.getMethod());
+ }
+
private static boolean isStateChange(HttpServletRequest req) {
- String method = req.getMethod();
- return !("GET".equals(method) || "HEAD".equals(method));
+ return !isGetOrHead(req);
}
private void checkRequiresCapability(ViewData viewData) throws AuthException {
@@ -913,12 +920,12 @@
CacheControl c) throws IOException {
res.setStatus(statusCode);
configureCaching(req, res, null, c);
- replyText(null, res, msg);
+ replyText(req, res, msg);
}
static void replyText(@Nullable HttpServletRequest req,
HttpServletResponse res, String text) throws IOException {
- if ((req == null || "GET".equals(req.getMethod())) && isMaybeHTML(text)) {
+ if ((req == null || isGetOrHead(req)) && isMaybeHTML(text)) {
replyJson(req, res, ImmutableMultimap.of("pp", "0"), new JsonPrimitive(text));
} else {
if (!text.endsWith("\n")) {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java
index ec96f0b..0b453a0 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java
@@ -51,9 +51,9 @@
final class GerritJsonServlet extends JsonServlet<GerritJsonServlet.GerritCall> {
private static final Logger log = LoggerFactory.getLogger(GerritJsonServlet.class);
private static final ThreadLocal<GerritCall> currentCall =
- new ThreadLocal<GerritCall>();
+ new ThreadLocal<>();
private static final ThreadLocal<MethodHandle> currentMethod =
- new ThreadLocal<MethodHandle>();
+ new ThreadLocal<>();
private final Provider<WebSession> session;
private final RemoteJsonService service;
private final AuditService audit;
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SuggestServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SuggestServiceImpl.java
index f8d43a8..dcd181c 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SuggestServiceImpl.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SuggestServiceImpl.java
@@ -137,8 +137,7 @@
final int max = 10;
final int n = limit <= 0 ? max : Math.min(limit, max);
- final LinkedHashMap<Account.Id, AccountInfo> r =
- new LinkedHashMap<Account.Id, AccountInfo>();
+ LinkedHashMap<Account.Id, AccountInfo> r = new LinkedHashMap<>();
for (final Account p : db.accounts().suggestByFullName(a, b, n)) {
addSuggestion(r, p, new AccountInfo(p), active, visibilityControl);
}
@@ -159,7 +158,7 @@
}
}
}
- return new ArrayList<AccountInfo>(r.values());
+ return new ArrayList<>(r.values());
}
private void addSuggestion(Map<Account.Id, AccountInfo> map, Account account,
@@ -251,7 +250,7 @@
final List<AccountInfo> suggestedAccounts =
suggestAccount(db, query, Boolean.TRUE, limit, visibilityControl);
final List<ReviewerInfo> reviewer =
- new ArrayList<ReviewerInfo>(suggestedAccounts.size());
+ new ArrayList<>(suggestedAccounts.size());
for (final AccountInfo a : suggestedAccounts) {
reviewer.add(new ReviewerInfo(a));
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java
index 931605c..56a6a50 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/SystemInfoServiceImpl.java
@@ -72,7 +72,7 @@
}
public void daemonHostKeys(final AsyncCallback<List<SshHostKey>> callback) {
- final ArrayList<SshHostKey> r = new ArrayList<SshHostKey>(hostKeys.size());
+ final ArrayList<SshHostKey> r = new ArrayList<>(hostKeys.size());
for (final HostKey hk : hostKeys) {
String host = hk.getHost();
if (host.startsWith("*:")) {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java
index 90357ae..bdb0028 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/AccountServiceImpl.java
@@ -113,8 +113,7 @@
final AsyncCallback<List<AccountProjectWatchInfo>> callback) {
run(callback, new Action<List<AccountProjectWatchInfo>>() {
public List<AccountProjectWatchInfo> run(ReviewDb db) throws OrmException {
- final List<AccountProjectWatchInfo> r =
- new ArrayList<AccountProjectWatchInfo>();
+ List<AccountProjectWatchInfo> r = new ArrayList<>();
for (final AccountProjectWatch w : db.accountProjectWatches()
.byAccount(getAccountId()).toList()) {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/DeleteExternalIds.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/DeleteExternalIds.java
index 12bc761..1d45c7d 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/DeleteExternalIds.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/DeleteExternalIds.java
@@ -63,7 +63,7 @@
public Set<AccountExternalId.Key> call() throws OrmException {
final Map<AccountExternalId.Key, AccountExternalId> have = have();
- List<AccountExternalId> toDelete = new ArrayList<AccountExternalId>();
+ List<AccountExternalId> toDelete = new ArrayList<>();
for (AccountExternalId.Key k : keys) {
final AccountExternalId id = have.get(k);
if (id != null && id.canDelete()) {
@@ -86,7 +86,7 @@
throws OrmException {
Map<AccountExternalId.Key, AccountExternalId> r;
- r = new HashMap<AccountExternalId.Key, AccountExternalId>();
+ r = new HashMap<>();
for (AccountExternalId i : detailFactory.call()) {
r.put(i.getKey(), i);
}
@@ -94,7 +94,7 @@
}
private Set<AccountExternalId.Key> toKeySet(List<AccountExternalId> toDelete) {
- Set<AccountExternalId.Key> r = new HashSet<AccountExternalId.Key>();
+ Set<AccountExternalId.Key> r = new HashSet<>();
for (AccountExternalId i : toDelete) {
r.add(i.getKey());
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PatchSetDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PatchSetDetailFactory.java
index fce8637..c4a8bb6 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PatchSetDetailFactory.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/PatchSetDetailFactory.java
@@ -138,7 +138,7 @@
}
final List<Patch> patches = list.toPatchList(patchSet.getId());
- final Map<Patch.Key, Patch> byKey = new HashMap<Patch.Key, Patch>();
+ final Map<Patch.Key, Patch> byKey = new HashMap<>();
for (final Patch p : patches) {
byKey.put(p.getKey(), p);
}
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 ee4439f..f0f93903 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
@@ -114,8 +114,8 @@
}
final RefControl metaConfigControl = pc.controlForRef(RefNames.REFS_CONFIG);
- List<AccessSection> local = new ArrayList<AccessSection>();
- Set<String> ownerOf = new HashSet<String>();
+ List<AccessSection> local = new ArrayList<>();
+ Set<String> ownerOf = new HashSet<>();
Map<AccountGroup.UUID, Boolean> visibleGroups = new HashMap<>();
for (AccessSection section : config.getAccessSections()) {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java
index b2b8bb3..52283b2 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java
@@ -185,7 +185,7 @@
}
private static Set<String> scanSectionNames(ProjectConfig config) {
- Set<String> names = new HashSet<String>();
+ Set<String> names = new HashSet<>();
for (AccessSection section : config.getAccessSections()) {
names.add(section.getName());
}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java
index 6537a6b..51aa2c0 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ReviewProjectAccess.java
@@ -182,7 +182,7 @@
private void insertAncestors(PatchSet.Id id, RevCommit src)
throws OrmException {
final int cnt = src.getParentCount();
- List<PatchSetAncestor> toInsert = new ArrayList<PatchSetAncestor>(cnt);
+ List<PatchSetAncestor> toInsert = new ArrayList<>(cnt);
for (int p = 0; p < cnt; p++) {
PatchSetAncestor a;
diff --git a/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java b/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java
index 33a3534..474b284 100644
--- a/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java
+++ b/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java
@@ -50,7 +50,7 @@
System.exit(mainImpl(argv));
}
- private static int mainImpl(final String argv[]) throws Exception {
+ public static int mainImpl(final String argv[]) throws Exception {
if (argv.length == 0) {
File me;
try {
@@ -192,7 +192,7 @@
throw e;
}
- final SortedMap<String, URL> jars = new TreeMap<String, URL>();
+ final SortedMap<String, URL> jars = new TreeMap<>();
try {
final ZipFile zf = new ZipFile(path);
try {
@@ -220,7 +220,7 @@
// The extension API needs to be its own ClassLoader, along
// with a few of its dependencies. Try to construct this first.
- List<URL> extapi = new ArrayList<URL>();
+ List<URL> extapi = new ArrayList<>();
move(jars, "gerrit-extension-api-", extapi);
move(jars, "guice-", extapi);
move(jars, "javax.inject-1.jar", extapi);
@@ -592,7 +592,7 @@
private static ClassLoader useDevClasspath()
throws MalformedURLException, FileNotFoundException {
File out = getDeveloperBuckOut();
- List<URL> dirs = new ArrayList<URL>();
+ List<URL> dirs = new ArrayList<>();
dirs.add(new File(new File(out, "eclipse"), "classes").toURI().toURL());
ClassLoader cl = GerritLauncher.class.getClassLoader();
for (URL u : ((URLClassLoader) cl).getURLs()) {
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 294aa35..c790740 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
@@ -125,14 +125,18 @@
Version lucene43 = Version.LUCENE_43;
@SuppressWarnings("deprecation")
Version lucene44 = Version.LUCENE_44;
+ @SuppressWarnings("deprecation")
+ Version lucene46 = Version.LUCENE_46;
for (Map.Entry<Integer, Schema<ChangeData>> e
: ChangeSchemas.ALL.entrySet()) {
if (e.getKey() <= 3) {
versions.put(e.getValue(), lucene43);
} else if (e.getKey() <= 5) {
versions.put(e.getValue(), lucene44);
+ } else if (e.getKey() <= 8) {
+ versions.put(e.getValue(), lucene46);
} else {
- versions.put(e.getValue(), Version.LUCENE_46);
+ versions.put(e.getValue(), Version.LUCENE_47);
}
}
LUCENE_VERSIONS = versions.build();
diff --git a/gerrit-pgm/BUCK b/gerrit-pgm/BUCK
index b7162ed..f76fa4c 100644
--- a/gerrit-pgm/BUCK
+++ b/gerrit-pgm/BUCK
@@ -4,7 +4,6 @@
'init/AllProjectsConfig.java',
'init/AllProjectsNameOnInitProvider.java',
'util/ConsoleUI.java',
- 'util/Die.java',
'init/InitFlags.java',
'init/InitStep.java',
'init/InitStep.java',
@@ -116,6 +115,7 @@
'//lib/guice:guice-servlet',
'//lib/jetty:server',
'//lib/jetty:servlet',
+ '//lib/jetty:jmx',
'//lib/jgit:jgit',
'//lib/log:api',
'//lib/log:log4j',
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/BaseInit.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/BaseInit.java
index 76adadc..bacdd2d 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/BaseInit.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/BaseInit.java
@@ -19,13 +19,13 @@
import com.google.common.base.Objects;
import com.google.common.collect.Lists;
+import com.google.gerrit.common.Die;
import com.google.gerrit.pgm.init.InitFlags;
import com.google.gerrit.pgm.init.InitModule;
import com.google.gerrit.pgm.init.InstallPlugins;
import com.google.gerrit.pgm.init.PluginsDistribution;
import com.google.gerrit.pgm.init.SitePathInitializer;
import com.google.gerrit.pgm.util.ConsoleUI;
-import com.google.gerrit.pgm.util.Die;
import com.google.gerrit.pgm.util.SiteProgram;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.SitePath;
@@ -185,7 +185,7 @@
private SiteInit createSiteInit() {
final ConsoleUI ui = getConsoleUI();
final File sitePath = getSitePath();
- final List<Module> m = new ArrayList<Module>();
+ final List<Module> m = new ArrayList<>();
m.add(new InitModule(standalone, initDb));
m.add(new AbstractModule() {
@@ -250,7 +250,7 @@
}
void upgradeSchema() throws OrmException {
- final List<String> pruneList = new ArrayList<String>();
+ final List<String> pruneList = new ArrayList<>();
schemaUpdater.update(new UpdateUI() {
@Override
public void message(String msg) {
@@ -316,7 +316,7 @@
}
private Injector createSysInjector(final SiteInit init) {
- final List<Module> modules = new ArrayList<Module>();
+ final List<Module> modules = new ArrayList<>();
modules.add(new AbstractModule() {
@Override
protected void configure() {
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 9d10e66..1776a39 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
@@ -303,13 +303,13 @@
}
private Injector createCfgInjector() {
- final List<Module> modules = new ArrayList<Module>();
+ final List<Module> modules = new ArrayList<>();
modules.add(new AuthConfigModule());
return dbInjector.createChildInjector(modules);
}
private Injector createSysInjector() {
- final List<Module> modules = new ArrayList<Module>();
+ final List<Module> modules = new ArrayList<>();
modules.add(SchemaVersionCheck.module());
modules.add(new LogFileCompressor.Module());
modules.add(new WorkQueue.Module());
@@ -376,7 +376,7 @@
}
private Injector createSshInjector() {
- final List<Module> modules = new ArrayList<Module>();
+ final List<Module> modules = new ArrayList<>();
modules.add(sysInjector.getInstance(SshModule.class));
if (!test) {
modules.add(new SshHostKeyModule());
@@ -401,7 +401,7 @@
}
private Injector createWebInjector() {
- final List<Module> modules = new ArrayList<Module>();
+ final List<Module> modules = new ArrayList<>();
if (sshd) {
modules.add(new ProjectQoSFilter.Module());
}
@@ -429,7 +429,7 @@
}
private Injector createHttpdInjector() {
- final List<Module> modules = new ArrayList<Module>();
+ final List<Module> modules = new ArrayList<>();
modules.add(new JettyModule(new JettyEnv(webInjector)));
return webInjector.createChildInjector(modules);
}
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 fa77732..c30507f 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
@@ -18,9 +18,9 @@
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.gerrit.common.PageLinks;
+import com.google.gerrit.common.PluginData;
import com.google.gerrit.pgm.init.Browser;
import com.google.gerrit.pgm.init.InitPlugins;
-import com.google.gerrit.pgm.init.InitPlugins.PluginData;
import com.google.gerrit.pgm.util.ConsoleUI;
import com.google.gerrit.pgm.util.ErrorLogFile;
import com.google.gerrit.pgm.util.IoUtil;
@@ -36,8 +36,8 @@
import java.io.File;
import java.io.IOException;
-import java.util.List;
import java.util.ArrayList;
+import java.util.List;
/** Initialize a new Gerrit installation. */
public class Init extends BaseInit {
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java
index 323d7f28..d208a3c 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/LocalUsernamesToLowerCase.java
@@ -70,7 +70,7 @@
db.close();
}
- final List<Worker> workers = new ArrayList<Worker>(threads);
+ final List<Worker> workers = new ArrayList<>(threads);
for (int tid = 0; tid < threads; tid++) {
Worker t = new Worker();
t.start();
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java
index 4c66f0b..fa434a6 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/PrologShell.java
@@ -33,7 +33,7 @@
public class PrologShell extends AbstractProgram {
@Option(name = "-s", metaVar = "FILE.pl", usage = "file to load")
- private List<String> fileName = new ArrayList<String>();
+ private List<String> fileName = new ArrayList<>();
@Override
public int run() {
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 e712caa..6d93dcd 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
@@ -17,12 +17,14 @@
import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
import static com.google.inject.Scopes.SINGLETON;
+import com.google.common.cache.Cache;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.DisabledChangeHooks;
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.lifecycle.LifecycleManager;
import com.google.gerrit.lifecycle.LifecycleModule;
@@ -41,7 +43,7 @@
import com.google.gerrit.server.account.GroupIncludeCacheImpl;
import com.google.gerrit.server.cache.CacheRemovalListener;
import com.google.gerrit.server.cache.h2.DefaultCacheFactory;
-import com.google.gerrit.server.change.ChangeKindCache;
+import com.google.gerrit.server.change.ChangeKindCacheImpl;
import com.google.gerrit.server.change.MergeabilityChecker;
import com.google.gerrit.server.change.MergeabilityChecksExecutor;
import com.google.gerrit.server.change.MergeabilityChecksExecutor.Priority;
@@ -198,6 +200,8 @@
// once, so don't worry about cache removal.
bind(new TypeLiteral<DynamicSet<CacheRemovalListener>>() {})
.toInstance(DynamicSet.<CacheRemovalListener> emptySet());
+ bind(new TypeLiteral<DynamicMap<Cache<?, ?>>>() {})
+ .toInstance(DynamicMap.<Cache<?, ?>> emptyMap());
bind(new TypeLiteral<List<CommentLinkInfo>>() {})
.toProvider(CommentLinkProvider.class).in(SINGLETON);
bind(String.class).annotatedWith(CanonicalWebUrl.class)
@@ -215,6 +219,7 @@
install(GroupIncludeCacheImpl.module());
install(ProjectCacheImpl.module());
install(SectionSortCache.module());
+ install(ChangeKindCacheImpl.module());
factory(CapabilityControl.Factory.class);
factory(ChangeData.Factory.class);
factory(ProjectState.Factory.class);
@@ -247,7 +252,7 @@
Key.get(new TypeLiteral<SchemaFactory<ReviewDb>>() {}));
final List<ReviewDb> dbs = Collections.synchronizedList(
Lists.<ReviewDb> newArrayListWithCapacity(threads + 1));
- final ThreadLocal<ReviewDb> localDb = new ThreadLocal<ReviewDb>();
+ final ThreadLocal<ReviewDb> localDb = new ThreadLocal<>();
bind(ReviewDb.class).toProvider(new Provider<ReviewDb>() {
@Override
@@ -293,9 +298,6 @@
DynamicSet.setOf(binder(), GitReferenceUpdatedListener.class);
DynamicSet.setOf(binder(), CommitValidationListener.class);
factory(CommitValidators.Factory.class);
-
- install(ChangeKindCache.module());
-
install(new GitModule());
install(new NoteDbModule());
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java
index cabdc64..17a54d4 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Rulec.java
@@ -47,7 +47,7 @@
private boolean quiet;
@Argument(index = 0, multiValued = true, metaVar = "PROJECT", usage = "project to compile rules for")
- private List<String> projectNames = new ArrayList<String>();
+ private List<String> projectNames = new ArrayList<>();
private Injector dbInjector;
@@ -71,7 +71,7 @@
}
}).injectMembers(this);
- LinkedHashSet<Project.NameKey> names = new LinkedHashSet<Project.NameKey>();
+ LinkedHashSet<Project.NameKey> names = new LinkedHashSet<>();
for (String name : projectNames) {
names.add(new Project.NameKey(name));
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
index 067eeab..31d75f1 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
@@ -39,6 +39,7 @@
import com.google.inject.servlet.GuiceServletContextListener;
import org.eclipse.jetty.http.HttpScheme;
+import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.ForwardedRequestCustomizer;
import org.eclipse.jetty.server.Handler;
@@ -58,6 +59,7 @@
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.BlockingArrayQueue;
+import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
@@ -75,6 +77,7 @@
import java.io.InputStream;
import java.io.InterruptedIOException;
import java.io.PrintWriter;
+import java.lang.management.ManagementFactory;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
@@ -171,6 +174,13 @@
handler.setHandler(app);
app = handler;
}
+ if (cfg.getBoolean("httpd", "registerMBeans", false)) {
+ MBeanContainer mbean =
+ new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
+ httpd.addEventListener(mbean);
+ httpd.addBean(Log.getRootLogger());
+ httpd.addBean(mbean);
+ }
httpd.setHandler(app);
httpd.setStopAtShutdown(false);
@@ -361,7 +371,7 @@
private Handler makeContext(final JettyEnv env, final Config cfg)
throws MalformedURLException, IOException {
- final Set<String> paths = new HashSet<String>();
+ final Set<String> paths = new HashSet<>();
for (URI u : listenURLs(cfg)) {
String p = u.getPath();
if (p == null || p.isEmpty()) {
@@ -373,7 +383,7 @@
paths.add(p);
}
- final List<ContextHandler> all = new ArrayList<ContextHandler>();
+ final List<ContextHandler> all = new ArrayList<>();
for (String path : paths) {
all.add(makeContext(path, env, cfg));
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AllUsersNameOnInitProvider.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AllUsersNameOnInitProvider.java
new file mode 100644
index 0000000..4c65218a
--- /dev/null
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/AllUsersNameOnInitProvider.java
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.pgm.init;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Strings;
+import com.google.gerrit.server.config.AllUsersNameProvider;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+public class AllUsersNameOnInitProvider implements Provider<String> {
+ private final String name;
+
+ @Inject
+ AllUsersNameOnInitProvider(Section.Factory sections) {
+ String n = sections.get("gerrit", null).get("allUsers");
+ name = Objects.firstNonNull(
+ Strings.emptyToNull(n), AllUsersNameProvider.DEFAULT);
+ }
+
+ public String get() {
+ return name;
+ }
+}
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 699daa8..8929a7b 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
@@ -14,7 +14,7 @@
package com.google.gerrit.pgm.init;
-import static com.google.gerrit.pgm.init.InitUtil.chmod;
+import static com.google.gerrit.common.FileUtil.chmod;
import static com.google.gerrit.pgm.init.InitUtil.die;
import static com.google.gerrit.pgm.init.InitUtil.domainOf;
import static com.google.gerrit.pgm.init.InitUtil.isAnyAddress;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java
index 5584cf3..1b8600d 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPluginStepsLoader.java
@@ -54,7 +54,7 @@
public Collection<InitStep> getInitSteps() {
List<File> jars = scanJarsInPluginsDirectory();
- ArrayList<InitStep> pluginsInitSteps = new ArrayList<InitStep>();
+ ArrayList<InitStep> pluginsInitSteps = new ArrayList<>();
for (File jar : jars) {
InitStep init = loadInitStep(jar);
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java
index e5f6f56..b952a8c 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitPlugins.java
@@ -15,6 +15,7 @@
package com.google.gerrit.pgm.init;
import com.google.common.collect.Lists;
+import com.google.gerrit.common.PluginData;
import com.google.gerrit.pgm.util.ConsoleUI;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.plugins.PluginLoader;
@@ -34,18 +35,6 @@
public static final String PLUGIN_DIR = "WEB-INF/plugins/";
public static final String JAR = ".jar";
- public static class PluginData {
- public final String name;
- public final String version;
- public final File pluginFile;
-
- private PluginData(String name, String version, File pluginFile) {
- this.name = name;
- this.version = version;
- this.pluginFile = pluginFile;
- }
- }
-
public static List<PluginData> listPlugins(SitePaths site,
PluginsDistribution pluginsDistribution) throws IOException {
return listPlugins(site, false, pluginsDistribution);
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 66c2dd0b..9003b30 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
@@ -14,7 +14,7 @@
package com.google.gerrit.pgm.init;
-import static com.google.gerrit.pgm.init.InitUtil.chmod;
+import static com.google.gerrit.common.FileUtil.chmod;
import static com.google.gerrit.pgm.init.InitUtil.die;
import static com.google.gerrit.pgm.init.InitUtil.hostname;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitUtil.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitUtil.java
index dde0b06..7e06b5a 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitUtil.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitUtil.java
@@ -14,7 +14,10 @@
package com.google.gerrit.pgm.init;
-import com.google.gerrit.pgm.util.Die;
+import static com.google.gerrit.common.FileUtil.chmod;
+import static com.google.gerrit.common.FileUtil.modified;
+
+import com.google.gerrit.common.Die;
import org.eclipse.jgit.internal.storage.file.LockFile;
import org.eclipse.jgit.lib.Constants;
@@ -33,7 +36,6 @@
import java.net.URISyntaxException;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
-import java.util.Arrays;
/** Utility functions to help initialize a site. */
class InitUtil {
@@ -71,43 +73,12 @@
}
}
- private static boolean modified(FileBasedConfig cfg) throws IOException {
- byte[] curVers;
- try {
- curVers = IO.readFully(cfg.getFile());
- } catch (FileNotFoundException notFound) {
- return true;
- }
-
- byte[] newVers = Constants.encode(cfg.toText());
- return !Arrays.equals(curVers, newVers);
- }
-
static void mkdir(final File path) {
if (!path.isDirectory() && !path.mkdir()) {
throw die("Cannot make directory " + path);
}
}
- static void chmod(final int mode, final File path) {
- path.setReadable(false, false /* all */);
- path.setWritable(false, false /* all */);
- path.setExecutable(false, false /* all */);
-
- path.setReadable((mode & 0400) == 0400, true /* owner only */);
- path.setWritable((mode & 0200) == 0200, true /* owner only */);
- if (path.isDirectory() || (mode & 0100) == 0100) {
- path.setExecutable(true, true /* owner only */);
- }
-
- if ((mode & 0044) == 0044) {
- path.setReadable(true, false /* all */);
- }
- if ((mode & 0011) == 0011) {
- path.setExecutable(true, false /* all */);
- }
- }
-
static String version() {
return com.google.gerrit.common.Version.getVersion();
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java
index 9555abd..b943ca3 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/LibraryDownloader.java
@@ -16,8 +16,8 @@
import com.google.common.base.Strings;
import com.google.common.io.Files;
+import com.google.gerrit.common.Die;
import com.google.gerrit.pgm.util.ConsoleUI;
-import com.google.gerrit.pgm.util.Die;
import com.google.gerrit.pgm.util.IoUtil;
import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Section.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Section.java
index bbb1d9f..5cce4a2 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Section.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/Section.java
@@ -55,7 +55,7 @@
}
public void set(final String name, final String value) {
- final ArrayList<String> all = new ArrayList<String>();
+ final ArrayList<String> all = new ArrayList<>();
all.addAll(Arrays.asList(flags.cfg.getStringList(section, subsection, name)));
if (value != null) {
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java
index 82daf81..892a8a5 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java
@@ -14,7 +14,7 @@
package com.google.gerrit.pgm.init;
-import static com.google.gerrit.pgm.init.InitUtil.chmod;
+import static com.google.gerrit.common.FileUtil.chmod;
import static com.google.gerrit.pgm.init.InitUtil.die;
import static com.google.gerrit.pgm.init.InitUtil.extract;
import static com.google.gerrit.pgm.init.InitUtil.mkdir;
@@ -125,7 +125,7 @@
}
private static List<InitStep> stepsOf(final Injector injector) {
- final ArrayList<InitStep> r = new ArrayList<InitStep>();
+ final ArrayList<InitStep> r = new ArrayList<>();
for (Binding<InitStep> b : all(injector)) {
r.add(b.getProvider().get());
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/shell/JythonShell.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/shell/JythonShell.java
index 38f08c1..5b537ae 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/shell/JythonShell.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/shell/JythonShell.java
@@ -85,7 +85,7 @@
} catch (IllegalAccessException e) {
throw noInterpreter(e);
}
- injectedVariables = new ArrayList<String>();
+ injectedVariables = new ArrayList<>();
set("Shell", this);
}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/AbstractProgram.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/AbstractProgram.java
index af65170..31fa7dd 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/AbstractProgram.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/AbstractProgram.java
@@ -15,6 +15,7 @@
package com.google.gerrit.pgm.util;
+import com.google.gerrit.common.Die;
import com.google.gerrit.util.cli.CmdLineParser;
import com.google.gerrit.util.cli.OptionHandlers;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ConsoleUI.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ConsoleUI.java
index 9af95ab..3cbf047 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ConsoleUI.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ConsoleUI.java
@@ -16,6 +16,8 @@
import static org.eclipse.jgit.util.StringUtils.equalsIgnoreCase;
+import com.google.gerrit.common.Die;
+
import java.io.Console;
import java.lang.reflect.InvocationTargetException;
import java.util.Set;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java
index da7704d..05c8f09 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java
@@ -14,6 +14,7 @@
package com.google.gerrit.pgm.util;
+import com.google.gerrit.common.Die;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.util.LogUtil;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GarbageCollectionLogFile.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GarbageCollectionLogFile.java
index 746355b..5cdf435 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GarbageCollectionLogFile.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GarbageCollectionLogFile.java
@@ -14,6 +14,7 @@
package com.google.gerrit.pgm.util;
+import com.google.gerrit.common.Die;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.git.GarbageCollection;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/RuntimeShutdown.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/RuntimeShutdown.java
index c00ad7f..40aaa75 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/RuntimeShutdown.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/RuntimeShutdown.java
@@ -46,7 +46,7 @@
private static final Logger log =
LoggerFactory.getLogger(ShutdownCallback.class);
- private final List<Runnable> tasks = new ArrayList<Runnable>();
+ private final List<Runnable> tasks = new ArrayList<>();
private boolean shutdownStarted;
private boolean shutdownComplete;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
index 11968db..3c60510 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
@@ -18,6 +18,7 @@
import static com.google.inject.Stage.PRODUCTION;
import com.google.common.collect.Lists;
+import com.google.gerrit.common.Die;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.server.config.GerritServerConfig;
@@ -89,7 +90,7 @@
/** @return provides database connectivity and site path. */
protected Injector createDbInjector(final DataSourceProvider.Context context) {
final File sitePath = getSitePath();
- final List<Module> modules = new ArrayList<Module>();
+ final List<Module> modules = new ArrayList<>();
Module sitePathModule = new AbstractModule() {
@Override
diff --git a/gerrit-plugin-api/BUCK b/gerrit-plugin-api/BUCK
index d808e0f..06e42fb 100644
--- a/gerrit-plugin-api/BUCK
+++ b/gerrit-plugin-api/BUCK
@@ -59,4 +59,5 @@
'//lib/bouncycastle:bcpg',
],
visibility = ['PUBLIC'],
+ do_it_wrong = True,
)
diff --git a/gerrit-plugin-archetype/pom.xml b/gerrit-plugin-archetype/pom.xml
index 401f126..8c7e261 100644
--- a/gerrit-plugin-archetype/pom.xml
+++ b/gerrit-plugin-archetype/pom.xml
@@ -20,7 +20,7 @@
<groupId>com.google.gerrit</groupId>
<artifactId>gerrit-plugin-archetype</artifactId>
- <version>2.9-SNAPSHOT</version>
+ <version>2.10-SNAPSHOT</version>
<name>Gerrit Code Review - Plugin Archetype</name>
<properties>
diff --git a/gerrit-plugin-gwt-archetype/pom.xml b/gerrit-plugin-gwt-archetype/pom.xml
index 56e6c95..09f70e8 100644
--- a/gerrit-plugin-gwt-archetype/pom.xml
+++ b/gerrit-plugin-gwt-archetype/pom.xml
@@ -20,7 +20,7 @@
<groupId>com.google.gerrit</groupId>
<artifactId>gerrit-plugin-gwt-archetype</artifactId>
- <version>2.9-SNAPSHOT</version>
+ <version>2.10-SNAPSHOT</version>
<name>Gerrit Code Review - Web Ui GWT Plugin Archetype</name>
<properties>
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/gerrit-plugin-gwt-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml
index f619f91..3fa83f4 100644
--- a/gerrit-plugin-gwt-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml
+++ b/gerrit-plugin-gwt-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -25,7 +25,7 @@
<defaultValue>http://code.google.com/p/gerrit/</defaultValue>
</requiredProperty>
<requiredProperty key="Gwt-Version">
- <defaultValue>2.5.1</defaultValue>
+ <defaultValue>2.6.0</defaultValue>
</requiredProperty>
<requiredProperty key="gerritApiVersion">
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/HelloMenu.java b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/HelloMenu.java
index 0baa044..f3c8dea 100644
--- a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/HelloMenu.java
+++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/HelloMenu.java
@@ -27,7 +27,7 @@
@Inject
public HelloMenu(@PluginName String pluginName) {
- menuEntries = new ArrayList<TopMenu.MenuEntry>();
+ menuEntries = new ArrayList<>();
menuEntries.add(new MenuEntry("Hello", Collections
.singletonList(new MenuItem("Hello Screen", "#/x/" + pluginName, ""))));
}
diff --git a/gerrit-plugin-gwtui/BUCK b/gerrit-plugin-gwtui/BUCK
index 8022bd1..d256049 100644
--- a/gerrit-plugin-gwtui/BUCK
+++ b/gerrit-plugin-gwtui/BUCK
@@ -51,8 +51,8 @@
name = 'gwtui-api-javadoc',
title = 'Gerrit Review GWT Extension API Documentation',
pkg = 'com.google.gerrit',
- paths = ['$SRCDIR/src/main/java'] + COMMON,
- srcs = SRCS + glob(COMMON),
- deps = DEPS + ['//gerrit-gwtui-common:client-src-lib'],
+ paths = ['src/main/java'] + COMMON,
+ srcs = SRCS,
+ deps = DEPS + ['//gerrit-gwtui-common:client-lib2'],
visibility = ['PUBLIC'],
)
diff --git a/gerrit-plugin-js-archetype/pom.xml b/gerrit-plugin-js-archetype/pom.xml
index eb32b11..b99130e 100644
--- a/gerrit-plugin-js-archetype/pom.xml
+++ b/gerrit-plugin-js-archetype/pom.xml
@@ -20,7 +20,7 @@
<groupId>com.google.gerrit</groupId>
<artifactId>gerrit-plugin-js-archetype</artifactId>
- <version>2.9-SNAPSHOT</version>
+ <version>2.10-SNAPSHOT</version>
<name>Gerrit Code Review - Web UI JavaScript Plugin Archetype</name>
<properties>
diff --git a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrettyFormatter.java b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrettyFormatter.java
index d4aef2a..ed42f10 100644
--- a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrettyFormatter.java
+++ b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/client/PrettyFormatter.java
@@ -125,7 +125,7 @@
public void format(SparseFileContent src) {
content = new SparseFileContent();
content.setSize(src.size());
- trailingEdits = new HashSet<Integer>();
+ trailingEdits = new HashSet<>();
String html = toHTML(src);
@@ -365,7 +365,7 @@
// in the source. That simplifies our loop below because we'll never
// run off the end of the edit list.
//
- List<Edit> edits = new ArrayList<Edit>(this.edits.size() + 1);
+ List<Edit> edits = new ArrayList<>(this.edits.size() + 1);
edits.addAll(this.edits);
edits.add(new Edit(src.size(), src.size()));
diff --git a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java
index aa08af0..b6e3bf9 100644
--- a/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java
+++ b/gerrit-prettify/src/main/java/com/google/gerrit/prettify/common/SparseFileContent.java
@@ -29,7 +29,7 @@
private transient int currentRangeIdx;
public SparseFileContent() {
- ranges = new ArrayList<Range>();
+ ranges = new ArrayList<>();
}
public int size() {
@@ -222,7 +222,7 @@
public SparseFileContent apply(SparseFileContent a, List<Edit> edits) {
EditList list = new EditList(edits, size, a.size(), size);
- ArrayList<String> lines = new ArrayList<String>(size);
+ ArrayList<String> lines = new ArrayList<>(size);
for (final EditList.Hunk hunk : list.getHunks()) {
while (hunk.next()) {
if (hunk.isContextLine()) {
@@ -277,7 +277,7 @@
private Range(final int b) {
base = b;
- lines = new ArrayList<String>();
+ lines = new ArrayList<>();
}
protected Range() {
diff --git a/gerrit-reviewdb/BUCK b/gerrit-reviewdb/BUCK
index b133f1a..370c869 100644
--- a/gerrit-reviewdb/BUCK
+++ b/gerrit-reviewdb/BUCK
@@ -5,6 +5,7 @@
srcs = glob([SRC + 'client/**/*.java']),
gwtxml = SRC + 'ReviewDB.gwt.xml',
compile_deps = [
+ '//gerrit-extension-api:client',
'//lib:gwtorm',
'//lib:gwtorm_src'
],
@@ -15,6 +16,9 @@
name = 'server',
srcs = glob([SRC + '**/*.java']),
resources = glob(['src/main/resources/**/*']),
- deps = ['//lib:gwtorm'],
+ deps = [
+ '//gerrit-extension-api:api',
+ '//lib:gwtorm',
+ ],
visibility = ['PUBLIC'],
)
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGeneralPreferences.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGeneralPreferences.java
index 2257ea2..82e4053 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGeneralPreferences.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGeneralPreferences.java
@@ -103,6 +103,12 @@
}
}
+ public static AccountGeneralPreferences createDefault() {
+ AccountGeneralPreferences p = new AccountGeneralPreferences();
+ p.resetToDefaults();
+ return p;
+ }
+
/** Number of changes to show in a screen. */
@Column(id = 2)
protected short maximumPageSize;
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/InheritedBoolean.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/InheritedBoolean.java
index 954b494..b5cef60 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/InheritedBoolean.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/InheritedBoolean.java
@@ -14,7 +14,7 @@
package com.google.gerrit.reviewdb.client;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
+import com.google.gerrit.extensions.common.InheritableBoolean;
public class InheritedBoolean {
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java
index 46e9b22..1114813 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Project.java
@@ -14,6 +14,9 @@
package com.google.gerrit.reviewdb.client;
+import com.google.gerrit.extensions.api.projects.ProjectState;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gwtorm.client.Column;
import com.google.gwtorm.client.StringKey;
@@ -65,32 +68,6 @@
}
}
- public static enum SubmitType {
- FAST_FORWARD_ONLY,
-
- MERGE_IF_NECESSARY,
-
- REBASE_IF_NECESSARY,
-
- MERGE_ALWAYS,
-
- CHERRY_PICK
- }
-
- public static enum State {
- ACTIVE,
-
- READ_ONLY,
-
- HIDDEN
- }
-
- public static enum InheritableBoolean {
- TRUE,
- FALSE,
- INHERIT
- }
-
protected NameKey name;
protected String description;
@@ -101,7 +78,7 @@
protected SubmitType submitType;
- protected State state;
+ protected ProjectState state;
protected NameKey parent;
@@ -123,7 +100,7 @@
public Project(Project.NameKey nameKey) {
name = nameKey;
submitType = SubmitType.MERGE_IF_NECESSARY;
- state = State.ACTIVE;
+ state = ProjectState.ACTIVE;
useContributorAgreements = InheritableBoolean.INHERIT;
useSignedOffBy = InheritableBoolean.INHERIT;
requireChangeID = InheritableBoolean.INHERIT;
@@ -194,11 +171,11 @@
submitType = type;
}
- public State getState() {
+ public ProjectState getState() {
return state;
}
- public void setState(final State newState) {
+ public void setState(final ProjectState newState) {
state = newState;
}
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RefNames.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RefNames.java
index ede5c26..968cfde 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RefNames.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/RefNames.java
@@ -14,6 +14,7 @@
package com.google.gerrit.reviewdb.client;
+
/** Constants and utilities for Gerrit-specific ref names. */
public class RefNames {
public static final String REFS_CHANGES = "refs/changes/";
@@ -24,6 +25,9 @@
/** Configuration settings for a project {@code refs/meta/config} */
public static final String REFS_CONFIG = "refs/meta/config";
+ /** Preference settings for a user {@code refs/users} */
+ public static final String REFS_USER = "refs/users/";
+
/** Configurations of project-specific dashboards (canned search queries). */
public static final String REFS_DASHBOARDS = "refs/meta/dashboards/";
@@ -39,6 +43,20 @@
*/
public static final String REFS_CACHE_AUTOMERGE = "refs/cache-automerge/";
+ public static String refsUsers(Account.Id accountId) {
+ StringBuilder r = new StringBuilder();
+ r.append(REFS_USER);
+ int account = accountId.get();
+ int m = account % 100;
+ if (m < 10) {
+ r.append('0');
+ }
+ r.append(m);
+ r.append('/');
+ r.append(account);
+ return r.toString();
+ }
+
private RefNames() {
}
}
diff --git a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_generic.sql b/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_generic.sql
index 165c8be..0b7f2c1 100644
--- a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_generic.sql
+++ b/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_generic.sql
@@ -101,6 +101,11 @@
-- *********************************************************************
+-- PatchSetAccess
+CREATE INDEX patch_sets_byRevision
+ON patch_sets (revision);
+
+-- *********************************************************************
-- PatchSetAncestorAccess
-- @PrimaryKey covers: ancestorsOf
-- covers: descendantsOf
diff --git a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql b/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
index ad92293..25e3fae 100644
--- a/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
+++ b/gerrit-reviewdb/src/main/resources/com/google/gerrit/reviewdb/server/index_postgres.sql
@@ -152,6 +152,11 @@
-- *********************************************************************
+-- PatchSetAccess
+CREATE INDEX patch_sets_byRevision
+ON patch_sets (revision);
+
+-- *********************************************************************
-- PatchSetAncestorAccess
-- @PrimaryKey covers: ancestorsOf
-- covers: descendantsOf
diff --git a/gerrit-server/BUCK b/gerrit-server/BUCK
index 070764a..a75967a 100644
--- a/gerrit-server/BUCK
+++ b/gerrit-server/BUCK
@@ -47,6 +47,7 @@
'//lib:parboiled-core',
'//lib:pegdown',
'//lib:protobuf',
+ '//lib:servlet-api-3_1',
'//lib:velocity',
'//lib/antlr:java_runtime',
'//lib/commons:codec',
@@ -101,6 +102,16 @@
'//lib/guice:guice-servlet',
'//lib/jgit:jgit',
'//lib/jgit:junit',
+ '//lib/log:impl_log4j',
+ '//lib/log:log4j',
+ ],
+ exported_deps = [
+ '//lib:easymock',
+ '//lib:powermock-api-easymock',
+ '//lib:powermock-api-support',
+ '//lib:powermock-core',
+ '//lib:powermock-module-junit4',
+ '//lib:powermock-module-junit4-common',
],
visibility = ['PUBLIC'],
)
@@ -188,15 +199,16 @@
'//gerrit-reviewdb:server',
'//gerrit-server/src/main/prolog:common',
'//lib:args4j',
- '//lib:easymock',
'//lib:guava',
'//lib:gwtorm',
'//lib:junit',
'//lib/guice:guice',
+ '//lib/guice:guice-assistedinject',
'//lib/jgit:jgit',
'//lib/jgit:junit',
'//lib/joda:joda-time',
'//lib/prolog:prolog-cafe',
],
source_under_test = [':server'],
+ visibility = ['//tools/eclipse:classpath'],
)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java
index 17940c0..1819272 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java
@@ -156,7 +156,7 @@
/** Listeners to receive changes as they happen (limited by visibility
* of holder's user). */
private final Map<ChangeListener, ChangeListenerHolder> listeners =
- new ConcurrentHashMap<ChangeListener, ChangeListenerHolder>();
+ new ConcurrentHashMap<>();
/** Listeners to receive all changes as they happen. */
private final DynamicSet<ChangeListener> unrestrictedListeners;
@@ -320,7 +320,7 @@
public HookResult doRefUpdateHook(final Project project, final String refname,
final Account uploader, final ObjectId oldId, final ObjectId newId) {
- final List<String> args = new ArrayList<String>();
+ final List<String> args = new ArrayList<>();
addArg(args, "--project", project.getName());
addArg(args, "--refname", refname);
addArg(args, "--uploader", getDisplayName(uploader));
@@ -349,16 +349,18 @@
final ReviewDb db) throws OrmException {
final PatchSetCreatedEvent event = new PatchSetCreatedEvent();
final AccountState uploader = accountCache.get(patchSet.getUploader());
+ final AccountState owner = accountCache.get(change.getOwner());
event.change = eventFactory.asChangeAttribute(change);
event.patchSet = eventFactory.asPatchSetAttribute(patchSet);
event.uploader = eventFactory.asAccountAttribute(uploader.getAccount());
fireEvent(change, event, db);
- final List<String> args = new ArrayList<String>();
+ final List<String> args = new ArrayList<>();
addArg(args, "--change", event.change.id);
addArg(args, "--is-draft", patchSet.isDraft() ? "true" : "false");
addArg(args, "--change-url", event.change.url);
+ addArg(args, "--change-owner", getDisplayName(owner.getAccount()));
addArg(args, "--project", event.change.project);
addArg(args, "--branch", event.change.branch);
addArg(args, "--topic", event.change.topic);
@@ -373,15 +375,17 @@
final ReviewDb db) throws OrmException {
final DraftPublishedEvent event = new DraftPublishedEvent();
final AccountState uploader = accountCache.get(patchSet.getUploader());
+ final AccountState owner = accountCache.get(change.getOwner());
event.change = eventFactory.asChangeAttribute(change);
event.patchSet = eventFactory.asPatchSetAttribute(patchSet);
event.uploader = eventFactory.asAccountAttribute(uploader.getAccount());
fireEvent(change, event, db);
- final List<String> args = new ArrayList<String>();
+ final List<String> args = new ArrayList<>();
addArg(args, "--change", event.change.id);
addArg(args, "--change-url", event.change.url);
+ addArg(args, "--change-owner", getDisplayName(owner.getAccount()));
addArg(args, "--project", event.change.project);
addArg(args, "--branch", event.change.branch);
addArg(args, "--topic", event.change.topic);
@@ -396,6 +400,7 @@
final PatchSet patchSet, final String comment, final Map<String, Short> approvals,
final ReviewDb db) throws OrmException {
final CommentAddedEvent event = new CommentAddedEvent();
+ final AccountState owner = accountCache.get(change.getOwner());
event.change = eventFactory.asChangeAttribute(change);
event.author = eventFactory.asAccountAttribute(account);
@@ -413,10 +418,11 @@
fireEvent(change, event, db);
- final List<String> args = new ArrayList<String>();
+ final List<String> args = new ArrayList<>();
addArg(args, "--change", event.change.id);
addArg(args, "--is-draft", patchSet.isDraft() ? "true" : "false");
addArg(args, "--change-url", event.change.url);
+ addArg(args, "--change-owner", getDisplayName(owner.getAccount()));
addArg(args, "--project", event.change.project);
addArg(args, "--branch", event.change.branch);
addArg(args, "--topic", event.change.topic);
@@ -436,15 +442,17 @@
public void doChangeMergedHook(final Change change, final Account account,
final PatchSet patchSet, final ReviewDb db) throws OrmException {
final ChangeMergedEvent event = new ChangeMergedEvent();
+ final AccountState owner = accountCache.get(change.getOwner());
event.change = eventFactory.asChangeAttribute(change);
event.submitter = eventFactory.asAccountAttribute(account);
event.patchSet = eventFactory.asPatchSetAttribute(patchSet);
fireEvent(change, event, db);
- final List<String> args = new ArrayList<String>();
+ final List<String> args = new ArrayList<>();
addArg(args, "--change", event.change.id);
addArg(args, "--change-url", event.change.url);
+ addArg(args, "--change-owner", getDisplayName(owner.getAccount()));
addArg(args, "--project", event.change.project);
addArg(args, "--branch", event.change.branch);
addArg(args, "--topic", event.change.topic);
@@ -458,6 +466,7 @@
final PatchSet patchSet, final String reason,
final ReviewDb db) throws OrmException {
final MergeFailedEvent event = new MergeFailedEvent();
+ final AccountState owner = accountCache.get(change.getOwner());
event.change = eventFactory.asChangeAttribute(change);
event.submitter = eventFactory.asAccountAttribute(account);
@@ -465,9 +474,10 @@
event.reason = reason;
fireEvent(change, event, db);
- final List<String> args = new ArrayList<String>();
+ final List<String> args = new ArrayList<>();
addArg(args, "--change", event.change.id);
addArg(args, "--change-url", event.change.url);
+ addArg(args, "--change-owner", getDisplayName(owner.getAccount()));
addArg(args, "--project", event.change.project);
addArg(args, "--branch", event.change.branch);
addArg(args, "--topic", event.change.topic);
@@ -482,6 +492,7 @@
final PatchSet patchSet, final String reason, final ReviewDb db)
throws OrmException {
final ChangeAbandonedEvent event = new ChangeAbandonedEvent();
+ final AccountState owner = accountCache.get(change.getOwner());
event.change = eventFactory.asChangeAttribute(change);
event.abandoner = eventFactory.asAccountAttribute(account);
@@ -489,9 +500,10 @@
event.reason = reason;
fireEvent(change, event, db);
- final List<String> args = new ArrayList<String>();
+ final List<String> args = new ArrayList<>();
addArg(args, "--change", event.change.id);
addArg(args, "--change-url", event.change.url);
+ addArg(args, "--change-owner", getDisplayName(owner.getAccount()));
addArg(args, "--project", event.change.project);
addArg(args, "--branch", event.change.branch);
addArg(args, "--topic", event.change.topic);
@@ -506,6 +518,7 @@
final PatchSet patchSet, final String reason, final ReviewDb db)
throws OrmException {
final ChangeRestoredEvent event = new ChangeRestoredEvent();
+ final AccountState owner = accountCache.get(change.getOwner());
event.change = eventFactory.asChangeAttribute(change);
event.restorer = eventFactory.asAccountAttribute(account);
@@ -513,9 +526,10 @@
event.reason = reason;
fireEvent(change, event, db);
- final List<String> args = new ArrayList<String>();
+ final List<String> args = new ArrayList<>();
addArg(args, "--change", event.change.id);
addArg(args, "--change-url", event.change.url);
+ addArg(args, "--change-owner", getDisplayName(owner.getAccount()));
addArg(args, "--project", event.change.project);
addArg(args, "--branch", event.change.branch);
addArg(args, "--topic", event.change.topic);
@@ -539,7 +553,7 @@
event.refUpdate = eventFactory.asRefUpdateAttribute(oldId, newId, refName);
fireEvent(refName, event);
- final List<String> args = new ArrayList<String>();
+ final List<String> args = new ArrayList<>();
addArg(args, "--oldrev", event.refUpdate.oldRev);
addArg(args, "--newrev", event.refUpdate.newRev);
addArg(args, "--refname", event.refUpdate.refName);
@@ -554,15 +568,17 @@
public void doReviewerAddedHook(final Change change, final Account account,
final PatchSet patchSet, final ReviewDb db) throws OrmException {
final ReviewerAddedEvent event = new ReviewerAddedEvent();
+ final AccountState owner = accountCache.get(change.getOwner());
event.change = eventFactory.asChangeAttribute(change);
event.patchSet = eventFactory.asPatchSetAttribute(patchSet);
event.reviewer = eventFactory.asAccountAttribute(account);
fireEvent(change, event, db);
- final List<String> args = new ArrayList<String>();
+ final List<String> args = new ArrayList<>();
addArg(args, "--change", event.change.id);
addArg(args, "--change-url", event.change.url);
+ addArg(args, "--change-owner", getDisplayName(owner.getAccount()));
addArg(args, "--project", event.change.project);
addArg(args, "--branch", event.change.branch);
addArg(args, "--reviewer", getDisplayName(account));
@@ -574,14 +590,16 @@
final String oldTopic, final ReviewDb db)
throws OrmException {
final TopicChangedEvent event = new TopicChangedEvent();
+ final AccountState owner = accountCache.get(change.getOwner());
event.change = eventFactory.asChangeAttribute(change);
event.changer = eventFactory.asAccountAttribute(account);
event.oldTopic = oldTopic;
fireEvent(change, event, db);
- final List<String> args = new ArrayList<String>();
+ final List<String> args = new ArrayList<>();
addArg(args, "--change", event.change.id);
+ addArg(args, "--change-owner", getDisplayName(owner.getAccount()));
addArg(args, "--project", event.change.project);
addArg(args, "--branch", event.change.branch);
addArg(args, "--changer", getDisplayName(account));
@@ -593,7 +611,7 @@
public void doClaSignupHook(Account account, ContributorAgreement cla) {
if (account != null) {
- final List<String> args = new ArrayList<String>();
+ final List<String> args = new ArrayList<>();
addArg(args, "--submitter", getDisplayName(account));
addArg(args, "--user-id", account.getId().toString());
addArg(args, "--cla-name", cla.getName());
@@ -721,7 +739,7 @@
}
SyncHookTask syncHook = new SyncHookTask(project, hook, args);
- FutureTask<HookResult> task = new FutureTask<HookResult>(syncHook);
+ FutureTask<HookResult> task = new FutureTask<>(syncHook);
syncHookThreadPool.execute(task);
@@ -781,7 +799,7 @@
HookResult result = null;
try {
- final List<String> argv = new ArrayList<String>(1 + args.size());
+ final List<String> argv = new ArrayList<>(1 + args.size());
argv.add(hook.getAbsolutePath());
argv.addAll(args);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologCompiler.java b/gerrit-server/src/main/java/com/google/gerrit/rules/PrologCompiler.java
index 8202ac2..7f6bff4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologCompiler.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/rules/PrologCompiler.java
@@ -154,13 +154,13 @@
}
DiagnosticCollector<JavaFileObject> diagnostics =
- new DiagnosticCollector<JavaFileObject>();
+ new DiagnosticCollector<>();
StandardJavaFileManager fileManager =
compiler.getStandardFileManager(diagnostics, null, null);
try {
Iterable<? extends JavaFileObject> compilationUnits = fileManager
.getJavaFileObjectsFromFiles(getAllFiles(tempDir, ".java"));
- ArrayList<String> options = new ArrayList<String>();
+ ArrayList<String> options = new ArrayList<>();
String classpath = getMyClasspath();
if (classpath != null) {
options.add("-classpath");
@@ -270,7 +270,7 @@
}
private List<File> getAllFiles(File dir, String extension) {
- ArrayList<File> fileList = new ArrayList<File>();
+ ArrayList<File> fileList = new ArrayList<>();
getAllFiles(dir, extension, fileList);
return fileList;
}
@@ -287,7 +287,7 @@
}
private List<String> getRelativePaths(File dir, String extension) {
- ArrayList<String> pathList = new ArrayList<String>();
+ ArrayList<String> pathList = new ArrayList<>();
getRelativePaths(dir, extension, "", pathList);
return pathList;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java b/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java
index 234a0e7b..029a5d7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java
@@ -73,8 +73,8 @@
setMaxArity(MAX_ARITY);
setEnabled(EnumSet.allOf(Prolog.Feature.class), false);
args = a;
- storedValues = new HashMap<StoredValue<Object>, Object>();
- cleanup = new LinkedList<Runnable>();
+ storedValues = new HashMap<>();
+ cleanup = new LinkedList<>();
}
public Args getArgs() {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java b/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java
index 4a3cd9a..e677b53 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/rules/RulesCache.java
@@ -80,11 +80,10 @@
private static final List<String> PACKAGE_LIST = ImmutableList.of(
Prolog.BUILTIN, "gerrit");
- private final Map<ObjectId, MachineRef> machineCache =
- new HashMap<ObjectId, MachineRef>();
+ private final Map<ObjectId, MachineRef> machineCache = new HashMap<>();
private final ReferenceQueue<PrologMachineCopy> dead =
- new ReferenceQueue<PrologMachineCopy>();
+ new ReferenceQueue<>();
private static final class MachineRef extends WeakReference<PrologMachineCopy> {
final ObjectId key;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java
index e17346b..132360b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/rules/StoredValue.java
@@ -25,12 +25,12 @@
public class StoredValue<T> {
/** Construct a new unique key that does not match any other key. */
public static <T> StoredValue<T> create() {
- return new StoredValue<T>();
+ return new StoredValue<>();
}
/** Construct a key based on a Java Class object, useful for singletons. */
public static <T> StoredValue<T> create(Class<T> clazz) {
- return new StoredValue<T>(clazz);
+ return new StoredValue<>(clazz);
}
private final Object key;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java
index 14aa2e3..e68b29c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalCopier.java
@@ -81,6 +81,11 @@
db.patchSetApprovals().insert(getForPatchSet(db, ctl, ps));
}
+ Iterable<PatchSetApproval> getForPatchSet(ReviewDb db,
+ ChangeControl ctl, PatchSet.Id psId) throws OrmException {
+ return getForPatchSet(db, ctl, db.patchSets().get(psId));
+ }
+
private Iterable<PatchSetApproval> getForPatchSet(ReviewDb db,
ChangeControl ctl, PatchSet ps) throws OrmException {
ChangeData cd = changeDataFactory.create(db, ctl);
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 b648548..64b5169 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/ApprovalsUtil.java
@@ -43,6 +43,7 @@
import com.google.gerrit.server.notedb.ChangeUpdate;
import com.google.gerrit.server.notedb.NotesMigration;
import com.google.gerrit.server.notedb.ReviewerState;
+import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.util.TimeUtil;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@@ -90,11 +91,14 @@
}
private final NotesMigration migration;
+ private final ApprovalCopier copier;
@VisibleForTesting
@Inject
- public ApprovalsUtil(NotesMigration migration) {
+ public ApprovalsUtil(NotesMigration migration,
+ ApprovalCopier copier) {
this.migration = migration;
+ this.copier = copier;
}
/**
@@ -225,23 +229,22 @@
return notes.load().getApprovals();
}
- public List<PatchSetApproval> byPatchSet(ReviewDb db, ChangeNotes notes,
+ public Iterable<PatchSetApproval> byPatchSet(ReviewDb db, ChangeControl ctl,
PatchSet.Id psId) throws OrmException {
if (!migration.readPatchSetApprovals()) {
return sortApprovals(db.patchSetApprovals().byPatchSet(psId));
}
- return notes.load().getApprovals().get(psId);
+ return copier.getForPatchSet(db, ctl, psId);
}
- public List<PatchSetApproval> byPatchSetUser(ReviewDb db,
- ChangeNotes notes, PatchSet.Id psId, Account.Id accountId)
+ public Iterable<PatchSetApproval> byPatchSetUser(ReviewDb db,
+ ChangeControl ctl, PatchSet.Id psId, Account.Id accountId)
throws OrmException {
if (!migration.readPatchSetApprovals()) {
return sortApprovals(
db.patchSetApprovals().byPatchSetUser(psId, accountId));
}
- return ImmutableList.copyOf(
- filterApprovals(byPatchSet(db, notes, psId), accountId));
+ return filterApprovals(byPatchSet(db, ctl, psId), accountId);
}
public PatchSetApproval getSubmitter(ReviewDb db, ChangeNotes notes,
@@ -250,7 +253,8 @@
return null;
}
try {
- return getSubmitter(c, byPatchSet(db, notes, c));
+ // Submit approval is never copied, so bypass expensive byPatchSet call.
+ return getSubmitter(c, byChange(db, notes).get(c));
} catch (OrmException e) {
return null;
}
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 939be28..68a62a1 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
@@ -147,7 +147,7 @@
public static void insertAncestors(ReviewDb db, PatchSet.Id id, RevCommit src)
throws OrmException {
int cnt = src.getParentCount();
- List<PatchSetAncestor> toInsert = new ArrayList<PatchSetAncestor>(cnt);
+ List<PatchSetAncestor> toInsert = new ArrayList<>(cnt);
for (int p = 0; p < cnt; p++) {
PatchSetAncestor a =
new PatchSetAncestor(new PatchSetAncestor.Id(id, p + 1));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/DefaultFileExtensionRegistry.java b/gerrit-server/src/main/java/com/google/gerrit/server/DefaultFileExtensionRegistry.java
index 0416ba4..61bd39e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/DefaultFileExtensionRegistry.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/DefaultFileExtensionRegistry.java
@@ -16,60 +16,44 @@
import com.google.common.collect.ImmutableMap;
+import eu.medsea.mimeutil.MimeException;
import eu.medsea.mimeutil.MimeType;
import eu.medsea.mimeutil.MimeUtil;
import eu.medsea.mimeutil.detector.MimeDetector;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.io.File;
+import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Collection;
import java.util.Collections;
+import java.util.Map;
+import java.util.Properties;
+/** Loads mime types from {@code mime-types.properties} at specificity of 2. */
public class DefaultFileExtensionRegistry extends MimeDetector {
- private static final MimeType INI = newMimeType("text/x-ini", 2);
- private static final MimeType PYTHON = newMimeType("text/x-python", 2);
- private static final MimeType PERL = newMimeType("text/x-perl", 2);
- private static final MimeType LISP = newMimeType("text/x-common-lisp", 2);
-
- private static final ImmutableMap<String, MimeType> TYPES =
- ImmutableMap.<String,MimeType>builder()
- .put(".gitmodules", INI)
- .put("project.config", INI)
- .put("BUCK", PYTHON)
- .put("bucklet", newMimeType(PYTHON.toString(), 1))
- .put("defs", newMimeType(PYTHON.toString(), 1))
- .put("py", newMimeType(PYTHON.toString(), 1))
- .put("go", newMimeType("text/x-go", 1))
- .put("cxx", newMimeType("text/x-c++src", 1))
- .put("hxx", newMimeType("text/x-c++hdr", 1))
- .put("scala", newMimeType("text/x-scala", 1))
- .put("pl", PERL)
- .put("pm", PERL)
- .put("rb", newMimeType("text/x-ruby", 2))
- .put("cl", LISP)
- .put("el", LISP)
- .put("lisp", LISP)
- .put("lsp", LISP)
- .put("clj", newMimeType("text/x-clojure", 2))
- .put("groovy", newMimeType("text/x-groovy", 2))
- .build();
-
- private static MimeType newMimeType(String type, final int specificity) {
- return new MimeType(type) {
- private static final long serialVersionUID = 1L;
-
- @Override
- public int getSpecificity() {
- return specificity;
- }
- };
- }
+ private static final Logger log = LoggerFactory.getLogger(DefaultFileExtensionRegistry.class);
+ private static final ImmutableMap<String, MimeType> TYPES;
static {
- for (MimeType type : TYPES.values()) {
+ Properties prop = new Properties();
+ try (InputStream in = DefaultFileExtensionRegistry.class
+ .getResourceAsStream("mime-types.properties")) {
+ prop.load(in);
+ } catch (IOException e) {
+ log.warn("Cannot load mime-types.properties", e);
+ }
+
+ ImmutableMap.Builder<String, MimeType> b = ImmutableMap.builder();
+ for (Map.Entry<Object, Object> e : prop.entrySet()) {
+ MimeType type = new FileExtensionMimeType((String) e.getValue());
+ b.put((String) e.getKey(), type);
MimeUtil.addKnownMimeType(type);
}
+ TYPES = b.build();
}
@Override
@@ -119,4 +103,17 @@
protected Collection<MimeType> getMimeTypesByteArray(byte[] arg0) {
return Collections.emptyList();
}
+
+ private static final class FileExtensionMimeType extends MimeType {
+ private static final long serialVersionUID = 1L;
+
+ FileExtensionMimeType(String mimeType) throws MimeException {
+ super(mimeType);
+ }
+
+ @Override
+ public int getSpecificity() {
+ return 2;
+ }
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/MimeUtilFileTypeRegistry.java b/gerrit-server/src/main/java/com/google/gerrit/server/MimeUtilFileTypeRegistry.java
index ff46b00..5263c6b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/MimeUtilFileTypeRegistry.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/MimeUtilFileTypeRegistry.java
@@ -94,7 +94,7 @@
@SuppressWarnings("unchecked")
public MimeType getMimeType(final String path, final byte[] content) {
- Set<MimeType> mimeTypes = new HashSet<MimeType>();
+ Set<MimeType> mimeTypes = new HashSet<>();
if (content != null && content.length > 0) {
try {
mimeTypes.addAll(mimeUtil.getMimeTypes(content));
@@ -112,7 +112,7 @@
return MimeUtil2.UNKNOWN_MIME_TYPE;
}
- final List<MimeType> types = new ArrayList<MimeType>(mimeTypes);
+ final List<MimeType> types = new ArrayList<>(mimeTypes);
Collections.sort(types, new Comparator<MimeType>() {
@Override
public int compare(MimeType a, MimeType b) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java b/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java
index d836646..b8c0888 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/RequestCleanup.java
@@ -32,7 +32,7 @@
private static final Logger log =
LoggerFactory.getLogger(RequestCleanup.class);
- private final List<Runnable> cleanup = new LinkedList<Runnable>();
+ private final List<Runnable> cleanup = new LinkedList<>();
private boolean ran;
/** Register a task to be completed after the request ends. */
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
new file mode 100644
index 0000000..58cf8ac4
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java
@@ -0,0 +1,64 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server;
+
+import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.webui.PatchSetWebLink;
+import com.google.gerrit.extensions.webui.ProjectWebLink;
+import com.google.inject.Inject;
+
+import java.util.List;
+
+public class WebLinks {
+
+ private final DynamicSet<PatchSetWebLink> patchSetLinks;
+ private final DynamicSet<ProjectWebLink> projectLinks;
+
+ @Inject
+ public WebLinks(DynamicSet<PatchSetWebLink> patchSetLinks,
+ DynamicSet<ProjectWebLink> projectLinks) {
+ this.patchSetLinks = patchSetLinks;
+ this.projectLinks = projectLinks;
+ }
+
+ public Iterable<Link> getPatchSetLinks(String project, String commit) {
+ List<Link> links = Lists.newArrayList();
+ for (PatchSetWebLink webLink : patchSetLinks) {
+ links.add(new Link(webLink.getLinkName(),
+ webLink.getPatchSetUrl(project, commit)));
+ }
+ return links;
+ }
+
+ public Iterable<Link> getProjectLinks(String project) {
+ List<Link> links = Lists.newArrayList();
+ for (ProjectWebLink webLink : projectLinks) {
+ links.add(new Link(webLink.getLinkName(),
+ webLink.getProjectUrl(project)));
+ }
+ return links;
+ }
+
+ public class Link {
+ public String name;
+ public String url;
+
+ public Link(String name, String url) {
+ this.name = name;
+ this.url = url;
+ }
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/WebLinksProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/WebLinksProvider.java
new file mode 100644
index 0000000..e3ffa62
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/WebLinksProvider.java
@@ -0,0 +1,40 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server;
+
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.webui.PatchSetWebLink;
+import com.google.gerrit.extensions.webui.ProjectWebLink;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+public class WebLinksProvider implements Provider<WebLinks> {
+
+ private final DynamicSet<PatchSetWebLink> patchSetLinks;
+ private final DynamicSet<ProjectWebLink> projectLinks;
+
+ @Inject
+ public WebLinksProvider(DynamicSet<PatchSetWebLink> patchSetLinks,
+ DynamicSet<ProjectWebLink> projectLinks) {
+ this.patchSetLinks = patchSetLinks;
+ this.projectLinks = projectLinks;
+ }
+
+ @Override
+ public WebLinks get() {
+ WebLinks webLinks = new WebLinks(patchSetLinks, projectLinks);
+ return webLinks;
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/access/ListAccess.java b/gerrit-server/src/main/java/com/google/gerrit/server/access/ListAccess.java
index 3a0a27d..5d651ae 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/access/ListAccess.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/access/ListAccess.java
@@ -23,6 +23,7 @@
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.common.data.RefConfigSection;
import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestReadView;
@@ -41,7 +42,6 @@
import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.project.ProjectControl;
import com.google.gerrit.server.project.ProjectJson;
-import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.project.RefControl;
import com.google.inject.Inject;
@@ -157,8 +157,7 @@
pc.controlForRef(RefNames.REFS_CONFIG);
local = Maps.newHashMap();
ownerOf = Sets.newHashSet();
- Map<AccountGroup.UUID, Boolean> visibleGroups =
- new HashMap<AccountGroup.UUID, Boolean>();
+ Map<AccountGroup.UUID, Boolean> visibleGroups = new HashMap<>();
for (AccessSection section : config.getAccessSections()) {
String name = section.getName();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java
index 65b166b..a521840 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountCacheImpl.java
@@ -163,7 +163,7 @@
Collections.unmodifiableCollection(db.accountExternalIds().byAccount(
who).toList());
- Set<AccountGroup.UUID> internalGroups = new HashSet<AccountGroup.UUID>();
+ Set<AccountGroup.UUID> internalGroups = new HashSet<>();
for (AccountGroupMember g : db.accountGroupMembers().byAccount(who)) {
final AccountGroup.Id groupId = g.getAccountGroupId();
final AccountGroup group = groupCache.get(groupId);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountInfoCacheFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountInfoCacheFactory.java
index e3cf0236..32781f0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountInfoCacheFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountInfoCacheFactory.java
@@ -36,7 +36,7 @@
@Inject
AccountInfoCacheFactory(final AccountCache accountCache) {
this.accountCache = accountCache;
- this.out = new HashMap<Account.Id, Account>();
+ this.out = new HashMap<>();
}
/**
@@ -66,7 +66,7 @@
* Create an AccountInfoCache with the currently loaded Account entities.
* */
public AccountInfoCache create() {
- final List<AccountInfo> r = new ArrayList<AccountInfo>(out.size());
+ final List<AccountInfo> r = new ArrayList<>(out.size());
for (final Account a : out.values()) {
r.add(new AccountInfo(a));
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java
index f068812..3ba3076 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountManager.java
@@ -200,8 +200,8 @@
if (authConfig.isAllowGoogleAccountUpgrade()
&& who.isScheme(OpenIdUrls.URL_GOOGLE + "?")
&& who.getEmailAddress() != null) {
- final List<AccountExternalId> openId = new ArrayList<AccountExternalId>();
- final List<AccountExternalId> v1 = new ArrayList<AccountExternalId>();
+ final List<AccountExternalId> openId = new ArrayList<>();
+ final List<AccountExternalId> v1 = new ArrayList<>();
for (final AccountExternalId extId : db.accountExternalIds()
.byEmailAddress(who.getEmailAddress())) {
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 383ed05..cc66294 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
@@ -179,7 +179,7 @@
// At this point we have no clue. Just perform a whole bunch of suggestions
// and pray we come up with a reasonable result list.
//
- Set<Account.Id> result = new HashSet<Account.Id>();
+ Set<Account.Id> result = new HashSet<>();
String a = nameOrEmail;
String b = nameOrEmail + "\u9fa5";
for (Account act : schema.get().accounts().suggestByFullName(a, b, 10)) {
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 488370e..66607e2 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
@@ -74,7 +74,7 @@
* validated by Gerrit directly.
*/
public Set<String> getEmailAddresses() {
- final Set<String> emails = new HashSet<String>();
+ final Set<String> emails = new HashSet<>();
for (final AccountExternalId e : externalIds) {
if (e.getEmailAddress() != null && !e.getEmailAddress().isEmpty()) {
emails.add(e.getEmailAddress());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityCollection.java
index 0247dbe..f60c794 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityCollection.java
@@ -43,8 +43,7 @@
section = new AccessSection(AccessSection.GLOBAL_CAPABILITIES);
}
- Map<String, List<PermissionRule>> tmp =
- new HashMap<String, List<PermissionRule>>();
+ Map<String, List<PermissionRule>> tmp = new HashMap<>();
for (Permission permission : section.getPermissions()) {
for (PermissionRule rule : permission.getRules()) {
if (!permission.getName().equals(GlobalCapability.EMAIL_REVIEWERS)
@@ -54,7 +53,7 @@
List<PermissionRule> r = tmp.get(permission.getName());
if (r == null) {
- r = new ArrayList<PermissionRule>(2);
+ r = new ArrayList<>(2);
tmp.put(permission.getName(), r);
}
r.add(rule);
@@ -62,8 +61,7 @@
}
configureDefaults(tmp, section);
- Map<String, List<PermissionRule>> res =
- new HashMap<String, List<PermissionRule>>();
+ Map<String, List<PermissionRule>> res = new HashMap<>();
for (Map.Entry<String, List<PermissionRule>> e : tmp.entrySet()) {
List<PermissionRule> rules = e.getValue();
if (rules.size() == 1) {
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 aad22eb..8ccb731 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
@@ -54,7 +54,7 @@
CapabilityControl(ProjectCache projectCache, @Assisted CurrentUser currentUser) {
capabilities = projectCache.getAllProjects().getCapabilityCollection();
user = currentUser;
- effective = new HashMap<String, List<PermissionRule>>();
+ effective = new HashMap<>();
}
/** Identity of the user the control will compute for. */
@@ -268,7 +268,7 @@
return rules;
}
- List<PermissionRule> mine = new ArrayList<PermissionRule>(rules.size());
+ List<PermissionRule> mine = new ArrayList<>(rules.size());
for (PermissionRule rule : rules) {
if (match(groups, rule)) {
mine.add(rule);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java
index 1210906..6dd51e1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java
@@ -141,7 +141,7 @@
}
private Collection<AccountExternalId> old() throws OrmException {
- final Collection<AccountExternalId> r = new ArrayList<AccountExternalId>(1);
+ final Collection<AccountExternalId> r = new ArrayList<>(1);
for (AccountExternalId i : db.accountExternalIds().byAccount(
user.getAccountId())) {
if (i.isScheme(SCHEME_USERNAME)) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java
index 8eb6947..5089c3a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetPreferences.java
@@ -14,9 +14,11 @@
package com.google.gerrit.server.account;
+import com.google.common.base.Strings;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.webui.TopMenu;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ChangeScreen;
@@ -28,23 +30,52 @@
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.TimeFormat;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.Repository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
public class GetPreferences implements RestReadView<AccountResource> {
+ private static final Logger log = LoggerFactory.getLogger(GetPreferences.class);
+
+ public static final String MY = "my";
+ public static final String KEY_URL = "url";
+ public static final String KEY_TARGET = "target";
+ public static final String KEY_ID = "id";
+
private final Provider<CurrentUser> self;
private final Provider<ReviewDb> db;
+ private final AllUsersName allUsersName;
+ private final GitRepositoryManager gitMgr;
@Inject
- GetPreferences(Provider<CurrentUser> self, Provider<ReviewDb> db) {
+ GetPreferences(Provider<CurrentUser> self, Provider<ReviewDb> db,
+ AllUsersName allUsersName,
+ GitRepositoryManager gitMgr) {
this.self = self;
this.db = db;
+ this.allUsersName = allUsersName;
+ this.gitMgr = gitMgr;
}
@Override
public PreferenceInfo apply(AccountResource rsrc)
- throws AuthException, ResourceNotFoundException, OrmException {
+ throws AuthException,
+ ResourceNotFoundException,
+ OrmException,
+ IOException,
+ ConfigInvalidException {
if (self.get() != rsrc.getUser()
&& !self.get().getCapabilities().canAdministrateServer()) {
throw new AuthException("restricted to administrator");
@@ -53,13 +84,22 @@
if (a == null) {
throw new ResourceNotFoundException();
}
- return new PreferenceInfo(a.getGeneralPreferences());
+
+ Repository git = gitMgr.openRepository(allUsersName);
+ try {
+ VersionedAccountPreferences p =
+ VersionedAccountPreferences.forUser(rsrc.getUser().getAccountId());
+ p.load(git);
+ return new PreferenceInfo(a.getGeneralPreferences(), p, git);
+ } finally {
+ git.close();
+ }
}
- static class PreferenceInfo {
+ public static class PreferenceInfo {
final String kind = "gerritcodereview#preferences";
- short changesPerPage;
+ Short changesPerPage;
Boolean showSiteHeader;
Boolean useFlashClipboard;
DownloadScheme downloadScheme;
@@ -74,23 +114,71 @@
CommentVisibilityStrategy commentVisibilityStrategy;
DiffView diffView;
ChangeScreen changeScreen;
+ List<TopMenu.MenuItem> my;
- PreferenceInfo(AccountGeneralPreferences p) {
- changesPerPage = p.getMaximumPageSize();
- showSiteHeader = p.isShowSiteHeader() ? true : null;
- useFlashClipboard = p.isUseFlashClipboard() ? true : null;
- downloadScheme = p.getDownloadUrl();
- downloadCommand = p.getDownloadCommand();
- copySelfOnEmail = p.isCopySelfOnEmails() ? true : null;
- dateFormat = p.getDateFormat();
- timeFormat = p.getTimeFormat();
- reversePatchSetOrder = p.isReversePatchSetOrder() ? true : null;
- showUsernameInReviewCategory = p.isShowUsernameInReviewCategory() ? true : null;
- relativeDateInChangeTable = p.isRelativeDateInChangeTable() ? true : null;
- sizeBarInChangeTable = p.isSizeBarInChangeTable() ? true : null;
- commentVisibilityStrategy = p.getCommentVisibilityStrategy();
- diffView = p.getDiffView();
- changeScreen = p.getChangeScreen();
+ public PreferenceInfo(AccountGeneralPreferences p,
+ VersionedAccountPreferences v, Repository allUsers) {
+ if (p != null) {
+ changesPerPage = p.getMaximumPageSize();
+ showSiteHeader = p.isShowSiteHeader() ? true : null;
+ useFlashClipboard = p.isUseFlashClipboard() ? true : null;
+ downloadScheme = p.getDownloadUrl();
+ downloadCommand = p.getDownloadCommand();
+ copySelfOnEmail = p.isCopySelfOnEmails() ? true : null;
+ dateFormat = p.getDateFormat();
+ timeFormat = p.getTimeFormat();
+ reversePatchSetOrder = p.isReversePatchSetOrder() ? true : null;
+ showUsernameInReviewCategory = p.isShowUsernameInReviewCategory() ? true : null;
+ relativeDateInChangeTable = p.isRelativeDateInChangeTable() ? true : null;
+ sizeBarInChangeTable = p.isSizeBarInChangeTable() ? true : null;
+ commentVisibilityStrategy = p.getCommentVisibilityStrategy();
+ diffView = p.getDiffView();
+ changeScreen = p.getChangeScreen();
+ }
+ my = my(v, allUsers);
+ }
+
+ private List<TopMenu.MenuItem> my(VersionedAccountPreferences v,
+ Repository allUsers) {
+ List<TopMenu.MenuItem> my = my(v);
+ if (my.isEmpty() && !v.isDefaults()) {
+ try {
+ VersionedAccountPreferences d = VersionedAccountPreferences.forDefault();
+ d.load(allUsers);
+ my = my(d);
+ } catch (ConfigInvalidException | IOException e) {
+ log.warn("cannot read default preferences", e);
+ }
+ }
+ if (my.isEmpty()) {
+ my.add(new TopMenu.MenuItem("Changes", "#/dashboard/self", null));
+ my.add(new TopMenu.MenuItem("Drafts", "#/q/is:draft", null));
+ my.add(new TopMenu.MenuItem("Draft Comments", "#/q/has:draft", null));
+ my.add(new TopMenu.MenuItem("Watched Changes", "#/q/is:watched+is:open", null));
+ my.add(new TopMenu.MenuItem("Starred Changes", "#/q/is:starred", null));
+ my.add(new TopMenu.MenuItem("Groups", "#/groups/self", null));
+ }
+ return my;
+ }
+
+ private List<TopMenu.MenuItem> my(VersionedAccountPreferences v) {
+ List<TopMenu.MenuItem> my = new ArrayList<>();
+ Config cfg = v.getConfig();
+ for (String subsection : cfg.getSubsections(MY)) {
+ String url = my(cfg, subsection, KEY_URL, "#/");
+ String target = my(cfg, subsection, KEY_TARGET,
+ url.startsWith("#") ? null : "_blank");
+ my.add(new TopMenu.MenuItem(
+ subsection, url, target,
+ my(cfg, subsection, KEY_ID, null)));
+ }
+ return my;
+ }
+
+ private static String my(Config cfg, String subsection, String key,
+ String defaultValue) {
+ String val = cfg.getString(MY, subsection, key);
+ return !Strings.isNullOrEmpty(val) ? val : defaultValue;
}
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupDetailFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupDetailFactory.java
index 9b4f4df..889addf 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupDetailFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupDetailFactory.java
@@ -83,7 +83,7 @@
}
private List<AccountGroupMember> loadMembers() throws OrmException {
- List<AccountGroupMember> members = new ArrayList<AccountGroupMember>();
+ List<AccountGroupMember> members = new ArrayList<>();
for (final AccountGroupMember m : db.accountGroupMembers().byGroup(groupId)) {
if (control.canSeeMember(m.getAccountId())) {
aic.want(m.getAccountId());
@@ -117,7 +117,7 @@
}
private List<AccountGroupById> loadIncludes() throws OrmException {
- List<AccountGroupById> groups = new ArrayList<AccountGroupById>();
+ List<AccountGroupById> groups = new ArrayList<>();
for (final AccountGroupById m : db.accountGroupById().byGroup(groupId)) {
if (control.canSeeGroup(m.getIncludeUUID())) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java
index df5b2c1..3fe9d25 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupMembers.java
@@ -91,7 +91,7 @@
projectControl.controlFor(project, currentUser).getProjectState()
.getOwners();
- final HashSet<Account> projectOwners = new HashSet<Account>();
+ final HashSet<Account> projectOwners = new HashSet<>();
for (final AccountGroup.UUID ownerGroup : ownerGroups) {
if (!seen.contains(ownerGroup)) {
projectOwners.addAll(listAccounts(ownerGroup, project, seen));
@@ -107,7 +107,7 @@
final GroupDetail groupDetail =
groupDetailFactory.create(group.getId()).call();
- final Set<Account> members = new HashSet<Account>();
+ final Set<Account> members = new HashSet<>();
if (groupDetail.members != null) {
for (final AccountGroupMember member : groupDetail.members) {
members.add(accountCache.get(member.getAccountId()).getAccount());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PerformCreateGroup.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PerformCreateGroup.java
index ca1bf32..a54a97b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PerformCreateGroup.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PerformCreateGroup.java
@@ -126,10 +126,8 @@
private void addMembers(final AccountGroup.Id groupId,
final Collection<? extends Account.Id> members) throws OrmException {
- final List<AccountGroupMember> memberships =
- new ArrayList<AccountGroupMember>();
- final List<AccountGroupMemberAudit> membershipsAudit =
- new ArrayList<AccountGroupMemberAudit>();
+ List<AccountGroupMember> memberships = new ArrayList<>();
+ List<AccountGroupMemberAudit> membershipsAudit = new ArrayList<>();
for (Account.Id accountId : members) {
final AccountGroupMember membership =
new AccountGroupMember(new AccountGroupMember.Key(accountId, groupId));
@@ -149,10 +147,8 @@
private void addGroups(final AccountGroup.Id groupId,
final Collection<? extends AccountGroup.UUID> groups) throws OrmException {
- final List<AccountGroupById> includeList =
- new ArrayList<AccountGroupById>();
- final List<AccountGroupByIdAud> includesAudit =
- new ArrayList<AccountGroupByIdAud>();
+ List<AccountGroupById> includeList = new ArrayList<>();
+ List<AccountGroupByIdAud> includesAudit = new ArrayList<>();
for (AccountGroup.UUID includeUUID : groups) {
final AccountGroupById groupInclude =
new AccountGroupById(new AccountGroupById.Key(groupId, includeUUID));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java
index d0418eb..df985ec 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/SetPreferences.java
@@ -14,60 +14,81 @@
package com.google.gerrit.server.account;
+import static com.google.gerrit.server.account.GetPreferences.KEY_ID;
+import static com.google.gerrit.server.account.GetPreferences.KEY_TARGET;
+import static com.google.gerrit.server.account.GetPreferences.KEY_URL;
+import static com.google.gerrit.server.account.GetPreferences.MY;
+
+import com.google.common.base.Strings;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.extensions.webui.TopMenu;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences;
+import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ChangeScreen;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.CommentVisibilityStrategy;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DateFormat;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DiffView;
-import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.ChangeScreen;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadCommand;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadScheme;
import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.TimeFormat;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.account.SetPreferences.Input;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Config;
+
+import java.io.IOException;
import java.util.Collections;
+import java.util.List;
public class SetPreferences implements RestModifyView<AccountResource, Input> {
- static class Input {
- Short changesPerPage;
- Boolean showSiteHeader;
- Boolean useFlashClipboard;
- DownloadScheme downloadScheme;
- DownloadCommand downloadCommand;
- Boolean copySelfOnEmail;
- DateFormat dateFormat;
- TimeFormat timeFormat;
- Boolean reversePatchSetOrder;
- Boolean showUsernameInReviewCategory;
- Boolean relativeDateInChangeTable;
- Boolean sizeBarInChangeTable;
- CommentVisibilityStrategy commentVisibilityStrategy;
- DiffView diffView;
- ChangeScreen changeScreen;
+ public static class Input {
+ public Short changesPerPage;
+ public Boolean showSiteHeader;
+ public Boolean useFlashClipboard;
+ public DownloadScheme downloadScheme;
+ public DownloadCommand downloadCommand;
+ public Boolean copySelfOnEmail;
+ public DateFormat dateFormat;
+ public TimeFormat timeFormat;
+ public Boolean reversePatchSetOrder;
+ public Boolean showUsernameInReviewCategory;
+ public Boolean relativeDateInChangeTable;
+ public Boolean sizeBarInChangeTable;
+ public CommentVisibilityStrategy commentVisibilityStrategy;
+ public DiffView diffView;
+ public ChangeScreen changeScreen;
+ public List<TopMenu.MenuItem> my;
}
private final Provider<CurrentUser> self;
private final AccountCache cache;
private final ReviewDb db;
+ private final MetaDataUpdate.User metaDataUpdateFactory;
+ private final AllUsersName allUsersName;
@Inject
- SetPreferences(Provider<CurrentUser> self, AccountCache cache, ReviewDb db) {
+ SetPreferences(Provider<CurrentUser> self, AccountCache cache, ReviewDb db,
+ MetaDataUpdate.User metaDataUpdateFactory, AllUsersName allUsersName) {
this.self = self;
this.cache = cache;
this.db = db;
+ this.metaDataUpdateFactory = metaDataUpdateFactory;
+ this.allUsersName = allUsersName;
}
@Override
public GetPreferences.PreferenceInfo apply(AccountResource rsrc, Input i)
- throws AuthException, ResourceNotFoundException, OrmException {
+ throws AuthException, ResourceNotFoundException, OrmException,
+ IOException, ConfigInvalidException {
if (self.get() != rsrc.getUser()
&& !self.get().getCapabilities().canAdministrateServer()) {
throw new AuthException("restricted to administrator");
@@ -78,6 +99,8 @@
Account.Id accountId = rsrc.getUser().getAccountId();
AccountGeneralPreferences p;
+ VersionedAccountPreferences versionedPrefs;
+ MetaDataUpdate md = metaDataUpdateFactory.create(allUsersName);
db.accounts().beginTransaction(accountId);
try {
Account a = db.accounts().get(accountId);
@@ -85,6 +108,9 @@
throw new ResourceNotFoundException();
}
+ versionedPrefs = VersionedAccountPreferences.forUser(accountId);
+ versionedPrefs.load(md);
+
p = a.getGeneralPreferences();
if (p == null) {
p = new AccountGeneralPreferences();
@@ -139,10 +165,43 @@
db.accounts().update(Collections.singleton(a));
db.commit();
+ storeMyMenus(versionedPrefs, i.my);
+ versionedPrefs.commit(md);
cache.evict(accountId);
+ return new GetPreferences.PreferenceInfo(
+ p, versionedPrefs,
+ md.getRepository());
} finally {
+ md.close();
db.rollback();
}
- return new GetPreferences.PreferenceInfo(p);
+ }
+
+ public static void storeMyMenus(VersionedAccountPreferences prefs,
+ List<TopMenu.MenuItem> my) {
+ Config cfg = prefs.getConfig();
+ if (my != null) {
+ unsetSection(cfg, MY);
+ for (TopMenu.MenuItem item : my) {
+ set(cfg, item.name, KEY_URL, item.url);
+ set(cfg, item.name, KEY_TARGET, item.target);
+ set(cfg, item.name, KEY_ID, item.id);
+ }
+ }
+ }
+
+ private static void set(Config cfg, String section, String key, String val) {
+ if (Strings.isNullOrEmpty(val)) {
+ cfg.unset(MY, section, key);
+ } else {
+ cfg.setString(MY, section, key, val);
+ }
+ }
+
+ private static void unsetSection(Config cfg, String section) {
+ cfg.unsetSection(section, null);
+ for (String subsection: cfg.getSubsections(section)) {
+ cfg.unsetSection(section, subsection);
+ }
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/StarredChanges.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/StarredChanges.java
index b8984ab..43f7211 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/StarredChanges.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/StarredChanges.java
@@ -44,7 +44,7 @@
import java.util.Collections;
-class StarredChanges implements
+public class StarredChanges implements
ChildCollection<AccountResource, AccountResource.StarredChange>,
AcceptsCreate<AccountResource> {
private static final Logger log = LoggerFactory.getLogger(StarredChanges.class);
@@ -112,7 +112,7 @@
}
}
- static class Create implements RestModifyView<AccountResource, EmptyInput> {
+ public static class Create implements RestModifyView<AccountResource, EmptyInput> {
private final Provider<CurrentUser> self;
private final Provider<ReviewDb> dbProvider;
private ChangeResource change;
@@ -123,7 +123,7 @@
this.dbProvider = dbProvider;
}
- Create setChange(ChangeResource change) {
+ public Create setChange(ChangeResource change) {
this.change = change;
return this;
}
@@ -165,7 +165,7 @@
}
}
- static class Delete implements
+ public static class Delete implements
RestModifyView<AccountResource.StarredChange, EmptyInput> {
private final Provider<CurrentUser> self;
private final Provider<ReviewDb> dbProvider;
@@ -190,6 +190,6 @@
}
}
- static class EmptyInput {
+ public static class EmptyInput {
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountPreferences.java
new file mode 100644
index 0000000..c4d4b06
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/VersionedAccountPreferences.java
@@ -0,0 +1,75 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.account;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.git.VersionedMetaData;
+
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.CommitBuilder;
+import org.eclipse.jgit.lib.Config;
+
+import java.io.IOException;
+
+/** Preferences for user accounts. */
+public class VersionedAccountPreferences extends VersionedMetaData {
+ private static final String REFS_USER_DEFAULT = RefNames.REFS_USER + "default";
+ private static final String PREFERENCES = "preferences.config";
+
+ public static VersionedAccountPreferences forUser(Account.Id id) {
+ return new VersionedAccountPreferences(RefNames.refsUsers(id));
+ }
+
+ public static VersionedAccountPreferences forDefault() {
+ return new VersionedAccountPreferences(REFS_USER_DEFAULT);
+ }
+
+ private final String ref;
+ private Config cfg;
+
+ private VersionedAccountPreferences(String ref) {
+ this.ref = ref;
+ }
+
+ public boolean isDefaults() {
+ return REFS_USER_DEFAULT.equals(getRefName());
+ }
+
+ @Override
+ protected String getRefName() {
+ return ref;
+ }
+
+ public Config getConfig() {
+ return cfg;
+ }
+
+ @Override
+ protected void onLoad() throws IOException, ConfigInvalidException {
+ cfg = readConfig(PREFERENCES);
+ }
+
+ @Override
+ protected boolean onSave(CommitBuilder commit) throws IOException,
+ ConfigInvalidException {
+ if (Strings.isNullOrEmpty(commit.getMessage())) {
+ commit.setMessage("Updated preferences\n");
+ }
+ saveConfig(PREFERENCES, cfg);
+ return true;
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java
index 33314d3..6815bb1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java
@@ -14,24 +14,33 @@
package com.google.gerrit.server.api;
+import com.google.gerrit.extensions.api.accounts.Accounts;
import com.google.gerrit.extensions.api.GerritApi;
import com.google.gerrit.extensions.api.changes.Changes;
import com.google.gerrit.extensions.api.projects.Projects;
import com.google.inject.Inject;
import com.google.inject.Provider;
-class GerritApiImpl implements GerritApi {
+class GerritApiImpl extends GerritApi.NotImplemented implements GerritApi {
+ private final Provider<Accounts> accounts;
private final Provider<Changes> changes;
private final Provider<Projects> projects;
@Inject
- GerritApiImpl(Provider<Changes> changes,
+ GerritApiImpl(Provider<Accounts> accounts,
+ Provider<Changes> changes,
Provider<Projects> projects) {
+ this.accounts = accounts;
this.changes = changes;
this.projects = projects;
}
@Override
+ public Accounts accounts() {
+ return accounts.get();
+ }
+
+ @Override
public Changes changes() {
return changes.get();
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/Module.java
index 1919ff5..23f4b8d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/Module.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/Module.java
@@ -24,5 +24,6 @@
install(new com.google.gerrit.server.api.changes.Module());
install(new com.google.gerrit.server.api.projects.Module());
+ install(new com.google.gerrit.server.api.accounts.Module());
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
new file mode 100644
index 0000000..b1fd979
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
@@ -0,0 +1,93 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.api.accounts;
+
+import com.google.gerrit.extensions.api.accounts.AccountApi;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.account.AccountInfo;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.StarredChanges;
+import com.google.gerrit.server.change.ChangeResource;
+import com.google.gerrit.server.change.ChangesCollection;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+public class AccountApiImpl extends AccountApi.NotImplemented implements AccountApi {
+ interface Factory {
+ AccountApiImpl create(AccountResource account);
+ }
+
+ private final AccountResource account;
+ private final ChangesCollection changes;
+ private final AccountInfo.Loader.Factory accountLoaderFactory;
+ private final StarredChanges.Create starredChangesCreate;
+ private final StarredChanges.Delete starredChangesDelete;
+
+ @Inject
+ AccountApiImpl(AccountInfo.Loader.Factory ailf,
+ ChangesCollection changes,
+ StarredChanges.Create starredChangesCreate,
+ StarredChanges.Delete starredChangesDelete,
+ @Assisted AccountResource account) {
+ this.account = account;
+ this.accountLoaderFactory = ailf;
+ this.changes = changes;
+ this.starredChangesCreate = starredChangesCreate;
+ this.starredChangesDelete = starredChangesDelete;
+ }
+
+ @Override
+ public com.google.gerrit.extensions.common.AccountInfo get()
+ throws RestApiException {
+ AccountInfo.Loader accountLoader = accountLoaderFactory.create(true);
+ try {
+ AccountInfo ai = accountLoader.get(account.getUser().getAccountId());
+ accountLoader.fill();
+ return AccountInfoMapper.fromAcountInfo(ai);
+ } catch (OrmException e) {
+ throw new RestApiException("Cannot parse change", e);
+ }
+ }
+
+ @Override
+ public void starChange(String id) throws RestApiException {
+ try {
+ ChangeResource rsrc = changes.parse(
+ TopLevelResource.INSTANCE,
+ IdString.fromUrl(id));
+ starredChangesCreate.setChange(rsrc);
+ starredChangesCreate.apply(account, new StarredChanges.EmptyInput());
+ } catch (OrmException e) {
+ throw new RestApiException("Cannot star change", e);
+ }
+ }
+
+ @Override
+ public void unstarChange(String id) throws RestApiException {
+ try {
+ ChangeResource rsrc =
+ changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(id));
+ AccountResource.StarredChange starredChange =
+ new AccountResource.StarredChange(account.getUser(), rsrc);
+ starredChangesDelete.apply(starredChange,
+ new StarredChanges.EmptyInput());
+ } catch (OrmException e) {
+ throw new RestApiException("Cannot unstar change", e);
+ }
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountInfoMapper.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountInfoMapper.java
new file mode 100644
index 0000000..10a9116
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountInfoMapper.java
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.api.accounts;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+
+public class AccountInfoMapper {
+ public static AccountInfo fromAcountInfo(
+ com.google.gerrit.server.account.AccountInfo i) {
+ if (i == null) {
+ return null;
+ }
+ AccountInfo ai = new AccountInfo();
+ fromAccount(i, ai);
+ return ai;
+ }
+
+ public static void fromAccount(
+ com.google.gerrit.server.account.AccountInfo i, AccountInfo ai) {
+ ai._accountId = i._accountId;
+ ai.email = i.email;
+ ai.name = i.name;
+ ai.username = i.username;
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java
new file mode 100644
index 0000000..3f0ecfb
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountsImpl.java
@@ -0,0 +1,62 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.api.accounts;
+
+import com.google.gerrit.extensions.api.accounts.AccountApi;
+import com.google.gerrit.extensions.api.accounts.Accounts;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.AccountsCollection;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+public class AccountsImpl extends Accounts.NotImplemented implements Accounts {
+ private final AccountsCollection accounts;
+ private final AccountApiImpl.Factory api;
+ private final Provider<CurrentUser> self;
+
+ @Inject
+ AccountsImpl(AccountsCollection accounts,
+ AccountApiImpl.Factory api,
+ Provider<CurrentUser> self) {
+ this.accounts = accounts;
+ this.api = api;
+ this.self = self;
+ }
+
+ @Override
+ public AccountApi id(String id) throws RestApiException {
+ try {
+ return api.create(accounts.parse(TopLevelResource.INSTANCE,
+ IdString.fromDecoded(id)));
+ } catch (OrmException e) {
+ throw new RestApiException("Cannot parse change", e);
+ }
+ }
+
+ @Override
+ public AccountApi self() throws RestApiException {
+ if (!self.get().isIdentifiedUser()) {
+ throw new AuthException("Authentication required");
+ }
+ return api.create(new AccountResource((IdentifiedUser)self.get()));
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/Module.java
new file mode 100644
index 0000000..5e3855e
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/Module.java
@@ -0,0 +1,27 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.api.accounts;
+
+import com.google.gerrit.extensions.api.accounts.Accounts;
+import com.google.gerrit.server.config.FactoryModule;
+
+public class Module extends FactoryModule {
+ @Override
+ protected void configure() {
+ bind(Accounts.class).to(AccountsImpl.class);
+
+ factory(AccountApiImpl.Factory.class);
+ }
+}
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 0bcfd65..8d4a0c9 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
@@ -41,7 +41,7 @@
import java.io.IOException;
import java.util.EnumSet;
-class ChangeApiImpl implements ChangeApi {
+class ChangeApiImpl extends ChangeApi.NotImplemented implements ChangeApi {
interface Factory {
ChangeApiImpl create(ChangeResource change);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeInfoMapper.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeInfoMapper.java
index 9d813fc..c2dae0d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeInfoMapper.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeInfoMapper.java
@@ -24,7 +24,6 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import com.google.gerrit.extensions.common.AccountInfo;
import com.google.gerrit.extensions.common.ApprovalInfo;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.ChangeMessageInfo;
@@ -33,6 +32,7 @@
import com.google.gerrit.extensions.common.ListChangesOption;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Change.Status;
+import com.google.gerrit.server.api.accounts.AccountInfoMapper;
import com.google.gerrit.server.change.ChangeJson;
import java.util.EnumSet;
@@ -87,8 +87,9 @@
o.mergeable = i.mergeable;
o.insertions = i.insertions;
o.deletions = i.deletions;
- o.owner = fromAcountInfo(i.owner);
+ o.owner = AccountInfoMapper.fromAcountInfo(i.owner);
o.currentRevision = i.currentRevision;
+ o._number = i._number;
}
private void mapMessages(ChangeJson.ChangeInfo i, ChangeInfo o) {
@@ -97,7 +98,7 @@
for (ChangeJson.ChangeMessageInfo m : i.messages) {
ChangeMessageInfo cmi = new ChangeMessageInfo();
cmi.id = m.id;
- cmi.author = fromAcountInfo(m.author);
+ cmi.author = AccountInfoMapper.fromAcountInfo(m.author);
cmi.date = m.date;
cmi.message = m.message;
cmi._revisionNumber = m._revisionNumber;
@@ -111,11 +112,12 @@
for (Map.Entry<String, ChangeJson.LabelInfo> e : i.labels.entrySet()) {
ChangeJson.LabelInfo li = e.getValue();
LabelInfo lo = new LabelInfo();
- lo.approved = fromAcountInfo(li.approved);
- lo.rejected = fromAcountInfo(li.rejected);
- lo.recommended = fromAcountInfo(li.recommended);
- lo.disliked = fromAcountInfo(li.disliked);
+ lo.approved = AccountInfoMapper.fromAcountInfo(li.approved);
+ lo.rejected = AccountInfoMapper.fromAcountInfo(li.rejected);
+ lo.recommended = AccountInfoMapper.fromAcountInfo(li.recommended);
+ lo.disliked = AccountInfoMapper.fromAcountInfo(li.disliked);
lo.value = li.value;
+ lo.defaultValue = li.defaultValue;
lo.optional = li.optional;
lo.blocking = li.blocking;
lo.values = li.values;
@@ -138,25 +140,7 @@
ApprovalInfo ao = new ApprovalInfo();
ao.value = ai.value;
ao.date = ai.date;
- fromAccount(ai, ao);
+ AccountInfoMapper.fromAccount(ai, ao);
return ao;
}
-
- private static AccountInfo fromAcountInfo(
- com.google.gerrit.server.account.AccountInfo i) {
- if (i == null) {
- return null;
- }
- AccountInfo ai = new AccountInfo();
- fromAccount(i, ai);
- return ai;
- }
-
- private static void fromAccount(
- com.google.gerrit.server.account.AccountInfo i, AccountInfo ai) {
- ai._accountId = i._accountId;
- ai.email = i.email;
- ai.name = i.name;
- ai.username = i.username;
- }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java
index fdd0817..27493dd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java
@@ -26,7 +26,7 @@
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
-class ChangesImpl implements Changes {
+class ChangesImpl extends Changes.NotImplemented implements Changes {
private final ChangesCollection changes;
private final ChangeApiImpl.Factory api;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
index a9253c3..b965c18 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
@@ -29,6 +29,7 @@
import com.google.gerrit.server.change.Rebase;
import com.google.gerrit.server.change.RevisionResource;
import com.google.gerrit.server.change.Submit;
+import com.google.gerrit.server.changedetail.RebaseChange;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -36,7 +37,7 @@
import java.io.IOException;
-class RevisionApiImpl implements RevisionApi {
+class RevisionApiImpl extends RevisionApi.NotImplemented implements RevisionApi {
interface Factory {
RevisionApiImpl create(RevisionResource r);
}
@@ -45,6 +46,7 @@
private final Provider<CherryPick> cherryPick;
private final Provider<DeleteDraftPatchSet> deleteDraft;
private final Provider<Rebase> rebase;
+ private final Provider<RebaseChange> rebaseChange;
private final Provider<PostReview> review;
private final Provider<Submit> submit;
private final Provider<Publish> publish;
@@ -55,6 +57,7 @@
Provider<CherryPick> cherryPick,
Provider<DeleteDraftPatchSet> deleteDraft,
Provider<Rebase> rebase,
+ Provider<RebaseChange> rebaseChange,
Provider<PostReview> review,
Provider<Submit> submit,
Provider<Publish> publish,
@@ -63,6 +66,7 @@
this.cherryPick = cherryPick;
this.deleteDraft = deleteDraft;
this.rebase = rebase;
+ this.rebaseChange = rebaseChange;
this.review = review;
this.submit = submit;
this.publish = publish;
@@ -122,6 +126,11 @@
}
@Override
+ public boolean canRebase() {
+ return rebaseChange.get().canRebase(revision);
+ }
+
+ @Override
public ChangeApi cherryPick(CherryPickInput in) throws RestApiException {
try {
return changes.id(cherryPick.get().apply(revision, in)._number);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java
index 39166c3..f4dc67e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/BranchApiImpl.java
@@ -24,7 +24,7 @@
import java.io.IOException;
-public class BranchApiImpl implements BranchApi {
+public class BranchApiImpl extends BranchApi.NotImplemented implements BranchApi {
interface Factory {
BranchApiImpl create(ProjectResource project, String ref);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
index 14b05b6..7f73a38 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectApiImpl.java
@@ -14,29 +14,111 @@
package com.google.gerrit.server.api.projects;
+import com.google.common.base.Preconditions;
+import com.google.gerrit.common.errors.ProjectCreationFailedException;
import com.google.gerrit.extensions.api.projects.BranchApi;
import com.google.gerrit.extensions.api.projects.ProjectApi;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
+import com.google.gerrit.server.project.CreateProject;
+import com.google.gerrit.server.project.ProjectJson;
import com.google.gerrit.server.project.ProjectResource;
-import com.google.inject.Inject;
+import com.google.gerrit.server.project.ProjectsCollection;
+import com.google.inject.Provider;
import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
-public class ProjectApiImpl implements ProjectApi {
+import java.io.IOException;
+
+public class ProjectApiImpl extends ProjectApi.NotImplemented implements ProjectApi {
interface Factory {
ProjectApiImpl create(ProjectResource project);
+ ProjectApiImpl create(String name);
}
+ private final Provider<CreateProject.Factory> createProjectFactory;
+ private final ProjectApiImpl.Factory projectApi;
+ private final ProjectsCollection projects;
private final ProjectResource project;
+ private final ProjectJson projectJson;
+ private final String name;
private final BranchApiImpl.Factory branchApi;
- @Inject
- ProjectApiImpl(
+ @AssistedInject
+ ProjectApiImpl(Provider<CreateProject.Factory> createProjectFactory,
+ ProjectApiImpl.Factory projectApi,
+ ProjectsCollection projects,
+ ProjectJson projectJson,
BranchApiImpl.Factory branchApiFactory,
@Assisted ProjectResource project) {
+ this(createProjectFactory, projectApi, projects, projectJson,
+ branchApiFactory, project, null);
+ }
+
+ @AssistedInject
+ ProjectApiImpl(Provider<CreateProject.Factory> createProjectFactory,
+ ProjectApiImpl.Factory projectApi,
+ ProjectsCollection projects,
+ ProjectJson projectJson,
+ BranchApiImpl.Factory branchApiFactory,
+ @Assisted String name) {
+ this(createProjectFactory, projectApi, projects, projectJson,
+ branchApiFactory, null, name);
+ }
+
+ private ProjectApiImpl(Provider<CreateProject.Factory> createProjectFactory,
+ ProjectApiImpl.Factory projectApi,
+ ProjectsCollection projects,
+ ProjectJson projectJson,
+ BranchApiImpl.Factory branchApiFactory,
+ ProjectResource project,
+ String name) {
+ this.createProjectFactory = createProjectFactory;
+ this.projectApi = projectApi;
+ this.projects = projects;
+ this.projectJson = projectJson;
this.project = project;
+ this.name = name;
this.branchApi = branchApiFactory;
}
@Override
+ public ProjectApi create() throws RestApiException {
+ return create(new ProjectInput());
+ }
+
+ @Override
+ public ProjectApi create(ProjectInput in) throws RestApiException {
+ try {
+ if (name == null) {
+ throw new ResourceConflictException("Project already exists");
+ }
+ if (in.name != null && !name.equals(in.name)) {
+ throw new BadRequestException("name must match input.name");
+ }
+ createProjectFactory.get().create(name)
+ .apply(TopLevelResource.INSTANCE, in);
+ return projectApi.create(projects.parse(name));
+ } catch (BadRequestException | UnprocessableEntityException
+ | ResourceNotFoundException | ProjectCreationFailedException
+ | IOException e) {
+ throw new RestApiException("Cannot create project: " + e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public ProjectInfo get() {
+ Preconditions.checkNotNull(project);
+ return projectJson.format(project);
+ }
+
+ @Override
public BranchApi branch(String ref) {
return branchApi.create(project, ref);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java
index bd5e2ac..71f2730 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/ProjectsImpl.java
@@ -23,7 +23,7 @@
import java.io.IOException;
-class ProjectsImpl implements Projects {
+class ProjectsImpl extends Projects.NotImplemented implements Projects {
private final ProjectsCollection projects;
private final ProjectApiImpl.Factory api;
@@ -37,7 +37,9 @@
public ProjectApi name(String name) throws RestApiException {
try {
return api.create(projects.parse(name));
- } catch (IOException | UnprocessableEntityException e) {
+ } catch (UnprocessableEntityException e) {
+ return api.create(name);
+ } catch (IOException e) {
throw new RestApiException("Cannot retrieve project");
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/InternalAuthBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/InternalAuthBackend.java
index 6e9e71b..0b4baf2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/InternalAuthBackend.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/InternalAuthBackend.java
@@ -14,6 +14,7 @@
package com.google.gerrit.server.auth;
+import com.google.common.base.Strings;
import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.account.AccountState;
import com.google.gerrit.server.config.AuthConfig;
@@ -42,7 +43,8 @@
public AuthUser authenticate(AuthRequest req)
throws MissingCredentialsException, InvalidCredentialsException,
UnknownUserException, UserNotAllowedException, AuthException {
- if (req.getUsername() == null || req.getPassword() == null) {
+ if (Strings.isNullOrEmpty(req.getUsername())
+ || Strings.isNullOrEmpty(req.getPassword())) {
throw new MissingCredentialsException();
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java
index afefe6f..5a19814 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/Helper.java
@@ -169,10 +169,10 @@
LdapQuery.Result findAccount(final Helper.LdapSchema schema,
final DirContext ctx, final String username) throws NamingException,
AccountException {
- final HashMap<String, String> params = new HashMap<String, String>();
+ final HashMap<String, String> params = new HashMap<>();
params.put(LdapRealm.USERNAME, username);
- final List<LdapQuery.Result> res = new ArrayList<LdapQuery.Result>();
+ final List<LdapQuery.Result> res = new ArrayList<>();
for (LdapQuery accountQuery : schema.accountQueryList) {
res.addAll(accountQuery.query(ctx, params));
}
@@ -193,10 +193,10 @@
final String username, LdapQuery.Result account)
throws NamingException, AccountException {
final LdapSchema schema = getSchema(ctx);
- final Set<String> groupDNs = new HashSet<String>();
+ final Set<String> groupDNs = new HashSet<>();
if (!schema.groupMemberQueryList.isEmpty()) {
- final HashMap<String, String> params = new HashMap<String, String>();
+ final HashMap<String, String> params = new HashMap<>();
if (account == null) {
try {
@@ -244,7 +244,7 @@
}
}
- final Set<AccountGroup.UUID> actual = new HashSet<AccountGroup.UUID>();
+ final Set<AccountGroup.UUID> actual = new HashSet<>();
for (String dn : groupDNs) {
actual.add(new AccountGroup.UUID(LDAP_UUID + dn));
}
@@ -305,10 +305,10 @@
LdapSchema(final DirContext ctx) {
type = discoverLdapType(ctx);
- groupMemberQueryList = new ArrayList<LdapQuery>();
- accountQueryList = new ArrayList<LdapQuery>();
+ groupMemberQueryList = new ArrayList<>();
+ accountQueryList = new ArrayList<>();
- final Set<String> accountAtts = new HashSet<String>();
+ final Set<String> accountAtts = new HashSet<>();
// Group query
//
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java
index 26c1c7a..7731b7d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java
@@ -227,7 +227,7 @@
ParameterizedString filter = ParameterizedString.asis(
schema.groupPattern.replace(GROUPNAME, name).toString());
Set<String> returnAttrs =
- new HashSet<String>(schema.groupName.getParameterNames());
+ new HashSet<>(schema.groupName.getParameterNames());
Map<String, String> params = Collections.emptyMap();
for (String groupBase : schema.groupBases) {
LdapQuery query = new LdapQuery(
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapQuery.java
index 8a6dfeb..1f68011 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapQuery.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapQuery.java
@@ -69,7 +69,7 @@
sc.setReturningAttributes(returnAttributes);
res = ctx.search(base, pattern.getRawPattern(), pattern.bind(params), sc);
try {
- final List<Result> r = new ArrayList<Result>();
+ final List<Result> r = new ArrayList<>();
try {
while (res.hasMore()) {
r.add(new Result(res.next()));
@@ -83,7 +83,7 @@
}
class Result {
- private final Map<String, Attribute> atts = new HashMap<String, Attribute>();
+ private final Map<String, Attribute> atts = new HashMap<>();
Result(final SearchResult sr) {
if (returnAttributes != null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
index 7cde019..84b5277 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
@@ -88,7 +88,7 @@
this.membershipCache = membershipCache;
this.config = config;
- this.readOnlyAccountFields = new HashSet<Account.FieldName>();
+ this.readOnlyAccountFields = new HashSet<>();
if (optdef(config, "accountFullName", "DEFAULT") != null) {
readOnlyAccountFields.add(Account.FieldName.FULL_NAME);
@@ -174,7 +174,7 @@
return null;
}
- final Map<String, String> values = new HashMap<String, String>();
+ final Map<String, String> values = new HashMap<>();
for (final String name : m.attributes()) {
values.put(name, m.get(name));
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheModule.java
index c093380..2276def 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheModule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheModule.java
@@ -83,8 +83,7 @@
@SuppressWarnings("unchecked")
Key<Cache<K, V>> key = (Key<Cache<K, V>>) Key.get(type, Names.named(name));
- CacheProvider<K, V> m =
- new CacheProvider<K, V>(this, name, keyType, valType);
+ CacheProvider<K, V> m = new CacheProvider<>(this, name, keyType, valType);
bind(key).toProvider(m).asEagerSingleton();
bind(ANY_CACHE).annotatedWith(Exports.named(name)).to(key);
return m.maximumWeight(1024);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCacheFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCacheFactory.java
index 983e956..0769b2a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCacheFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/PersistentCacheFactory.java
@@ -17,6 +17,7 @@
import com.google.common.cache.Cache;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
+import com.google.gerrit.server.plugins.Plugin;
public interface PersistentCacheFactory {
<K, V> Cache<K, V> build(CacheBinding<K, V> def);
@@ -24,4 +25,6 @@
<K, V> LoadingCache<K, V> build(
CacheBinding<K, V> def,
CacheLoader<K, V> loader);
+
+ void onStop(Plugin plugin);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ArchiveFormat.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ArchiveFormat.java
index e7d05df..a5054f3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ArchiveFormat.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ArchiveFormat.java
@@ -14,20 +14,13 @@
package com.google.gerrit.server.change;
-import com.google.common.collect.Maps;
-
import org.eclipse.jgit.api.ArchiveCommand;
import org.eclipse.jgit.archive.TarFormat;
import org.eclipse.jgit.archive.Tbz2Format;
import org.eclipse.jgit.archive.TgzFormat;
import org.eclipse.jgit.archive.TxzFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import java.util.Collections;
-import java.util.Map;
-
-enum ArchiveFormat {
+public enum ArchiveFormat {
TGZ("application/x-gzip", new TgzFormat()),
TAR("application/x-tar", new TarFormat()),
TBZ2("application/x-bzip2", new Tbz2Format()),
@@ -35,8 +28,6 @@
// 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.
- static final Logger log = LoggerFactory.getLogger(ArchiveFormat.class);
-
private final ArchiveCommand.Format<?> format;
private final String mimeType;
@@ -46,7 +37,7 @@
ArchiveCommand.registerFormat(name(), format);
}
- String getShortName() {
+ public String getShortName() {
return name().toLowerCase();
}
@@ -61,24 +52,4 @@
Iterable<String> getSuffixes() {
return format.suffixes();
}
-
- static Map<String, ArchiveFormat> init() {
- String[] formats = new String[values().length];
- for (int i = 0; i < values().length; i++) {
- formats[i] = values()[i].name();
- }
-
- Map<String, ArchiveFormat> exts = Maps.newLinkedHashMap();
- for (String name : formats) {
- try {
- ArchiveFormat format = valueOf(name.toUpperCase());
- for (String ext : format.getSuffixes()) {
- exts.put(ext, format);
- }
- } catch (IllegalArgumentException e) {
- log.warn("Invalid archive.format {}", name);
- }
- }
- return Collections.unmodifiableMap(exts);
- }
}
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 ad6b804..4ba8801 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
@@ -28,6 +28,7 @@
import static com.google.gerrit.extensions.common.ListChangesOption.LABELS;
import static com.google.gerrit.extensions.common.ListChangesOption.MESSAGES;
import static com.google.gerrit.extensions.common.ListChangesOption.REVIEWED;
+import static com.google.gerrit.extensions.common.ListChangesOption.WEB_LINKS;
import com.google.common.base.Joiner;
import com.google.common.base.Objects;
@@ -40,7 +41,6 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.LinkedHashMultimap;
-import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
@@ -59,6 +59,7 @@
import com.google.gerrit.extensions.common.GitPerson;
import com.google.gerrit.extensions.common.ListChangesOption;
import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
import com.google.gerrit.extensions.config.DownloadCommand;
import com.google.gerrit.extensions.config.DownloadScheme;
import com.google.gerrit.extensions.registration.DynamicMap;
@@ -79,6 +80,7 @@
import com.google.gerrit.server.AnonymousUser;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.WebLinks;
import com.google.gerrit.server.account.AccountInfo;
import com.google.gerrit.server.extensions.webui.UiActions;
import com.google.gerrit.server.git.LabelNormalizer;
@@ -86,7 +88,6 @@
import com.google.gerrit.server.patch.PatchSetInfoFactory;
import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException;
import com.google.gerrit.server.project.ChangeControl;
-import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.project.ProjectControl;
import com.google.gerrit.server.query.change.ChangeData;
@@ -152,6 +153,7 @@
private ChangeControl lastControl;
private Set<Change.Id> reviewed;
private LoadingCache<Project.NameKey, ProjectControl> projectControls;
+ private Provider<WebLinks> webLinks;
@Inject
ChangeJson(
@@ -169,7 +171,8 @@
DynamicMap<DownloadScheme> downloadSchemes,
DynamicMap<DownloadCommand> downloadCommands,
DynamicMap<RestView<ChangeResource>> changeViews,
- Revisions revisions) {
+ Revisions revisions,
+ Provider<WebLinks> webLinks) {
this.db = db;
this.labelNormalizer = ln;
this.userProvider = user;
@@ -185,6 +188,7 @@
this.downloadCommands = downloadCommands;
this.changeViews = changeViews;
this.revisions = revisions;
+ this.webLinks = webLinks;
options = EnumSet.noneOf(ListChangesOption.class);
projectControls = CacheBuilder.newBuilder()
@@ -320,15 +324,17 @@
}
out.removableReviewers = removableReviewers(cd, out.labels.values());
}
+
+ Map<PatchSet.Id, PatchSet> src = loadPatchSets(cd, limitToPsId);
if (has(MESSAGES)) {
- out.messages = messages(cd);
+ out.messages = messages(cd, src);
}
out.finish();
if (has(ALL_REVISIONS)
|| has(CURRENT_REVISION)
|| limitToPsId.isPresent()) {
- out.revisions = revisions(cd, limitToPsId);
+ out.revisions = revisions(cd, limitToPsId, out.project, src);
if (out.revisions != null) {
for (Map.Entry<String, RevisionInfo> entry : out.revisions.entrySet()) {
if (entry.getValue().isCurrent) {
@@ -365,7 +371,7 @@
ctrl = projectControls.get(cd.change().getProject())
.controlFor(cd.change());
}
- } catch (NoSuchChangeException | ExecutionException e) {
+ } catch (ExecutionException e) {
throw new OrmException(e);
}
lastControl = ctrl;
@@ -438,8 +444,7 @@
private Map<String, LabelInfo> initLabels(ChangeData cd,
LabelTypes labelTypes, boolean standard) throws OrmException {
// Don't use Maps.newTreeMap(Comparator) due to OpenJDK bug 100167.
- Map<String, LabelInfo> labels =
- new TreeMap<String, LabelInfo>(labelTypes.nameComparator());
+ Map<String, LabelInfo> labels = new TreeMap<>(labelTypes.nameComparator());
for (SubmitRecord rec : submitRecords(cd)) {
if (rec.labels == null) {
continue;
@@ -505,22 +510,18 @@
return;
}
- // All users ever added, even if they can't vote on one or all labels.
+ // Include a user in the output for this label if either:
+ // - They are an explicit reviewer.
+ // - They ever voted on this change.
Set<Account.Id> allUsers = Sets.newHashSet();
- ListMultimap<PatchSet.Id, PatchSetApproval> allApprovals =
- cd.approvals();
- for (PatchSetApproval psa : allApprovals.values()) {
+ allUsers.addAll(cd.reviewers().values());
+ for (PatchSetApproval psa : cd.approvals().values()) {
allUsers.add(psa.getAccountId());
}
- List<PatchSetApproval> currentList =
- allApprovals.get(baseCtrl.getChange().currentPatchSetId());
- // Most recent, normalized vote on each label for the current patch set by
- // each user (may be 0).
Table<Account.Id, String, PatchSetApproval> current = HashBasedTable.create(
allUsers.size(), baseCtrl.getLabelTypes().getLabelTypes().size());
- for (PatchSetApproval psa :
- labelNormalizer.normalize(baseCtrl, currentList).getNormalized()) {
+ for (PatchSetApproval psa : cd.currentApprovals()) {
current.put(psa.getAccountId(), psa.getLabel(), psa);
}
@@ -541,9 +542,9 @@
value = Integer.valueOf(psa.getValue());
date = psa.getGranted();
} else {
- // Either the user cannot vote on this label, or there just wasn't a
- // dummy approval for this label. Explicitly check whether the user
- // can vote on this label.
+ // Either the user cannot vote on this label, or they were added as a
+ // reviewer but have not responded yet. Explicitly check whether the
+ // user can vote on this label.
value = labelNormalizer.canVote(ctl, lt, accountId) ? 0 : null;
}
e.getValue().addApproval(approvalInfo(accountId, value, date));
@@ -573,8 +574,7 @@
// would have done. These should really come from a stored submit record.
//
// Don't use Maps.newTreeMap(Comparator) due to OpenJDK bug 100167.
- Map<String, LabelInfo> labels =
- new TreeMap<String, LabelInfo>(labelTypes.nameComparator());
+ Map<String, LabelInfo> labels = new TreeMap<>(labelTypes.nameComparator());
for (String name : labelNames) {
LabelType type = labelTypes.byLabel(name);
LabelInfo li = new LabelInfo();
@@ -632,6 +632,7 @@
}
private void setLabelValues(LabelType type, LabelInfo label) {
+ label.defaultValue = type.getDefaultValue();
label.values = Maps.newLinkedHashMap();
for (LabelValue v : type.getValues()) {
label.values.put(v.formatValue(), v.getText());
@@ -681,8 +682,14 @@
return permitted.asMap();
}
- private Collection<ChangeMessageInfo> messages(ChangeData cd)
+ private Collection<ChangeMessageInfo> messages(ChangeData cd,
+ Map<PatchSet.Id, PatchSet> map)
throws OrmException {
+ ChangeControl ctl = control(cd);
+ if (ctl == null) {
+ return null;
+ }
+
List<ChangeMessage> messages =
db.get().changeMessages().byChange(cd.getId()).toList();
if (messages.isEmpty()) {
@@ -701,14 +708,16 @@
Lists.newArrayListWithCapacity(messages.size());
for (ChangeMessage message : messages) {
PatchSet.Id patchNum = message.getPatchSetId();
-
- ChangeMessageInfo cmi = new ChangeMessageInfo();
- cmi.id = message.getKey().get();
- cmi.author = accountLoader.get(message.getAuthor());
- cmi.date = message.getWrittenOn();
- cmi.message = message.getMessage();
- cmi._revisionNumber = patchNum != null ? patchNum.get() : null;
- result.add(cmi);
+ PatchSet ps = patchNum != null ? map.get(patchNum) : null;
+ if (patchNum == null || ctl.isPatchVisible(ps, db.get())) {
+ ChangeMessageInfo cmi = new ChangeMessageInfo();
+ cmi.id = message.getKey().get();
+ cmi.author = accountLoader.get(message.getAuthor());
+ cmi.date = message.getWrittenOn();
+ cmi.message = message.getMessage();
+ cmi._revisionNumber = patchNum != null ? patchNum.get() : null;
+ result.add(cmi);
+ }
}
return result;
}
@@ -790,14 +799,26 @@
}
private Map<String, RevisionInfo> revisions(ChangeData cd,
- Optional<PatchSet.Id> limitToPsId) throws OrmException {
+ Optional<PatchSet.Id> limitToPsId, String project,
+ Map<PatchSet.Id, PatchSet> map) throws OrmException {
ChangeControl ctl = control(cd);
if (ctl == null) {
return null;
}
+ Map<String, RevisionInfo> res = Maps.newLinkedHashMap();
+ for (PatchSet in : map.values()) {
+ if (ctl.isPatchVisible(in, db.get())) {
+ res.put(in.getRevision().get(), toRevisionInfo(cd, in, project));
+ }
+ }
+ return res;
+ }
+
+ private Map<PatchSet.Id, PatchSet> loadPatchSets(ChangeData cd,
+ Optional<PatchSet.Id> limitToPsId) throws OrmException {
Collection<PatchSet> src;
- if (has(ALL_REVISIONS)) {
+ if (has(ALL_REVISIONS) || has(MESSAGES)) {
src = cd.patches();
} else {
PatchSet ps;
@@ -815,17 +836,14 @@
}
src = Collections.singletonList(ps);
}
-
- Map<String, RevisionInfo> res = Maps.newLinkedHashMap();
- for (PatchSet in : src) {
- if (ctl.isPatchVisible(in, db.get())) {
- res.put(in.getRevision().get(), toRevisionInfo(cd, in));
- }
+ Map<PatchSet.Id, PatchSet> map = Maps.newHashMapWithExpectedSize(src.size());
+ for (PatchSet patchSet : src) {
+ map.put(patchSet.getId(), patchSet);
}
- return res;
+ return map;
}
- private RevisionInfo toRevisionInfo(ChangeData cd, PatchSet in)
+ private RevisionInfo toRevisionInfo(ChangeData cd, PatchSet in, String project)
throws OrmException {
RevisionInfo out = new RevisionInfo();
out.isCurrent = in.getId().equals(cd.change().currentPatchSetId());
@@ -873,6 +891,13 @@
: null;
}
+ if (has(WEB_LINKS)) {
+ out.webLinks = Lists.newArrayList();
+ for (WebLinks.Link link : webLinks.get().getPatchSetLinks(
+ project, in.getRevision().get())) {
+ out.webLinks.add(new WebLinkInfo(link.name, link.url));
+ }
+ }
return out;
}
@@ -885,7 +910,6 @@
commit.committer = toGitPerson(info.getCommitter());
commit.subject = info.getSubject();
commit.message = info.getMessage();
-
for (ParentInfo parent : info.getParents()) {
CommitInfo i = new CommitInfo();
i.commit = parent.id.get();
@@ -1002,6 +1026,7 @@
public Map<String, String> values;
public Short value;
+ public Short defaultValue;
public Boolean optional;
public Boolean blocking;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCache.java
index f6e5773..0e0984d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCache.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCache.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2013 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -14,32 +14,10 @@
package com.google.gerrit.server.change;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.base.Objects;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.gerrit.server.cache.CacheModule;
-import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.git.MergeUtil;
import com.google.gerrit.server.project.ProjectState;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.merge.ThreeWayMerger;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.concurrent.ExecutionException;
/**
* Cache of {@link ChangeKind} per commit.
@@ -47,149 +25,7 @@
* This is immutable conditioned on the merge strategy (unless the JGit strategy
* implementation changes, which might invalidate old entries).
*/
-public class ChangeKindCache {
- private static final Logger log =
- LoggerFactory.getLogger(ChangeKindCache.class);
-
- private static final String ID_CACHE = "change_kind";
-
- public static Module module() {
- return new CacheModule() {
- @Override
- protected void configure() {
- cache(ID_CACHE,
- Key.class,
- ChangeKind.class)
- .maximumWeight(0)
- .loader(Loader.class);
- }
- };
- }
-
- public static class Key implements Serializable {
- private static final long serialVersionUID = 1L;
-
- private final ObjectId prior;
- private final ObjectId next;
- private final String strategyName;
- private transient Repository repo;
-
- private Key(ObjectId prior, ObjectId next, String strategyName,
- Repository repo) {
- this.prior = prior.copy();
- this.next = next.copy();
- this.strategyName = strategyName;
- this.repo = repo;
- }
-
- public ObjectId getPrior() {
- return prior;
- }
-
- public ObjectId getNext() {
- return next;
- }
-
- public String getStrategyName() {
- return strategyName;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof Key) {
- Key k = (Key) o;
- return Objects.equal(prior, k.prior)
- && Objects.equal(next, k.next)
- && Objects.equal(strategyName, k.strategyName);
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(prior, next, strategyName);
- }
- }
-
- @Singleton
- private static class Loader extends CacheLoader<Key, ChangeKind> {
- @Override
- public ChangeKind load(Key key) throws IOException {
- RevWalk walk = new RevWalk(key.repo);
- try {
- RevCommit prior = walk.parseCommit(key.prior);
- walk.parseBody(prior);
- RevCommit next = walk.parseCommit(key.next);
- walk.parseBody(next);
-
- if (!next.getFullMessage().equals(prior.getFullMessage())) {
- if (next.getTree() == prior.getTree() && isSameParents(prior, next)) {
- return ChangeKind.NO_CODE_CHANGE;
- } else {
- return ChangeKind.REWORK;
- }
- }
-
- if (prior.getParentCount() != 1 || next.getParentCount() != 1) {
- // Trivial rebases done by machine only work well on 1 parent.
- return ChangeKind.REWORK;
- }
-
- if (next.getTree() == prior.getTree() &&
- isSameParents(prior, next)) {
- return ChangeKind.TRIVIAL_REBASE;
- }
-
- // A trivial rebase can be detected by looking for the next commit
- // having the same tree as would exist when the prior commit is
- // cherry-picked onto the next commit's new first parent.
- ThreeWayMerger merger = MergeUtil.newThreeWayMerger(
- key.repo, MergeUtil.createDryRunInserter(), key.strategyName);
- merger.setBase(prior.getParent(0));
- if (merger.merge(next.getParent(0), prior)
- && merger.getResultTreeId().equals(next.getTree())) {
- return ChangeKind.TRIVIAL_REBASE;
- } else {
- return ChangeKind.REWORK;
- }
- } finally {
- key.repo = null;
- walk.release();
- }
- }
-
- private static boolean isSameParents(RevCommit prior, RevCommit next) {
- if (prior.getParentCount() != next.getParentCount()) {
- return false;
- } else if (prior.getParentCount() == 0) {
- return true;
- }
- return prior.getParent(0).equals(next.getParent(0));
- }
- }
-
- private final LoadingCache<Key, ChangeKind> cache;
- private final boolean useRecursiveMerge;
-
- @Inject
- ChangeKindCache(
- @GerritServerConfig Config serverConfig,
- @Named(ID_CACHE) LoadingCache<Key, ChangeKind> cache) {
- this.cache = cache;
- this.useRecursiveMerge = MergeUtil.useRecursiveMerge(serverConfig);
- }
-
+public interface ChangeKindCache {
public ChangeKind getChangeKind(ProjectState project, Repository repo,
- ObjectId prior, ObjectId next) {
- checkNotNull(next, "next");
- String strategyName = MergeUtil.mergeStrategyName(
- project.isUseContentMerge(), useRecursiveMerge);
- try {
- return cache.get(new Key(prior, next, strategyName, repo));
- } catch (ExecutionException e) {
- log.warn("Cannot check trivial rebase of new patch set " + next.name()
- + " in " + project.getProject().getName(), e);
- return ChangeKind.REWORK;
- }
- }
+ ObjectId prior, ObjectId next);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java
new file mode 100644
index 0000000..220dcb6
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java
@@ -0,0 +1,247 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.change;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.eclipse.jgit.lib.ObjectIdSerialization.readNotNull;
+import static org.eclipse.jgit.lib.ObjectIdSerialization.writeNotNull;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Objects;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.cache.Weigher;
+import com.google.gerrit.server.cache.CacheModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.git.MergeUtil;
+import com.google.gerrit.server.project.ProjectState;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.google.inject.Singleton;
+import com.google.inject.name.Named;
+
+import org.eclipse.jgit.lib.Config;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.merge.ThreeWayMerger;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.concurrent.ExecutionException;
+
+public class ChangeKindCacheImpl implements ChangeKindCache {
+ private static final Logger log =
+ LoggerFactory.getLogger(ChangeKindCacheImpl.class);
+
+ private static final String ID_CACHE = "change_kind";
+
+ public static Module module() {
+ return new CacheModule() {
+ @Override
+ protected void configure() {
+ bind(ChangeKindCache.class).to(ChangeKindCacheImpl.class);
+ persist(ID_CACHE, Key.class, ChangeKind.class)
+ .maximumWeight(2 << 20)
+ .weigher(ChangeKindWeigher.class)
+ .loader(Loader.class);
+ }
+ };
+ }
+
+ @VisibleForTesting
+ public static class NoCache implements ChangeKindCache {
+ private final boolean useRecursiveMerge;
+
+ @Inject
+ NoCache(
+ @GerritServerConfig Config serverConfig) {
+ this.useRecursiveMerge = MergeUtil.useRecursiveMerge(serverConfig);
+ }
+
+ @Override
+ public ChangeKind getChangeKind(ProjectState project, Repository repo,
+ ObjectId prior, ObjectId next) {
+ try {
+ return new Loader().load(
+ new Key(project, repo, prior, next, useRecursiveMerge));
+ } catch (IOException e) {
+ log.warn("Cannot check trivial rebase of new patch set " + next.name()
+ + " in " + project.getProject().getName(), e);
+ return ChangeKind.REWORK;
+ }
+ }
+ }
+
+ public static class Key implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private transient ObjectId prior;
+ private transient ObjectId next;
+ private transient String strategyName;
+
+ private transient Repository repo; // Passed through to loader on miss.
+
+ private Key(ProjectState project, Repository repo, ObjectId prior,
+ ObjectId next, boolean useRecursiveMerge) {
+ checkNotNull(next, "next");
+ String strategyName = MergeUtil.mergeStrategyName(
+ project.isUseContentMerge(), useRecursiveMerge);
+ this.prior = prior.copy();
+ this.next = next.copy();
+ this.strategyName = strategyName;
+ this.repo = repo;
+ }
+
+ public Key(ObjectId prior, ObjectId next, String strategyName) {
+ this.prior = prior;
+ this.next = next;
+ this.strategyName = strategyName;
+ }
+
+ public ObjectId getPrior() {
+ return prior;
+ }
+
+ public ObjectId getNext() {
+ return next;
+ }
+
+ public String getStrategyName() {
+ return strategyName;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof Key) {
+ Key k = (Key) o;
+ return Objects.equal(prior, k.prior)
+ && Objects.equal(next, k.next)
+ && Objects.equal(strategyName, k.strategyName);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(prior, next, strategyName);
+ }
+
+ private void writeObject(ObjectOutputStream out) throws IOException {
+ writeNotNull(out, prior);
+ writeNotNull(out, next);
+ out.writeUTF(strategyName);
+ }
+
+ private void readObject(ObjectInputStream in) throws IOException {
+ prior = readNotNull(in);
+ next = readNotNull(in);
+ strategyName = in.readUTF();
+ }
+ }
+
+ @Singleton
+ private static class Loader extends CacheLoader<Key, ChangeKind> {
+ @Override
+ public ChangeKind load(Key key) throws IOException {
+ RevWalk walk = new RevWalk(key.repo);
+ try {
+ RevCommit prior = walk.parseCommit(key.prior);
+ walk.parseBody(prior);
+ RevCommit next = walk.parseCommit(key.next);
+ walk.parseBody(next);
+
+ if (!next.getFullMessage().equals(prior.getFullMessage())) {
+ if (next.getTree() == prior.getTree() && isSameParents(prior, next)) {
+ return ChangeKind.NO_CODE_CHANGE;
+ } else {
+ return ChangeKind.REWORK;
+ }
+ }
+
+ if (prior.getParentCount() != 1 || next.getParentCount() != 1) {
+ // Trivial rebases done by machine only work well on 1 parent.
+ return ChangeKind.REWORK;
+ }
+
+ if (next.getTree() == prior.getTree() &&
+ isSameParents(prior, next)) {
+ return ChangeKind.TRIVIAL_REBASE;
+ }
+
+ // A trivial rebase can be detected by looking for the next commit
+ // having the same tree as would exist when the prior commit is
+ // cherry-picked onto the next commit's new first parent.
+ ThreeWayMerger merger = MergeUtil.newThreeWayMerger(
+ key.repo, MergeUtil.createDryRunInserter(), key.strategyName);
+ merger.setBase(prior.getParent(0));
+ if (merger.merge(next.getParent(0), prior)
+ && merger.getResultTreeId().equals(next.getTree())) {
+ return ChangeKind.TRIVIAL_REBASE;
+ } else {
+ return ChangeKind.REWORK;
+ }
+ } finally {
+ key.repo = null;
+ walk.release();
+ }
+ }
+
+ private static boolean isSameParents(RevCommit prior, RevCommit next) {
+ if (prior.getParentCount() != next.getParentCount()) {
+ return false;
+ } else if (prior.getParentCount() == 0) {
+ return true;
+ }
+ return prior.getParent(0).equals(next.getParent(0));
+ }
+ }
+
+ public static class ChangeKindWeigher implements Weigher<Key, ChangeKind> {
+ @Override
+ public int weigh(Key key, ChangeKind changeKind) {
+ return 16 + 2*36 + 2*key.strategyName.length() // Size of Key, 64 bit JVM
+ + 2*changeKind.name().length(); // Size of ChangeKind, 64 bit JVM
+ }
+ }
+
+ private final LoadingCache<Key, ChangeKind> cache;
+ private final boolean useRecursiveMerge;
+
+ @Inject
+ ChangeKindCacheImpl(
+ @GerritServerConfig Config serverConfig,
+ @Named(ID_CACHE) LoadingCache<Key, ChangeKind> cache) {
+ this.cache = cache;
+ this.useRecursiveMerge = MergeUtil.useRecursiveMerge(serverConfig);
+ }
+
+ @Override
+ public ChangeKind getChangeKind(ProjectState project, Repository repo,
+ ObjectId prior, ObjectId next) {
+ try {
+ return cache.get(new Key(project, repo, prior, next, useRecursiveMerge));
+ } catch (ExecutionException e) {
+ log.warn("Cannot check trivial rebase of new patch set " + next.name()
+ + " in " + project.getProject().getName(), e);
+ return ChangeKind.REWORK;
+ }
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java
index 9a4ab21..d602c47 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetArchive.java
@@ -15,14 +15,19 @@
package com.google.gerrit.server.change;
import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.BinaryResult;
import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.config.ConfigUtil;
+import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject;
+import com.google.inject.Singleton;
import org.eclipse.jgit.api.ArchiveCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
@@ -31,18 +36,60 @@
import java.io.IOException;
import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
import java.util.Map;
+import java.util.Set;
-class GetArchive implements RestReadView<RevisionResource> {
- private static final Map<String, ArchiveFormat> formats = ArchiveFormat.init();
+public class GetArchive implements RestReadView<RevisionResource> {
+ @Singleton
+ public static class AllowedFormats {
+ final ImmutableMap<String, ArchiveFormat> extensions;
+ final Set<ArchiveFormat> allowed;
+
+ @Inject
+ AllowedFormats(@GerritServerConfig Config cfg) {
+ Collection<ArchiveFormat> enabled;
+ String v = cfg.getString("download", null, "archive");
+ if (v == null) {
+ enabled = Arrays.asList(ArchiveFormat.values());
+ } else if (v.isEmpty() || "off".equalsIgnoreCase(v)) {
+ enabled = Collections.emptyList();
+ } else {
+ enabled = ConfigUtil.getEnumList(cfg,
+ "download", null, "archive",
+ ArchiveFormat.TGZ);
+ }
+
+ Map<String, ArchiveFormat> exts = new HashMap<>();
+ for (ArchiveFormat format : enabled) {
+ for (String ext : format.getSuffixes()) {
+ exts.put(ext, format);
+ }
+ exts.put(format.name().toLowerCase(), format);
+ }
+ extensions = ImmutableMap.copyOf(exts);
+ allowed = Collections.unmodifiableSet(new LinkedHashSet<>(enabled));
+ }
+
+ public Set<ArchiveFormat> getAllowed() {
+ return allowed;
+ }
+ }
+
private final GitRepositoryManager repoManager;
+ private final AllowedFormats allowedFormats;
@Option(name = "--format")
private String format;
@Inject
- GetArchive(GitRepositoryManager repoManager) {
+ GetArchive(GitRepositoryManager repoManager, AllowedFormats allowedFormats) {
this.repoManager = repoManager;
+ this.allowedFormats = allowedFormats;
}
@Override
@@ -51,7 +98,7 @@
if (Strings.isNullOrEmpty(format)) {
throw new BadRequestException("format is not specified");
}
- final ArchiveFormat f = formats.get("." + format);
+ final ArchiveFormat f = allowedFormats.extensions.get("." + format);
if (f == null) {
throw new BadRequestException("unknown archive format");
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java
index 7267f7d..1afc647 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDiff.java
@@ -31,11 +31,14 @@
import com.google.gerrit.prettify.common.SparseFileContent;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountDiffPreference;
+import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.Patch.ChangeType;
import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.server.git.LargeObjectException;
import com.google.gerrit.server.patch.PatchScriptFactory;
import com.google.gerrit.server.project.NoSuchChangeException;
-import com.google.gerrit.server.git.LargeObjectException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -55,6 +58,7 @@
import java.util.concurrent.TimeUnit;
public class GetDiff implements RestReadView<FileResource> {
+ private final ProjectCache projectCache;
private final PatchScriptFactory.Factory patchScriptFactoryFactory;
private final Provider<Revisions> revisions;
@@ -71,8 +75,10 @@
boolean intraline;
@Inject
- GetDiff(PatchScriptFactory.Factory patchScriptFactoryFactory,
+ GetDiff(ProjectCache projectCache,
+ PatchScriptFactory.Factory patchScriptFactoryFactory,
Provider<Revisions> revisions) {
+ this.projectCache = projectCache;
this.patchScriptFactoryFactory = patchScriptFactoryFactory;
this.revisions = revisions;
}
@@ -92,14 +98,15 @@
prefs.setIntralineDifference(intraline);
try {
- PatchScript ps = patchScriptFactoryFactory.create(
+ PatchScriptFactory psf = patchScriptFactoryFactory.create(
resource.getRevision().getControl(),
resource.getPatchKey().getFileName(),
basePatchSet,
resource.getPatchKey().getParentKey(),
- prefs)
- .call();
-
+ prefs);
+ psf.setLoadHistory(false);
+ psf.setLoadComments(context != AccountDiffPreference.WHOLE_FILE_CONTEXT);
+ PatchScript ps = psf.call();
Content content = new Content(ps);
for (Edit edit : ps.getEdits()) {
if (edit.getType() == Edit.Type.EMPTY) {
@@ -127,18 +134,21 @@
}
content.addCommon(ps.getA().size());
+ ProjectState state =
+ projectCache.get(resource.getRevision().getChange().getProject());
+
Result result = new Result();
if (ps.getDisplayMethodA() != DisplayMethod.NONE) {
result.metaA = new FileMeta();
result.metaA.name = Objects.firstNonNull(ps.getOldName(), ps.getNewName());
- result.metaA.setContentType(ps.getFileModeA(), ps.getMimeTypeA());
+ setContentType(result.metaA, state, ps.getFileModeA(), ps.getMimeTypeA());
result.metaA.lines = ps.getA().size();
}
if (ps.getDisplayMethodB() != DisplayMethod.NONE) {
result.metaB = new FileMeta();
result.metaB.name = ps.getNewName();
- result.metaB.setContentType(ps.getFileModeB(), ps.getMimeTypeB());
+ setContentType(result.metaB, state, ps.getFileModeB(), ps.getMimeTypeB());
result.metaB.lines = ps.getB().size();
}
@@ -182,21 +192,33 @@
String name;
String contentType;
Integer lines;
+ }
- void setContentType(FileMode fileMode, String mimeType) {
- switch (fileMode) {
- case FILE:
- contentType = mimeType;
- break;
- case GITLINK:
- contentType = "x-git/gitlink";
- break;
- case SYMLINK:
- contentType = "x-git/symlink";
- break;
- default:
- throw new IllegalStateException("file mode: " + fileMode);
- }
+ private void setContentType(FileMeta meta, ProjectState project,
+ FileMode fileMode, String mimeType) {
+ switch (fileMode) {
+ case FILE:
+ if (Patch.COMMIT_MSG.equals(meta.name)) {
+ mimeType = "text/x-gerrit-commit-message";
+ } else if (project != null) {
+ for (ProjectState p : project.tree()) {
+ String t = p.getConfig().getMimeTypes().getMimeType(meta.name);
+ if (t != null) {
+ mimeType = t;
+ break;
+ }
+ }
+ }
+ meta.contentType = mimeType;
+ break;
+ case GITLINK:
+ meta.contentType = "x-git/gitlink";
+ break;
+ case SYMLINK:
+ meta.contentType = "x-git/symlink";
+ break;
+ default:
+ throw new IllegalStateException("file mode: " + fileMode);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecksExecutorModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecksExecutorModule.java
index 96c83d3..e5bcabe 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecksExecutorModule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/MergeabilityChecksExecutorModule.java
@@ -36,7 +36,7 @@
@GerritServerConfig Config config,
WorkQueue queues) {
int poolSize = config.getInt("changeMerge", null, "threadPoolSize", 1);
- return queues.createQueue(poolSize, "MergeabilityChecks");
+ return queues.createQueue(poolSize, "MergeabilityChecks-Background");
}
@Provides
@@ -52,6 +52,6 @@
if (poolSize <= 0) {
return backgroundExecutor;
}
- return queues.createQueue(poolSize, "InteractiveMergeabilityChecks");
+ return queues.createQueue(poolSize, "MergeabilityChecks-Interactive");
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java
index fb8c4e4..c00b96c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mergeable.java
@@ -15,13 +15,13 @@
package com.google.gerrit.server.change;
import com.google.common.collect.Sets;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSet;
-import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RevId;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.git.CodeReviewCommit;
@@ -59,7 +59,7 @@
private static final Logger log = LoggerFactory.getLogger(Mergeable.class);
public static class MergeableInfo {
- public Project.SubmitType submitType;
+ public SubmitType submitType;
public boolean mergeable;
}
@@ -132,7 +132,7 @@
private boolean refresh(Change change,
final PatchSet ps,
- Project.SubmitType type,
+ SubmitType type,
Repository git,
Map<String, Ref> refs,
final Ref ref) throws IOException, OrmException {
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 25c63b5..0a2ccef 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
@@ -469,7 +469,7 @@
Map<String, PatchSetApproval> current = Maps.newHashMap();
for (PatchSetApproval a : approvalsUtil.byPatchSetUser(
- db.get(), rsrc.getNotes(), rsrc.getPatchSet().getId(),
+ db.get(), rsrc.getControl(), rsrc.getPatchSet().getId(),
rsrc.getAccountId())) {
if (a.isSubmit()) {
continue;
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 e134394..7f6fc97 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
@@ -239,6 +239,7 @@
indexer.indexAsync(rsrc.getChange().getId());
result.reviewers = Lists.newArrayListWithCapacity(added.size());
for (PatchSetApproval psa : added) {
+ // New reviewers have value 0, don't bother normalizing.
result.reviewers.add(json.format(
new ReviewerInfo(psa.getAccountId()),
reviewers.get(psa.getAccountId()),
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerJson.java
index 5008d02..2b9ca6a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerJson.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ReviewerJson.java
@@ -29,7 +29,6 @@
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.ApprovalsUtil;
import com.google.gerrit.server.account.AccountInfo;
-import com.google.gerrit.server.git.LabelNormalizer;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.query.change.ChangeData;
@@ -46,19 +45,16 @@
private final Provider<ReviewDb> db;
private final ChangeData.Factory changeDataFactory;
private final ApprovalsUtil approvalsUtil;
- private final LabelNormalizer labelNormalizer;
private final AccountInfo.Loader.Factory accountLoaderFactory;
@Inject
ReviewerJson(Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
ApprovalsUtil approvalsUtil,
- LabelNormalizer labelNormalizer,
AccountInfo.Loader.Factory accountLoaderFactory) {
this.db = db;
this.changeDataFactory = changeDataFactory;
this.approvalsUtil = approvalsUtil;
- this.labelNormalizer = labelNormalizer;
this.accountLoaderFactory = accountLoaderFactory;
}
@@ -86,17 +82,16 @@
ChangeNotes changeNotes) throws OrmException {
PatchSet.Id psId = ctl.getChange().currentPatchSetId();
return format(out, ctl,
- approvalsUtil.byPatchSetUser(db.get(), changeNotes, psId, out._id));
+ approvalsUtil.byPatchSetUser(db.get(), ctl, psId, out._id));
}
public ReviewerInfo format(ReviewerInfo out, ChangeControl ctl,
- List<PatchSetApproval> approvals) throws OrmException {
+ Iterable<PatchSetApproval> approvals) throws OrmException {
LabelTypes labelTypes = ctl.getLabelTypes();
// Don't use Maps.newTreeMap(Comparator) due to OpenJDK bug 100167.
- out.approvals = new TreeMap<String,String>(labelTypes.nameComparator());
- for (PatchSetApproval ca :
- labelNormalizer.normalize(ctl, approvals).getNormalized()) {
+ out.approvals = new TreeMap<>(labelTypes.nameComparator());
+ for (PatchSetApproval ca : approvals) {
for (PermissionRange pr : ctl.getLabelRanges()) {
if (!pr.isEmpty()) {
LabelType at = labelTypes.byLabel(ca.getLabelId());
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 c2ac123..2121e7b 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
@@ -258,12 +258,9 @@
ChangeUpdate update, IdentifiedUser caller, Timestamp timestamp)
throws OrmException {
PatchSet.Id psId = rsrc.getPatchSet().getId();
- List<PatchSetApproval> approvals =
- approvalsUtil.byPatchSet(dbProvider.get(), rsrc.getNotes(), psId);
-
- Map<PatchSetApproval.Key, PatchSetApproval> byKey =
- Maps.newHashMapWithExpectedSize(approvals.size());
- for (PatchSetApproval psa : approvals) {
+ Map<PatchSetApproval.Key, PatchSetApproval> byKey = Maps.newHashMap();
+ for (PatchSetApproval psa :
+ approvalsUtil.byPatchSet(dbProvider.get(), rsrc.getControl(), psId)) {
if (!byKey.containsKey(psa.getKey())) {
byKey.put(psa.getKey(), psa);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitType.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitType.java
index c5b8b8a..92ff87b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitType.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitType.java
@@ -17,11 +17,11 @@
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.common.base.Objects;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.rules.RulesCache;
import com.google.gerrit.server.change.TestSubmitRule.Filters;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersName.java
similarity index 60%
copy from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
copy to gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersName.java
index 96e2ec8..ff28be4 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersName.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,16 +12,14 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.pgm.util;
+package com.google.gerrit.server.config;
-public class Die extends RuntimeException {
- private static final long serialVersionUID = 1L;
+import com.google.gerrit.reviewdb.client.Project;
- public Die(final String why) {
- super(why);
- }
-
- public Die(final String why, final Throwable cause) {
- super(why, cause);
+/** Special name of the project in which meta data for all users is stored. */
+@SuppressWarnings("serial")
+public class AllUsersName extends Project.NameKey {
+ public AllUsersName(String name) {
+ super(name);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersNameProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersNameProvider.java
new file mode 100644
index 0000000..e6ec095
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AllUsersNameProvider.java
@@ -0,0 +1,39 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.config;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+import org.eclipse.jgit.lib.Config;
+
+public class AllUsersNameProvider implements Provider<AllUsersName> {
+ public static final String DEFAULT = "All-Users";
+
+ private final AllUsersName name;
+
+ @Inject
+ AllUsersNameProvider(@GerritServerConfig Config cfg) {
+ String n = cfg.getString("gerrit", null, "allUsers");
+ if (n == null || n.isEmpty()) {
+ n = DEFAULT;
+ }
+ name = new AllUsersName(n);
+ }
+
+ public AllUsersName get() {
+ return name;
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java
index 6d01e7c5..1d640c2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/AuthConfig.java
@@ -112,7 +112,7 @@
s = new String[] {"http://", "https://"};
}
- List<OpenIdProviderPattern> r = new ArrayList<OpenIdProviderPattern>();
+ List<OpenIdProviderPattern> r = new ArrayList<>();
for (String pattern : s) {
r.add(OpenIdProviderPattern.create(pattern));
}
@@ -277,4 +277,9 @@
public String getRegisterPageUrl() {
return registerPageUrl;
}
+
+ public boolean isLdapAuthType() {
+ return authType == AuthType.LDAP ||
+ authType == AuthType.LDAP_BIND;
+ }
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java
index e081b02..ab290cb 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ConfigUtil.java
@@ -165,7 +165,7 @@
public static <T extends Enum<?>> List<T> getEnumList(final Config config,
final String section, final String subsection, final String setting,
final T[] all, final T defaultValue) {
- final List<T> list = new ArrayList<T>();
+ final List<T> list = new ArrayList<>();
final String[] values = config.getStringList(section, subsection, setting);
if (values.length == 0) {
list.add(defaultValue);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/DownloadConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/DownloadConfig.java
index f259871..80031c2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/DownloadConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/DownloadConfig.java
@@ -40,13 +40,13 @@
ConfigUtil.getEnumList(cfg, "download", null, "scheme",
DownloadScheme.DEFAULT_DOWNLOADS);
downloadSchemes =
- Collections.unmodifiableSet(new HashSet<DownloadScheme>(allSchemes));
+ Collections.unmodifiableSet(new HashSet<>(allSchemes));
List<DownloadCommand> allCommands =
ConfigUtil.getEnumList(cfg, "download", null, "command",
DownloadCommand.DEFAULT_DOWNLOADS);
downloadCommands =
- Collections.unmodifiableSet(new HashSet<DownloadCommand>(allCommands));
+ Collections.unmodifiableSet(new HashSet<>(allCommands));
}
/** Scheme used to download. */
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java
index c6598d4..023c115 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.java
@@ -31,6 +31,8 @@
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.systemstatus.MessageOfTheDay;
+import com.google.gerrit.extensions.webui.PatchSetWebLink;
+import com.google.gerrit.extensions.webui.ProjectWebLink;
import com.google.gerrit.extensions.webui.TopMenu;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.rules.PrologModule;
@@ -42,6 +44,8 @@
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.MimeUtilFileTypeRegistry;
import com.google.gerrit.server.PluginUser;
+import com.google.gerrit.server.WebLinks;
+import com.google.gerrit.server.WebLinksProvider;
import com.google.gerrit.server.account.AccountByEmailCacheImpl;
import com.google.gerrit.server.account.AccountCacheImpl;
import com.google.gerrit.server.account.AccountControl;
@@ -65,7 +69,7 @@
import com.google.gerrit.server.auth.UniversalAuthBackend;
import com.google.gerrit.server.avatar.AvatarProvider;
import com.google.gerrit.server.cache.CacheRemovalListener;
-import com.google.gerrit.server.change.ChangeKindCache;
+import com.google.gerrit.server.change.ChangeKindCacheImpl;
import com.google.gerrit.server.change.MergeabilityChecker;
import com.google.gerrit.server.events.EventFactory;
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
@@ -152,7 +156,7 @@
install(AccountByEmailCacheImpl.module());
install(AccountCacheImpl.module());
install(ChangeCache.module());
- install(ChangeKindCache.module());
+ install(ChangeKindCacheImpl.module());
install(ConflictsCacheImpl.module());
install(GroupCacheImpl.module());
install(GroupIncludeCacheImpl.module());
@@ -224,6 +228,7 @@
.in(SINGLETON);
bind(FromAddressGenerator.class).toProvider(
FromAddressGeneratorProvider.class).in(SINGLETON);
+ bind(WebLinks.class).toProvider(WebLinksProvider.class).in(SINGLETON);
bind(PatchSetInfoFactory.class);
bind(IdentifiedUser.GenericFactory.class).in(SINGLETON);
@@ -266,6 +271,8 @@
DynamicMap.mapOf(binder(), DownloadScheme.class);
DynamicMap.mapOf(binder(), DownloadCommand.class);
DynamicMap.mapOf(binder(), ProjectConfigEntry.class);
+ DynamicSet.setOf(binder(), PatchSetWebLink.class);
+ DynamicSet.setOf(binder(), ProjectWebLink.class);
bind(AnonymousUser.class);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java
new file mode 100644
index 0000000..f6c1d1d
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/GetPreferences.java
@@ -0,0 +1,52 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.config;
+
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.account.GetPreferences.PreferenceInfo;
+import com.google.gerrit.server.account.VersionedAccountPreferences;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
+
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.Repository;
+
+import java.io.IOException;
+
+public class GetPreferences implements RestReadView<ConfigResource> {
+ private final AllUsersName allUsersName;
+ private final GitRepositoryManager gitMgr;
+
+ @Inject
+ public GetPreferences(AllUsersName allUsersName,
+ GitRepositoryManager gitMgr) {
+ this.allUsersName = allUsersName;
+ this.gitMgr = gitMgr;
+ }
+
+ @Override
+ public PreferenceInfo apply(ConfigResource rsrc)
+ throws IOException, ConfigInvalidException {
+ Repository git = gitMgr.openRepository(allUsersName);
+ try {
+ VersionedAccountPreferences p =
+ VersionedAccountPreferences.forDefault();
+ p.load(git);
+ return new PreferenceInfo(null, p, git);
+ } finally {
+ git.close();
+ }
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/Module.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/Module.java
index 57bbbf3..761b265 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/Module.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/Module.java
@@ -30,5 +30,7 @@
child(CONFIG_KIND, "capabilities").to(CapabilitiesCollection.class);
child(CONFIG_KIND, "top-menus").to(TopMenuCollection.class);
get(CONFIG_KIND, "version").to(GetVersion.class);
+ get(CONFIG_KIND, "preferences").to(GetPreferences.class);
+ put(CONFIG_KIND, "preferences").to(SetPreferences.class);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java
new file mode 100644
index 0000000..e6f5253
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/SetPreferences.java
@@ -0,0 +1,71 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.config;
+
+import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.account.GetPreferences.PreferenceInfo;
+import com.google.gerrit.server.account.SetPreferences.Input;
+import com.google.gerrit.server.account.VersionedAccountPreferences;
+import com.google.gerrit.server.git.MetaDataUpdate;
+import com.google.inject.Inject;
+
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+import java.io.IOException;
+
+@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+public class SetPreferences implements RestModifyView<ConfigResource, Input> {
+ private final MetaDataUpdate.User metaDataUpdateFactory;
+ private final AllUsersName allUsersName;
+
+ @Inject
+ SetPreferences(MetaDataUpdate.User metaDataUpdateFactory,
+ AllUsersName allUsersName) {
+ this.metaDataUpdateFactory = metaDataUpdateFactory;
+ this.allUsersName = allUsersName;
+ }
+
+ @Override
+ public Object apply(ConfigResource rsrc, Input i) throws BadRequestException,
+ IOException, ConfigInvalidException {
+ if (i.changesPerPage != null || i.showSiteHeader != null
+ || i.useFlashClipboard != null || i.downloadScheme != null
+ || i.downloadCommand != null || i.copySelfOnEmail != null
+ || i.dateFormat != null || i.timeFormat != null
+ || i.reversePatchSetOrder != null
+ || i.showUsernameInReviewCategory != null
+ || i.relativeDateInChangeTable != null
+ || i.sizeBarInChangeTable != null
+ || i.commentVisibilityStrategy != null || i.diffView != null
+ || i.changeScreen != null) {
+ throw new BadRequestException("unsupported option");
+ }
+
+ VersionedAccountPreferences p;
+ MetaDataUpdate md = metaDataUpdateFactory.create(allUsersName);
+ try {
+ p = VersionedAccountPreferences.forDefault();
+ p.load(md);
+ com.google.gerrit.server.account.SetPreferences.storeMyMenus(p, i.my);
+ p.commit(md);
+ return new PreferenceInfo(null, p, md.getRepository());
+ } finally {
+ md.close();
+ }
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFootersProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFootersProvider.java
index c10c0eb..a76b010 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFootersProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/TrackingFootersProvider.java
@@ -34,8 +34,7 @@
private static String FOOTER_TAG = "footer";
private static String SYSTEM_TAG = "system";
private static String REGEX_TAG = "match";
- private final List<TrackingFooter> trackingFooters =
- new ArrayList<TrackingFooter>();
+ private final List<TrackingFooter> trackingFooters = new ArrayList<>();
private static final Logger log =
LoggerFactory.getLogger(TrackingFootersProvider.class);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java
index e4fa926..763437f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java
@@ -46,7 +46,7 @@
private static final Logger log =
LoggerFactory.getLogger(QueryDocumentationExecutor.class);
- private static final Version LUCENE_VERSION = Version.LUCENE_46;
+ private static final Version LUCENE_VERSION = Version.LUCENE_47;
private IndexSearcher searcher;
private QueryParser parser;
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 9d48574..3045a86 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
@@ -190,7 +190,7 @@
*/
public void addSubmitRecords(ChangeAttribute ca,
List<SubmitRecord> submitRecords) {
- ca.submitRecords = new ArrayList<SubmitRecordAttribute>();
+ ca.submitRecords = new ArrayList<>();
for (SubmitRecord submitRecord : submitRecords) {
SubmitRecordAttribute sa = new SubmitRecordAttribute();
@@ -209,7 +209,7 @@
private void addSubmitRecordLabels(SubmitRecord submitRecord,
SubmitRecordAttribute sa) {
if (submitRecord.labels != null && !submitRecord.labels.isEmpty()) {
- sa.labels = new ArrayList<SubmitLabelAttribute>();
+ sa.labels = new ArrayList<>();
for (SubmitRecord.Label lbl : submitRecord.labels) {
SubmitLabelAttribute la = new SubmitLabelAttribute();
la.label = lbl.label;
@@ -224,8 +224,8 @@
}
public void addDependencies(ChangeAttribute ca, Change change) {
- ca.dependsOn = new ArrayList<DependencyAttribute>();
- ca.neededBy = new ArrayList<DependencyAttribute>();
+ ca.dependsOn = new ArrayList<>();
+ ca.neededBy = new ArrayList<>();
try {
final ReviewDb db = schema.open();
try {
@@ -293,7 +293,7 @@
public void addTrackingIds(ChangeAttribute a, Multimap<String, String> set) {
if (!set.isEmpty()) {
- a.trackingIds = new ArrayList<TrackingIdAttribute>(set.size());
+ a.trackingIds = new ArrayList<>(set.size());
for (Map.Entry<String, Collection<String>> e : set.asMap().entrySet()) {
for (String id : e.getValue()) {
TrackingIdAttribute t = new TrackingIdAttribute();
@@ -324,7 +324,7 @@
Map<PatchSet.Id, Collection<PatchSetApproval>> approvals,
boolean includeFiles, Change change, LabelTypes labelTypes) {
if (!ps.isEmpty()) {
- ca.patchSets = new ArrayList<PatchSetAttribute>(ps.size());
+ ca.patchSets = new ArrayList<>(ps.size());
for (PatchSet p : ps) {
PatchSetAttribute psa = asPatchSetAttribute(p);
if (approvals != null) {
@@ -344,8 +344,7 @@
if (comment.getKey().getParentKey().getParentKey().get()
== Integer.parseInt(patchSetAttribute.number)) {
if (patchSetAttribute.comments == null) {
- patchSetAttribute.comments =
- new ArrayList<PatchSetCommentAttribute>();
+ patchSetAttribute.comments = new ArrayList<>();
}
patchSetAttribute.comments.add(asPatchSetLineAttribute(comment));
}
@@ -358,7 +357,7 @@
PatchList patchList = patchListCache.get(change, patchSet);
for (PatchListEntry patch : patchList.getPatches()) {
if (patchSetAttribute.files == null) {
- patchSetAttribute.files = new ArrayList<PatchAttribute>();
+ patchSetAttribute.files = new ArrayList<>();
}
PatchAttribute p = new PatchAttribute();
@@ -376,7 +375,7 @@
public void addComments(ChangeAttribute ca,
Collection<ChangeMessage> messages) {
if (!messages.isEmpty()) {
- ca.comments = new ArrayList<MessageAttribute>();
+ ca.comments = new ArrayList<>();
for (ChangeMessage message : messages) {
ca.comments.add(asMessageAttribute(message));
}
@@ -402,7 +401,7 @@
try {
final ReviewDb db = schema.open();
try {
- p.parents = new ArrayList<String>();
+ p.parents = new ArrayList<>();
for (PatchSetAncestor a : db.patchSetAncestors().ancestorsOf(
patchSet.getId())) {
p.parents.add(a.getAncestorRevision().get());
@@ -452,7 +451,7 @@
public void addApprovals(PatchSetAttribute p,
Collection<PatchSetApproval> list, LabelTypes labelTypes) {
if (!list.isEmpty()) {
- p.approvals = new ArrayList<ApprovalAttribute>(list.size());
+ p.approvals = new ArrayList<>(list.size());
for (PatchSetApproval a : list) {
if (a.getValue() != 0) {
p.approvals.add(asApprovalAttribute(a, labelTypes));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/AccountsSection.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/AccountsSection.java
index 7d868bf..4ea24ef 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/AccountsSection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/AccountsSection.java
@@ -24,7 +24,7 @@
public List<PermissionRule> getSameGroupVisibility() {
if (sameGroupVisibility == null) {
- sameGroupVisibility = new ArrayList<PermissionRule>();
+ sameGroupVisibility = new ArrayList<>();
}
return sameGroupVisibility;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommitResult.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommitResult.java
index 1b48455..baae629 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommitResult.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/BanCommitResult.java
@@ -21,9 +21,9 @@
public class BanCommitResult {
- private final List<ObjectId> newlyBannedCommits = new LinkedList<ObjectId>();
- private final List<ObjectId> alreadyBannedCommits = new LinkedList<ObjectId>();
- private final List<ObjectId> ignoredObjectIds = new LinkedList<ObjectId>();
+ private final List<ObjectId> newlyBannedCommits = new LinkedList<>();
+ private final List<ObjectId> alreadyBannedCommits = new LinkedList<>();
+ private final List<ObjectId> ignoredObjectIds = new LinkedList<>();
public BanCommitResult() {
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java
index a6b0a12..a1dc71b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java
@@ -55,10 +55,8 @@
private static final Logger log =
LoggerFactory.getLogger(ChangeMergeQueue.class);
- private final Map<Branch.NameKey, MergeEntry> active =
- new HashMap<Branch.NameKey, MergeEntry>();
- private final Map<Branch.NameKey, RecheckJob> recheck =
- new HashMap<Branch.NameKey, RecheckJob>();
+ private final Map<Branch.NameKey, MergeEntry> active = new HashMap<>();
+ private final Map<Branch.NameKey, RecheckJob> recheck = new HashMap<>();
private final WorkQueue workQueue;
private final Provider<MergeOp.Factory> bgFactory;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ConfiguredMimeTypes.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ConfiguredMimeTypes.java
new file mode 100644
index 0000000..082e1a2
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ConfiguredMimeTypes.java
@@ -0,0 +1,117 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.git;
+
+import org.eclipse.jgit.errors.InvalidPatternException;
+import org.eclipse.jgit.fnmatch.FileNameMatcher;
+import org.eclipse.jgit.lib.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+public class ConfiguredMimeTypes {
+ private static final Logger log = LoggerFactory
+ .getLogger(ConfiguredMimeTypes.class);
+
+ private static final String MIMETYPE = "mimetype";
+ private static final String KEY_PATH = "path";
+
+ private final List<TypeMatcher> matchers;
+
+ ConfiguredMimeTypes(String projectName, Config rc) {
+ Set<String> types = rc.getSubsections(MIMETYPE);
+ if (types.isEmpty()) {
+ matchers = Collections.emptyList();
+ } else {
+ matchers = new ArrayList<>();
+ for (String typeName : types) {
+ for (String path : rc.getStringList(MIMETYPE, typeName, KEY_PATH)) {
+ try {
+ add(typeName, path);
+ } catch (PatternSyntaxException | InvalidPatternException e) {
+ log.warn(String.format(
+ "Ignoring invalid %s.%s.%s = %s in project %s: %s",
+ MIMETYPE, typeName, KEY_PATH,
+ path, projectName, e.getMessage()));
+ }
+ }
+ }
+ }
+ }
+
+ private void add(String typeName, String path)
+ throws PatternSyntaxException, InvalidPatternException {
+ if (path.startsWith("^")) {
+ matchers.add(new ReType(typeName, path));
+ } else {
+ matchers.add(new FnType(typeName, path));
+ }
+ }
+
+ public String getMimeType(String path) {
+ for (TypeMatcher m : matchers) {
+ if (m.matches(path)) {
+ return m.type;
+ }
+ }
+ return null;
+ }
+
+ private abstract static class TypeMatcher {
+ final String type;
+
+ TypeMatcher(String type) {
+ this.type = type;
+ }
+
+ abstract boolean matches(String path);
+ }
+
+ private static class FnType extends TypeMatcher {
+ private final FileNameMatcher matcher;
+
+ FnType(String type, String pattern) throws InvalidPatternException {
+ super(type);
+ this.matcher = new FileNameMatcher(pattern, null);
+ }
+
+ @Override
+ boolean matches(String input) {
+ FileNameMatcher m = new FileNameMatcher(matcher);
+ m.append(input);
+ return m.isMatch();
+ }
+ }
+
+ private static class ReType extends TypeMatcher {
+ private final Pattern re;
+
+ ReType(String type, String pattern) throws PatternSyntaxException {
+ super(type);
+ this.re = Pattern.compile(pattern);
+ }
+
+ @Override
+ boolean matches(String input) {
+ return re.matcher(input).matches();
+ }
+ }
+}
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 43e0156..196d3e9 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
@@ -234,7 +234,7 @@
private void onCreateProject(final Project.NameKey newProjectName) {
namesUpdateLock.lock();
try {
- SortedSet<Project.NameKey> n = new TreeSet<Project.NameKey>(names);
+ SortedSet<Project.NameKey> n = new TreeSet<>(names);
n.add(newProjectName);
names = Collections.unmodifiableSortedSet(n);
} finally {
@@ -345,7 +345,7 @@
// scanning the filesystem. Don't rely on the cached names collection.
namesUpdateLock.lock();
try {
- SortedSet<Project.NameKey> n = new TreeSet<Project.NameKey>();
+ SortedSet<Project.NameKey> n = new TreeSet<>();
scanProjects(basePath, "", n);
names = Collections.unmodifiableSortedSet(n);
return n;
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 0919aa0..4324d1a 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
@@ -30,6 +30,7 @@
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.Capable;
import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
@@ -37,7 +38,6 @@
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.client.RevId;
import com.google.gerrit.reviewdb.server.ReviewDb;
@@ -206,8 +206,8 @@
this.approvalsUtil = approvalsUtil;
destBranch = branch;
toMerge = ArrayListMultimap.create();
- potentiallyStillSubmittable = new ArrayList<CodeReviewCommit>();
- commits = new HashMap<Change.Id, CodeReviewCommit>();
+ potentiallyStillSubmittable = new ArrayList<>();
+ commits = new HashMap<>();
toUpdate = Lists.newArrayList();
}
@@ -238,11 +238,11 @@
final ListMultimap<SubmitType, CodeReviewCommit> toMergeNextTurn =
ArrayListMultimap.create();
final List<CodeReviewCommit> potentiallyStillSubmittableOnNextRun =
- new ArrayList<CodeReviewCommit>();
+ new ArrayList<>();
while (!toMerge.isEmpty()) {
toMergeNextTurn.clear();
final Set<SubmitType> submitTypes =
- new HashSet<Project.SubmitType>(toMerge.keySet());
+ new HashSet<>(toMerge.keySet());
for (final SubmitType submitType : submitTypes) {
if (reopen) {
branchUpdate = openBranch();
@@ -418,7 +418,7 @@
private Set<RevCommit> getAlreadyAccepted(final CodeReviewCommit branchTip)
throws MergeException {
- final Set<RevCommit> alreadyAccepted = new HashSet<RevCommit>();
+ final Set<RevCommit> alreadyAccepted = new HashSet<>();
if (branchTip != null) {
alreadyAccepted.add(branchTip);
@@ -453,7 +453,7 @@
throw new MergeException(e.getMessage(), e);
}
- final Set<ObjectId> tips = new HashSet<ObjectId>();
+ final Set<ObjectId> tips = new HashSet<>();
for (final Ref r : allRefs.values()) {
tips.add(r.getObjectId());
}
@@ -559,7 +559,7 @@
}
}
- final SubmitType submitType = getSubmitType(commit.getControl(), ps);
+ SubmitType submitType = getSubmitType(commit.getControl(), ps);
if (submitType == null) {
commits.put(changeId,
CodeReviewCommit.error(CommitMergeStatus.NO_SUBMIT_TYPE));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSorter.java
index 9b4582d..4985390 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSorter.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeSorter.java
@@ -40,8 +40,8 @@
Collection<CodeReviewCommit> sort(final Collection<CodeReviewCommit> incoming)
throws IOException {
- final Set<CodeReviewCommit> heads = new HashSet<CodeReviewCommit>();
- final Set<CodeReviewCommit> sort = new HashSet<CodeReviewCommit>(incoming);
+ final Set<CodeReviewCommit> heads = new HashSet<>();
+ final Set<CodeReviewCommit> sort = new HashSet<>(incoming);
while (!sort.isEmpty()) {
final CodeReviewCommit n = removeOne(sort);
@@ -52,7 +52,7 @@
}
RevCommit c;
- final RevCommitList<RevCommit> contents = new RevCommitList<RevCommit>();
+ final RevCommitList<RevCommit> contents = new RevCommitList<>();
while ((c = rw.next()) != null) {
if (!c.has(canMergeFlag) || !incoming.contains(c)) {
// We cannot merge n as it would bring something we
@@ -60,7 +60,7 @@
//
if (n.missing == null) {
n.setStatusCode(CommitMergeStatus.MISSING_DEPENDENCY);
- n.missing = new ArrayList<CodeReviewCommit>();
+ n.missing = new ArrayList<>();
}
n.missing.add((CodeReviewCommit) c);
} else {
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 b9624fe..742499b 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
@@ -311,9 +311,9 @@
return "Verified".equalsIgnoreCase(id.get());
}
- private List<PatchSetApproval> safeGetApprovals(CodeReviewCommit n) {
+ private Iterable<PatchSetApproval> safeGetApprovals(CodeReviewCommit n) {
try {
- return approvalsUtil.byPatchSet(db.get(), n.notes(), n.getPatchsetId());
+ return approvalsUtil.byPatchSet(db.get(), n.getControl(), n.getPatchsetId());
} catch (OrmException e) {
log.error("Can't read approval records for " + n.getPatchsetId(), e);
return Collections.emptyList();
@@ -360,7 +360,7 @@
if (submitter != null) {
IdentifiedUser who =
identifiedUserFactory.create(submitter.getAccountId());
- Set<String> emails = new HashSet<String>();
+ Set<String> emails = new HashSet<>();
for (RevCommit c : codeReviewCommits) {
try {
rw.parseBody(c);
@@ -551,7 +551,7 @@
final CodeReviewCommit mergeTip, final ObjectId treeId,
final CodeReviewCommit n) throws IOException,
MissingObjectException, IncorrectObjectTypeException {
- final List<CodeReviewCommit> merged = new ArrayList<CodeReviewCommit>();
+ final List<CodeReviewCommit> merged = new ArrayList<>();
rw.resetRetain(canMergeFlag);
rw.markStart(n);
rw.markUninteresting(mergeTip);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MetaDataUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MetaDataUpdate.java
index e8b4b6a..b48028e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MetaDataUpdate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MetaDataUpdate.java
@@ -137,7 +137,7 @@
return projectName;
}
- Repository getRepository() {
+ public Repository getRepository() {
return db;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiProgressMonitor.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiProgressMonitor.java
index 45ecb63..4279b31 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiProgressMonitor.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MultiProgressMonitor.java
@@ -132,7 +132,7 @@
private final OutputStream out;
private final String taskName;
- private final List<Task> tasks = new CopyOnWriteArrayList<Task>();
+ private final List<Task> tasks = new CopyOnWriteArrayList<>();
private int spinnerIndex;
private char spinnerState = NO_SPINNER;
private boolean done;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/PerThreadRequestScope.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/PerThreadRequestScope.java
index e7bb0ae..6087432 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/PerThreadRequestScope.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/PerThreadRequestScope.java
@@ -81,7 +81,7 @@
}
}
- private static final ThreadLocal<Context> current = new ThreadLocal<Context>();
+ private static final ThreadLocal<Context> current = new ThreadLocal<>();
private static Context requireContext() {
final Context ctx = current.get();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java
index 55f4ff7..d5dae8e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java
@@ -39,12 +39,13 @@
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.common.data.PermissionRule.Action;
import com.google.gerrit.common.data.RefConfigSection;
+import com.google.gerrit.extensions.api.projects.ProjectState;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.client.AccountProjectWatch.NotifyType;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.State;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
+import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.account.GroupBackend;
import com.google.gerrit.server.config.ConfigUtil;
import com.google.gerrit.server.config.PluginConfig;
@@ -128,6 +129,7 @@
private static final String LABEL = "label";
private static final String KEY_ABBREVIATION = "abbreviation";
private static final String KEY_FUNCTION = "function";
+ private static final String KEY_DEFAULT_VALUE = "defaultValue";
private static final String KEY_COPY_MIN_SCORE = "copyMinScore";
private static final String KEY_COPY_MAX_SCORE = "copyMaxScore";
private static final String KEY_COPY_ALL_SCORES_ON_TRIVIAL_REBASE = "copyAllScoresOnTrivialRebase";
@@ -142,8 +144,8 @@
private static final SubmitType defaultSubmitAction =
SubmitType.MERGE_IF_NECESSARY;
- private static final State defaultStateValue =
- State.ACTIVE;
+ private static final ProjectState defaultStateValue =
+ ProjectState.ACTIVE;
private Project.NameKey projectName;
private Project project;
@@ -153,6 +155,7 @@
private Map<String, ContributorAgreement> contributorAgreements;
private Map<String, NotifyConfig> notifySections;
private Map<String, LabelType> labelSections;
+ private ConfiguredMimeTypes mimeTypes;
private List<CommentLinkInfo> commentLinkSections;
private List<ValidationError> validationErrors;
private ObjectId rulesId;
@@ -299,6 +302,10 @@
return commentLinkSections;
}
+ public ConfiguredMimeTypes getMimeTypes() {
+ return mimeTypes;
+ }
+
public GroupReference resolve(AccountGroup group) {
return resolve(GroupReference.forGroup(group));
}
@@ -398,13 +405,13 @@
}
p.setParentName(rc.getString(ACCESS, null, KEY_INHERIT_FROM));
- p.setUseContributorAgreements(getEnum(rc, RECEIVE, null, KEY_REQUIRE_CONTRIBUTOR_AGREEMENT, Project.InheritableBoolean.INHERIT));
- p.setUseSignedOffBy(getEnum(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_OFF_BY, Project.InheritableBoolean.INHERIT));
- p.setRequireChangeID(getEnum(rc, RECEIVE, null, KEY_REQUIRE_CHANGE_ID, Project.InheritableBoolean.INHERIT));
+ p.setUseContributorAgreements(getEnum(rc, RECEIVE, null, KEY_REQUIRE_CONTRIBUTOR_AGREEMENT, InheritableBoolean.INHERIT));
+ p.setUseSignedOffBy(getEnum(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_OFF_BY, InheritableBoolean.INHERIT));
+ p.setRequireChangeID(getEnum(rc, RECEIVE, null, KEY_REQUIRE_CHANGE_ID, InheritableBoolean.INHERIT));
p.setMaxObjectSizeLimit(rc.getString(RECEIVE, null, KEY_MAX_OBJECT_SIZE_LIMIT));
p.setSubmitType(getEnum(rc, SUBMIT, null, KEY_ACTION, defaultSubmitAction));
- p.setUseContentMerge(getEnum(rc, SUBMIT, null, KEY_MERGE_CONTENT, Project.InheritableBoolean.INHERIT));
+ p.setUseContentMerge(getEnum(rc, SUBMIT, null, KEY_MERGE_CONTENT, InheritableBoolean.INHERIT));
p.setState(getEnum(rc, PROJECT, null, KEY_STATE, defaultStateValue));
p.setDefaultDashboard(rc.getString(DASHBOARD, null, KEY_DEFAULT));
@@ -416,6 +423,7 @@
loadNotifySections(rc, groupsByName);
loadLabelSections(rc);
loadCommentLinkSections(rc);
+ mimeTypes = new ConfiguredMimeTypes(projectName.get(), rc);
loadPluginSections(rc);
loadReceiveSection(rc);
}
@@ -429,7 +437,7 @@
private void loadContributorAgreements(
Config rc, Map<String, GroupReference> groupsByName) {
- contributorAgreements = new HashMap<String, ContributorAgreement>();
+ contributorAgreements = new HashMap<>();
for (String name : rc.getSubsections(CONTRIBUTOR_AGREEMENT)) {
ContributorAgreement ca = getContributorAgreement(name, true);
ca.setDescription(rc.getString(CONTRIBUTOR_AGREEMENT, name, KEY_DESCRIPTION));
@@ -527,7 +535,7 @@
private void loadAccessSections(
Config rc, Map<String, GroupReference> groupsByName) {
- accessSections = new HashMap<String, AccessSection>();
+ accessSections = new HashMap<>();
for (String refName : rc.getSubsections(ACCESS)) {
if (RefConfigSection.isValid(refName)) {
AccessSection as = getAccessSection(refName, true);
@@ -664,6 +672,15 @@
KEY_FUNCTION, name, Joiner.on(", ").join(LABEL_FUNCTIONS))));
label.setFunctionName(null);
}
+
+ short dv = (short) rc.getInt(LABEL, name, KEY_DEFAULT_VALUE, 0);
+ if (isInRange(dv, values)) {
+ label.setDefaultValue(dv);
+ } else {
+ error(new ValidationError(PROJECT_CONFIG, String.format(
+ "Invalid %s \"%s\" for label \"%s\"",
+ KEY_DEFAULT_VALUE, dv, name)));
+ }
label.setCopyMinScore(
rc.getBoolean(LABEL, name, KEY_COPY_MIN_SCORE, false));
label.setCopyMaxScore(
@@ -679,6 +696,15 @@
}
}
+ private boolean isInRange(short value, List<LabelValue> labelValues) {
+ for (LabelValue lv : labelValues) {
+ if (lv.getValue() == value) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private List<String> getStringListOrNull(Config rc, String section,
String subSection, String name) {
String[] ac = rc.getStringList(section, subSection, name);
@@ -731,9 +757,8 @@
}
private Map<String, GroupReference> readGroupList() throws IOException {
- groupsByUUID = new HashMap<AccountGroup.UUID, GroupReference>();
- Map<String, GroupReference> groupsByName =
- new HashMap<String, GroupReference>();
+ groupsByUUID = new HashMap<>();
+ Map<String, GroupReference> groupsByName = new HashMap<>();
BufferedReader br = new BufferedReader(new StringReader(readUTF8(GROUP_LIST)));
String s;
@@ -775,20 +800,20 @@
}
set(rc, ACCESS, null, KEY_INHERIT_FROM, p.getParentName());
- set(rc, RECEIVE, null, KEY_REQUIRE_CONTRIBUTOR_AGREEMENT, p.getUseContributorAgreements(), Project.InheritableBoolean.INHERIT);
- set(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_OFF_BY, p.getUseSignedOffBy(), Project.InheritableBoolean.INHERIT);
- set(rc, RECEIVE, null, KEY_REQUIRE_CHANGE_ID, p.getRequireChangeID(), Project.InheritableBoolean.INHERIT);
+ set(rc, RECEIVE, null, KEY_REQUIRE_CONTRIBUTOR_AGREEMENT, p.getUseContributorAgreements(), InheritableBoolean.INHERIT);
+ set(rc, RECEIVE, null, KEY_REQUIRE_SIGNED_OFF_BY, p.getUseSignedOffBy(), InheritableBoolean.INHERIT);
+ set(rc, RECEIVE, null, KEY_REQUIRE_CHANGE_ID, p.getRequireChangeID(), InheritableBoolean.INHERIT);
set(rc, RECEIVE, null, KEY_MAX_OBJECT_SIZE_LIMIT, validMaxObjectSizeLimit(p.getMaxObjectSizeLimit()));
set(rc, SUBMIT, null, KEY_ACTION, p.getSubmitType(), defaultSubmitAction);
- set(rc, SUBMIT, null, KEY_MERGE_CONTENT, p.getUseContentMerge(), Project.InheritableBoolean.INHERIT);
+ set(rc, SUBMIT, null, KEY_MERGE_CONTENT, p.getUseContentMerge(), InheritableBoolean.INHERIT);
set(rc, PROJECT, null, KEY_STATE, p.getState(), defaultStateValue);
set(rc, DASHBOARD, null, KEY_DEFAULT, p.getDefaultDashboard());
set(rc, DASHBOARD, null, KEY_LOCAL_DEFAULT, p.getLocalDefaultDashboard());
- Set<AccountGroup.UUID> keepGroups = new HashSet<AccountGroup.UUID>();
+ Set<AccountGroup.UUID> keepGroups = new HashSet<>();
saveAccountsSection(rc, keepGroups);
saveContributorAgreements(rc, keepGroups);
saveAccessSections(rc, keepGroups);
@@ -905,7 +930,7 @@
private List<String> ruleToStringList(
List<PermissionRule> list, Set<AccountGroup.UUID> keepGroups) {
- List<String> rules = new ArrayList<String>();
+ List<String> rules = new ArrayList<>();
for (PermissionRule rule : sort(list)) {
if (rule.getGroup().getUUID() != null) {
keepGroups.add(rule.getGroup().getUUID());
@@ -919,12 +944,12 @@
Config rc, Set<AccountGroup.UUID> keepGroups) {
AccessSection capability = accessSections.get(AccessSection.GLOBAL_CAPABILITIES);
if (capability != null) {
- Set<String> have = new HashSet<String>();
+ Set<String> have = new HashSet<>();
for (Permission permission : sort(capability.getPermissions())) {
have.add(permission.getName().toLowerCase());
boolean needRange = GlobalCapability.hasRange(permission.getName());
- List<String> rules = new ArrayList<String>();
+ List<String> rules = new ArrayList<>();
for (PermissionRule rule : sort(permission.getRules())) {
GroupReference group = rule.getGroup();
if (group.getUUID() != null) {
@@ -964,12 +989,12 @@
rc.unset(ACCESS, refName, KEY_GROUP_PERMISSIONS);
}
- Set<String> have = new HashSet<String>();
+ Set<String> have = new HashSet<>();
for (Permission permission : sort(as.getPermissions())) {
have.add(permission.getName().toLowerCase());
boolean needRange = Permission.hasRange(permission.getName());
- List<String> rules = new ArrayList<String>();
+ List<String> rules = new ArrayList<>();
for (PermissionRule rule : sort(permission.getRules())) {
GroupReference group = rule.getGroup();
if (group.getUUID() != null) {
@@ -1017,6 +1042,8 @@
} else {
rc.unset(LABEL, name, KEY_ABBREVIATION);
}
+
+ rc.setInt(LABEL, name, KEY_DEFAULT_VALUE, label.getDefaultValue());
if (label.isCopyMinScore()) {
rc.setBoolean(LABEL, name, KEY_COPY_MIN_SCORE, true);
} else {
@@ -1111,7 +1138,7 @@
private void error(ValidationError error) {
if (validationErrors == null) {
- validationErrors = new ArrayList<ValidationError>(4);
+ validationErrors = new ArrayList<>(4);
}
validationErrors.add(error);
}
@@ -1130,7 +1157,7 @@
}
private static <T extends Comparable<? super T>> List<T> sort(Collection<T> m) {
- ArrayList<T> r = new ArrayList<T>(m);
+ ArrayList<T> r = new ArrayList<>(m);
Collections.sort(r);
return r;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseSorter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseSorter.java
index b0232ca..8595582 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseSorter.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseSorter.java
@@ -42,8 +42,8 @@
public List<CodeReviewCommit> sort(Collection<CodeReviewCommit> incoming)
throws IOException {
- final List<CodeReviewCommit> sorted = new ArrayList<CodeReviewCommit>();
- final Set<CodeReviewCommit> sort = new HashSet<CodeReviewCommit>(incoming);
+ final List<CodeReviewCommit> sorted = new ArrayList<>();
+ final Set<CodeReviewCommit> sort = new HashSet<>(incoming);
while (!sort.isEmpty()) {
final CodeReviewCommit n = removeOne(sort);
@@ -54,7 +54,7 @@
}
CodeReviewCommit c;
- final List<CodeReviewCommit> contents = new ArrayList<CodeReviewCommit>();
+ final List<CodeReviewCommit> contents = new ArrayList<>();
while ((c = (CodeReviewCommit) rw.next()) != null) {
if (!c.has(canMergeFlag) || !incoming.contains(c)) {
// We cannot merge n as it would bring something we
@@ -62,7 +62,7 @@
//
if (n.missing == null) {
n.setStatusCode(CommitMergeStatus.MISSING_DEPENDENCY);
- n.missing = new ArrayList<CodeReviewCommit>();
+ n.missing = new ArrayList<>();
}
n.missing.add(c);
} else {
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 ca4a4ef..0256322 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
@@ -304,10 +304,10 @@
private List<CreateRequest> newChanges = Collections.emptyList();
private final Map<Change.Id, ReplaceRequest> replaceByChange =
- new HashMap<Change.Id, ReplaceRequest>();
+ new HashMap<>();
private final Map<RevCommit, ReplaceRequest> replaceByCommit =
- new HashMap<RevCommit, ReplaceRequest>();
- private final Set<RevCommit> validCommits = new HashSet<RevCommit>();
+ new HashMap<>();
+ private final Set<RevCommit> validCommits = new HashSet<>();
private ListMultimap<Change.Id, Ref> refsByChange;
private SetMultimap<ObjectId, Ref> refsById;
@@ -318,7 +318,7 @@
private final MergeQueue mergeQueue;
private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
- private final List<CommitValidationMessage> messages = new ArrayList<CommitValidationMessage>();
+ private final List<CommitValidationMessage> messages = new ArrayList<>();
private ListMultimap<Error, String> errors = LinkedListMultimap.create();
private Task newProgress;
private Task replaceProgress;
@@ -437,7 +437,7 @@
rp.setCheckReferencedObjectsAreReachable(config.checkReferencedObjectsAreReachable);
rp.setAdvertiseRefsHook(new VisibleRefFilter(tagCache, changeCache, repo, projectControl, db, false));
}
- List<AdvertiseRefsHook> advHooks = new ArrayList<AdvertiseRefsHook>(3);
+ List<AdvertiseRefsHook> advHooks = new ArrayList<>(3);
advHooks.add(new AdvertiseRefsHook() {
@Override
public void advertiseRefs(BaseReceivePack rp)
@@ -1392,7 +1392,7 @@
}
List<ChangeLookup> pending = Lists.newArrayList();
- final Set<Change.Key> newChangeIds = new HashSet<Change.Key>();
+ final Set<Change.Key> newChangeIds = new HashSet<>();
for (;;) {
final RevCommit c = walk.next();
if (c == null) {
@@ -2220,7 +2220,7 @@
final SetMultimap<ObjectId, Ref> byCommit = changeRefsById();
final Map<Change.Key, Change.Id> byKey = openChangesByKey(
new Branch.NameKey(project.getNameKey(), cmd.getRefName()));
- final List<ReplaceRequest> toClose = new ArrayList<ReplaceRequest>();
+ final List<ReplaceRequest> toClose = new ArrayList<>();
RevCommit c;
while ((c = rw.next()) != null) {
final Set<Ref> refs = byCommit.get(c.copy());
@@ -2328,7 +2328,7 @@
private Map<Change.Key, Change.Id> openChangesByKey(Branch.NameKey branch)
throws OrmException {
- final Map<Change.Key, Change.Id> r = new HashMap<Change.Key, Change.Id>();
+ final Map<Change.Key, Change.Id> r = new HashMap<>();
for (Change c : db.changes().byBranchOpenAll(branch)) {
r.put(c.getKey(), c.getId());
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReloadSubmitQueueOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReloadSubmitQueueOp.java
index bcc2107..850f2be 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReloadSubmitQueueOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReloadSubmitQueueOp.java
@@ -46,7 +46,7 @@
}
public void run() {
- final HashSet<Branch.NameKey> pending = new HashSet<Branch.NameKey>();
+ final HashSet<Branch.NameKey> pending = new HashSet<>();
try {
final ReviewDb c = schema.open();
try {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RenameGroupOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/RenameGroupOp.java
index 7490006..2b3994c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/RenameGroupOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/RenameGroupOp.java
@@ -69,7 +69,7 @@
this.uuid = uuid;
this.oldName = oldName;
this.newName = newName;
- this.retryOn = new ArrayList<Project.NameKey>();
+ this.retryOn = new ArrayList<>();
}
@Override
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 5424887..927d20c 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
@@ -14,6 +14,7 @@
package com.google.gerrit.server.git;
+import com.google.common.base.Strings;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
@@ -110,7 +111,7 @@
this.repoManager = repoManager;
this.gitRefUpdated = gitRefUpdated;
- updatedSubscribers = new HashSet<Branch.NameKey>();
+ updatedSubscribers = new HashSet<>();
}
public void update() throws SubmoduleException {
@@ -151,14 +152,13 @@
destBranch.get());
final Set<SubmoduleSubscription> oldSubscriptions =
- new HashSet<SubmoduleSubscription>(schema.submoduleSubscriptions()
+ new HashSet<>(schema.submoduleSubscriptions()
.bySuperProject(destBranch).toList());
final List<SubmoduleSubscription> newSubscriptions =
new SubmoduleSectionParser(bbc, thisServer, target, repoManager)
.parseAllSections();
- final Set<SubmoduleSubscription> alreadySubscribeds =
- new HashSet<SubmoduleSubscription>();
+ final Set<SubmoduleSubscription> alreadySubscribeds = new HashSet<>();
for (SubmoduleSubscription s : newSubscriptions) {
if (oldSubscriptions.contains(s)) {
alreadySubscribeds.add(s);
@@ -232,12 +232,10 @@
+ s.toString());
} else {
- Map<Branch.NameKey, ObjectId> modules =
- new HashMap<Branch.NameKey, ObjectId>(1);
+ Map<Branch.NameKey, ObjectId> modules = new HashMap<>(1);
modules.put(updatedBranch, mergedCommit);
- Map<Branch.NameKey, String> paths =
- new HashMap<Branch.NameKey, String>(1);
+ Map<Branch.NameKey, String> paths = new HashMap<>(1);
paths.put(updatedBranch, s.getPath());
try {
@@ -277,8 +275,13 @@
msgbuf.append(me.getKey().getParentKey().get());
msgbuf.append(" ").append(me.getValue().getName());
msgbuf.append("\n");
- if (modules.size() == 1 && msg != null) {
- msgbuf.append(msg);
+ if (modules.size() == 1) {
+ if (!Strings.isNullOrEmpty(msg)) {
+ msgbuf.append(msg);
+ } else {
+ msgbuf.append("\n");
+ msgbuf.append(c.getFullMessage());
+ }
} else {
msgbuf.append(c.getShortMessage());
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagMatcher.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagMatcher.java
index b63378f..e550927 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagMatcher.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagMatcher.java
@@ -27,8 +27,8 @@
class TagMatcher {
final BitSet mask = new BitSet();
- final List<Ref> newRefs = new ArrayList<Ref>();
- final List<LostRef> lostRefs = new ArrayList<LostRef>();
+ final List<Ref> newRefs = new ArrayList<>();
+ final List<LostRef> lostRefs = new ArrayList<>();
final TagSetHolder holder;
final TagCache cache;
final Repository db;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java
index 3eb9273..761d5d6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/TagSet.java
@@ -51,8 +51,8 @@
TagSet(Project.NameKey projectName) {
this.projectName = projectName;
- this.refs = new HashMap<String, CachedRef>();
- this.tags = new ObjectIdOwnerMap<Tag>();
+ this.refs = new HashMap<>();
+ this.tags = new ObjectIdOwnerMap<>();
}
Tag lookupTag(AnyObjectId id) {
@@ -238,7 +238,7 @@
// Gerrit Code Review server, perhaps about 50% of new references.
// Since a complete rebuild is so costly, try this approach first.
- Map<ObjectId, Integer> byObj = new HashMap<ObjectId, Integer>();
+ Map<ObjectId, Integer> byObj = new HashMap<>();
for (CachedRef r : old.refs.values()) {
ObjectId id = r.get();
if (!byObj.containsKey(id)) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/VisibleRefFilter.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/VisibleRefFilter.java
index 343b49c..62d80fa 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/VisibleRefFilter.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/VisibleRefFilter.java
@@ -77,8 +77,8 @@
}
final Set<Change.Id> visibleChanges = visibleChanges();
- final Map<String, Ref> result = new HashMap<String, Ref>();
- final List<Ref> deferredTags = new ArrayList<Ref>();
+ final Map<String, Ref> result = new HashMap<>();
+ final List<Ref> deferredTags = new ArrayList<>();
for (Ref ref : refs.values()) {
if (ref.getName().startsWith(RefNames.REFS_CACHE_AUTOMERGE)) {
@@ -149,7 +149,7 @@
final Project project = projectCtl.getProject();
try {
- final Set<Change.Id> visibleChanges = new HashSet<Change.Id>();
+ final Set<Change.Id> visibleChanges = new HashSet<>();
for (Change change : changeCache.get(project.getNameKey())) {
if (projectCtl.controlFor(change).isVisible(reviewDb)) {
visibleChanges.add(change.getId());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/WorkQueue.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/WorkQueue.java
index 6e274a1..8c11aec 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/WorkQueue.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/WorkQueue.java
@@ -90,10 +90,14 @@
private final CopyOnWriteArrayList<Executor> queues;
@Inject
- WorkQueue(final IdGenerator idGenerator, @GerritServerConfig final Config cfg) {
+ WorkQueue(IdGenerator idGenerator, @GerritServerConfig Config cfg) {
+ this(idGenerator, cfg.getInt("execution", "defaultThreadPoolSize", 1));
+ }
+
+ public WorkQueue(IdGenerator idGenerator, int defaultThreadPoolSize) {
this.idGenerator = idGenerator;
- this.queues = new CopyOnWriteArrayList<Executor>();
- defaultQueueSize = cfg.getInt("execution", "defaultThreadPoolSize", 1);
+ this.queues = new CopyOnWriteArrayList<>();
+ this.defaultQueueSize = defaultThreadPoolSize;
}
/** Get the default work queue, for miscellaneous tasks. */
@@ -115,7 +119,7 @@
/** Get all of the tasks currently scheduled in any work queue. */
public List<Task<?>> getTasks() {
- final List<Task<?>> r = new ArrayList<Task<?>>();
+ final List<Task<?>> r = new ArrayList<>();
for (final Executor e : queues) {
e.addAllTo(r);
}
@@ -182,7 +186,7 @@
}
});
- all = new ConcurrentHashMap<Integer, Task<?>>( //
+ all = new ConcurrentHashMap<>( //
corePoolSize << 1, // table size
0.75f, // load factor
corePoolSize + 4 // concurrency level
@@ -203,9 +207,9 @@
Task<V> task;
if (runnable instanceof ProjectRunnable) {
- task = new ProjectTask<V>((ProjectRunnable) runnable, r, this, id);
+ task = new ProjectTask<>((ProjectRunnable) runnable, r, this, id);
} else {
- task = new Task<V>(runnable, r, this, id);
+ task = new Task<>(runnable, r, this, id);
}
if (all.putIfAbsent(task.getTaskId(), task) == 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 18df4c1..08421ca 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
@@ -56,7 +56,7 @@
this.patchSetInfoFactory = patchSetInfoFactory;
this.gitRefUpdated = gitRefUpdated;
- this.newCommits = new HashMap<Change.Id, CodeReviewCommit>();
+ this.newCommits = new HashMap<>();
}
@Override
@@ -179,7 +179,7 @@
final List<PatchSetApproval> approvals = Lists.newArrayList();
for (PatchSetApproval a
- : args.approvalsUtil.byPatchSet(args.db, n.notes(), n.getPatchsetId())) {
+ : args.approvalsUtil.byPatchSet(args.db, n.getControl(), n.getPatchsetId())) {
approvals.add(new PatchSetApproval(ps.getId(), a));
}
args.db.patchSetApprovals().insert(approvals);
@@ -212,7 +212,7 @@
private static void insertAncestors(ReviewDb db, PatchSet.Id id, RevCommit src)
throws OrmException {
final int cnt = src.getParentCount();
- List<PatchSetAncestor> toInsert = new ArrayList<PatchSetAncestor>(cnt);
+ List<PatchSetAncestor> toInsert = new ArrayList<>(cnt);
for (int p = 0; p < cnt; p++) {
PatchSetAncestor a;
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 a97b3fd..c38f5f2 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
@@ -52,7 +52,7 @@
super(args);
this.patchSetInfoFactory = patchSetInfoFactory;
this.rebaseChange = rebaseChange;
- this.newCommits = new HashMap<Change.Id, CodeReviewCommit>();
+ this.newCommits = new HashMap<>();
this.committerIdent = committerIdent;
}
@@ -96,7 +96,7 @@
List<PatchSetApproval> approvals = Lists.newArrayList();
for (PatchSetApproval a : args.approvalsUtil.byPatchSet(
- args.db, n.notes(), n.getPatchsetId())) {
+ args.db, n.getControl(), n.getPatchsetId())) {
approvals.add(new PatchSetApproval(newPatchSet.getId(), a));
}
// rebaseChange.rebase() may already have copied some approvals,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategy.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategy.java
index a0cd5fd..aa08085 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategy.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategy.java
@@ -14,10 +14,10 @@
package com.google.gerrit.server.git.strategy;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.ApprovalsUtil;
import com.google.gerrit.server.IdentifiedUser;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyFactory.java
index d23cc82..a1021cd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/strategy/SubmitStrategyFactory.java
@@ -14,8 +14,8 @@
package com.google.gerrit.server.git.strategy;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.Branch;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.ApprovalsUtil;
import com.google.gerrit.server.GerritPersonIdent;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java
index 1bf754a..a77938e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java
@@ -92,8 +92,7 @@
public List<CommitValidationMessage> validateForReceiveCommits(
CommitReceivedEvent receiveEvent) throws CommitValidationException {
- List<CommitValidationListener> validators =
- new LinkedList<CommitValidationListener>();
+ List<CommitValidationListener> validators = new LinkedList<>();
validators.add(new UploadMergesPermissionValidator(refControl));
validators.add(new AmendedGerritMergeCommitValidationListener(
@@ -110,8 +109,7 @@
validators.add(new ConfigValidator(refControl, repo));
validators.add(new PluginCommitValidationListener(commitValidationListeners));
- List<CommitValidationMessage> messages =
- new LinkedList<CommitValidationMessage>();
+ List<CommitValidationMessage> messages = new LinkedList<>();
try {
for (CommitValidationListener commitValidator : validators) {
@@ -128,8 +126,7 @@
public List<CommitValidationMessage> validateForGerritCommits(
CommitReceivedEvent receiveEvent) throws CommitValidationException {
- List<CommitValidationListener> validators =
- new LinkedList<CommitValidationListener>();
+ List<CommitValidationListener> validators = new LinkedList<>();
validators.add(new UploadMergesPermissionValidator(refControl));
validators.add(new AmendedGerritMergeCommitValidationListener(
@@ -145,8 +142,7 @@
validators.add(new ConfigValidator(refControl, repo));
validators.add(new PluginCommitValidationListener(commitValidationListeners));
- List<CommitValidationMessage> messages =
- new LinkedList<CommitValidationMessage>();
+ List<CommitValidationMessage> messages = new LinkedList<>();
try {
for (CommitValidationListener commitValidator : validators) {
@@ -181,8 +177,7 @@
CommitReceivedEvent receiveEvent) throws CommitValidationException {
final List<String> idList = receiveEvent.commit.getFooterLines(CHANGE_ID);
- List<CommitValidationMessage> messages =
- new LinkedList<CommitValidationMessage>();
+ List<CommitValidationMessage> messages = new LinkedList<>();
if (idList.isEmpty()) {
if (projectControl.getProjectState().isRequireChangeID()) {
@@ -321,8 +316,7 @@
IdentifiedUser currentUser = (IdentifiedUser) refControl.getCurrentUser();
if (RefNames.REFS_CONFIG.equals(refControl.getRefName())) {
- List<CommitValidationMessage> messages =
- new LinkedList<CommitValidationMessage>();
+ List<CommitValidationMessage> messages = new LinkedList<>();
try {
ProjectConfig cfg =
@@ -381,8 +375,7 @@
@Override
public List<CommitValidationMessage> onCommitReceived(
CommitReceivedEvent receiveEvent) throws CommitValidationException {
- List<CommitValidationMessage> messages =
- new LinkedList<CommitValidationMessage>();
+ List<CommitValidationMessage> messages = new LinkedList<>();
for (CommitValidationListener validator : commitValidationListeners) {
try {
@@ -452,8 +445,7 @@
if (!currentUser.getEmailAddresses().contains(author.getEmailAddress())
&& !refControl.canForgeAuthor()) {
- List<CommitValidationMessage> messages =
- new LinkedList<CommitValidationMessage>();
+ List<CommitValidationMessage> messages = new LinkedList<>();
messages.add(getInvalidEmailError(receiveEvent.commit, "author", author,
currentUser, canonicalWebUrl));
@@ -483,8 +475,7 @@
if (!currentUser.getEmailAddresses()
.contains(committer.getEmailAddress())
&& !refControl.canForgeCommitter()) {
- List<CommitValidationMessage> messages =
- new LinkedList<CommitValidationMessage>();
+ List<CommitValidationMessage> messages = new LinkedList<>();
messages.add(getInvalidEmailError(receiveEvent.commit, "committer", committer,
currentUser, canonicalWebUrl));
throw new CommitValidationException("invalid committer", messages);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java
index f6b7187..91a0ec5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java
@@ -67,7 +67,7 @@
@Option(name = "--project", aliases = {"-p"},
usage = "projects for which the groups should be listed")
- private final List<ProjectControl> projects = new ArrayList<ProjectControl>();
+ private final List<ProjectControl> projects = new ArrayList<>();
@Option(name = "--visible-to-all", usage = "to list only groups that are visible to all registered users")
private boolean visibleToAll;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java
index afa516f..a5777da 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java
@@ -14,6 +14,7 @@
package com.google.gerrit.server.index;
+import com.google.common.base.Objects;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
@@ -93,6 +94,17 @@
}
};
+ /** Project containing the change, as a prefix field. */
+ public static final FieldDef<ChangeData, String> PROJECTS =
+ new FieldDef.Single<ChangeData, String>(
+ ChangeQueryBuilder.FIELD_PROJECTS, FieldType.PREFIX, false) {
+ @Override
+ public String get(ChangeData input, FillArgs args)
+ throws OrmException {
+ return input.change().getProject().get();
+ }
+ };
+
/** Reference (aka branch) the change will submit onto. */
public static final FieldDef<ChangeData, String> REF =
new FieldDef.Single<ChangeData, String>(
@@ -104,8 +116,9 @@
}
};
+ @Deprecated
/** Topic, a short annotation on the branch. */
- public static final FieldDef<ChangeData, String> TOPIC =
+ public static final FieldDef<ChangeData, String> LEGACY_TOPIC =
new FieldDef.Single<ChangeData, String>(
ChangeQueryBuilder.FIELD_TOPIC, FieldType.EXACT, false) {
@Override
@@ -115,6 +128,17 @@
}
};
+ /** Topic, a short annotation on the branch. */
+ public static final FieldDef<ChangeData, String> TOPIC =
+ new FieldDef.Single<ChangeData, String>(
+ "topic2", FieldType.EXACT, false) {
+ @Override
+ public String get(ChangeData input, FillArgs args)
+ throws OrmException {
+ return Objects.firstNonNull(input.change().getTopic(), "");
+ }
+ };
+
// Same value as UPDATED, but implementations truncated to minutes.
@Deprecated
/** Last update time since January 1, 1970. */
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeSchemas.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeSchemas.java
index a46b22d..1a628d3 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeSchemas.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeSchemas.java
@@ -37,7 +37,7 @@
ChangeField.STATUS,
ChangeField.PROJECT,
ChangeField.REF,
- ChangeField.TOPIC,
+ ChangeField.LEGACY_TOPIC,
ChangeField.LEGACY_UPDATED,
ChangeField.LEGACY_SORTKEY,
ChangeField.PATH,
@@ -57,7 +57,7 @@
ChangeField.STATUS,
ChangeField.PROJECT,
ChangeField.REF,
- ChangeField.TOPIC,
+ ChangeField.LEGACY_TOPIC,
ChangeField.LEGACY_UPDATED,
ChangeField.LEGACY_SORTKEY,
ChangeField.PATH,
@@ -79,7 +79,7 @@
ChangeField.STATUS,
ChangeField.PROJECT,
ChangeField.REF,
- ChangeField.TOPIC,
+ ChangeField.LEGACY_TOPIC,
ChangeField.LEGACY_UPDATED,
ChangeField.SORTKEY,
ChangeField.PATH,
@@ -104,7 +104,7 @@
ChangeField.STATUS,
ChangeField.PROJECT,
ChangeField.REF,
- ChangeField.TOPIC,
+ ChangeField.LEGACY_TOPIC,
ChangeField.LEGACY_UPDATED,
ChangeField.SORTKEY,
ChangeField.PATH,
@@ -130,7 +130,7 @@
ChangeField.STATUS,
ChangeField.PROJECT,
ChangeField.REF,
- ChangeField.TOPIC,
+ ChangeField.LEGACY_TOPIC,
ChangeField.LEGACY_UPDATED,
ChangeField.SORTKEY,
ChangeField.FILE_PART,
@@ -147,12 +147,60 @@
ChangeField.APPROVAL,
ChangeField.MERGEABLE);
+ @SuppressWarnings("deprecation")
static final Schema<ChangeData> V8 = release(
ChangeField.LEGACY_ID,
ChangeField.ID,
ChangeField.STATUS,
ChangeField.PROJECT,
ChangeField.REF,
+ ChangeField.LEGACY_TOPIC,
+ ChangeField.UPDATED,
+ ChangeField.FILE_PART,
+ ChangeField.PATH,
+ ChangeField.OWNER,
+ ChangeField.REVIEWER,
+ ChangeField.COMMIT,
+ ChangeField.TR,
+ ChangeField.LABEL,
+ ChangeField.REVIEWED,
+ ChangeField.COMMIT_MESSAGE,
+ ChangeField.COMMENT,
+ ChangeField.CHANGE,
+ ChangeField.APPROVAL,
+ ChangeField.MERGEABLE);
+
+ @SuppressWarnings("deprecation")
+ static final Schema<ChangeData> V9 = release(
+ ChangeField.LEGACY_ID,
+ ChangeField.ID,
+ ChangeField.STATUS,
+ ChangeField.PROJECT,
+ ChangeField.PROJECTS,
+ ChangeField.REF,
+ ChangeField.LEGACY_TOPIC,
+ ChangeField.UPDATED,
+ ChangeField.FILE_PART,
+ ChangeField.PATH,
+ ChangeField.OWNER,
+ ChangeField.REVIEWER,
+ ChangeField.COMMIT,
+ ChangeField.TR,
+ ChangeField.LABEL,
+ ChangeField.REVIEWED,
+ ChangeField.COMMIT_MESSAGE,
+ ChangeField.COMMENT,
+ ChangeField.CHANGE,
+ ChangeField.APPROVAL,
+ ChangeField.MERGEABLE);
+
+ static final Schema<ChangeData> V10 = release(
+ ChangeField.LEGACY_ID,
+ ChangeField.ID,
+ ChangeField.STATUS,
+ ChangeField.PROJECT,
+ ChangeField.PROJECTS,
+ ChangeField.REF,
ChangeField.TOPIC,
ChangeField.UPDATED,
ChangeField.FILE_PART,
@@ -170,8 +218,9 @@
ChangeField.MERGEABLE);
+
private static Schema<ChangeData> release(Collection<FieldDef<ChangeData, ?>> fields) {
- return new Schema<ChangeData>(true, fields);
+ return new Schema<>(true, fields);
}
@SafeVarargs
@@ -182,7 +231,7 @@
@SafeVarargs
@SuppressWarnings("unused")
private static Schema<ChangeData> developer(FieldDef<ChangeData, ?>... fields) {
- return new Schema<ChangeData>(false, Arrays.asList(fields));
+ return new Schema<>(false, Arrays.asList(fields));
}
public static final ImmutableMap<Integer, Schema<ChangeData>> ALL;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexCollection.java
index 2558cb4..2380c76 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexCollection.java
@@ -35,7 +35,7 @@
@VisibleForTesting
public IndexCollection() {
this.writeIndexes = Lists.newCopyOnWriteArrayList();
- this.searchIndex = new AtomicReference<ChangeIndex>();
+ this.searchIndex = new AtomicReference<>();
}
/** @return the current search index version. */
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/Schema.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/Schema.java
index bda2ace..0de1379 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/Schema.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/Schema.java
@@ -82,6 +82,10 @@
return fields;
}
+ public final boolean hasField(FieldDef<T, ?> field) {
+ return fields.get(field.getName()) == field;
+ }
+
/**
* Build all fields in the schema from an input object.
* <p>
@@ -109,9 +113,9 @@
if (v == null) {
return null;
} else if (f.isRepeatable()) {
- return new Values<T>(f, (Iterable<?>) v);
+ return new Values<>(f, (Iterable<?>) v);
} else {
- return new Values<T>(f, Collections.singleton(v));
+ return new Values<>(f, Collections.singleton(v));
}
}
}).filter(Predicates.notNull());
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 4e51a73..d38c5a3 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
@@ -98,7 +98,7 @@
formatChange();
appendText(velocifyFile("ChangeFooter.vm"));
try {
- TreeSet<String> names = new TreeSet<String>();
+ TreeSet<String> names = new TreeSet<>();
for (Account.Id who : changeData.reviewers().values()) {
names.add(getNameEmailFor(who));
}
@@ -338,7 +338,7 @@
/** Find all users who are authors of any part of this change. */
protected Set<Account.Id> getAuthors() {
- Set<Account.Id> authors = new HashSet<Account.Id>();
+ Set<Account.Id> authors = new HashSet<>();
authors.add(change.getOwner());
if (patchSet != null) {
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 cb92b0f..32a95dd 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
@@ -65,7 +65,7 @@
public void setPatchLineComments(final List<PatchLineComment> plc) {
inlineComments = plc;
- Set<String> paths = new HashSet<String>();
+ Set<String> paths = new HashSet<>();
for (PatchLineComment c : plc) {
Patch.Key p = c.getKey().getParentKey();
if (!Patch.COMMIT_MSG.equals(p.getFileName())) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailHeader.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailHeader.java
index 6492a5e..d4dce70 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailHeader.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/EmailHeader.java
@@ -114,7 +114,7 @@
}
public static class AddressList extends EmailHeader {
- private final List<Address> list = new ArrayList<Address>();
+ private final List<Address> list = new ArrayList<>();
public AddressList() {
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java
index ac367ef..26cccb8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MailUtil.java
@@ -86,14 +86,14 @@
private final Set<Account.Id> cc;
public MailRecipients() {
- this.reviewers = new HashSet<Account.Id>();
- this.cc = new HashSet<Account.Id>();
+ this.reviewers = new HashSet<>();
+ this.cc = new HashSet<>();
}
public MailRecipients(final Set<Account.Id> reviewers,
final Set<Account.Id> cc) {
- this.reviewers = new HashSet<Account.Id>(reviewers);
- this.cc = new HashSet<Account.Id>(cc);
+ this.reviewers = new HashSet<>(reviewers);
+ this.cc = new HashSet<>(cc);
}
public void add(final MailRecipients recipients) {
@@ -111,14 +111,13 @@
}
public Set<Account.Id> getCcOnly() {
- final Set<Account.Id> cc = new HashSet<Account.Id>(this.cc);
+ final Set<Account.Id> cc = new HashSet<>(this.cc);
cc.removeAll(reviewers);
return Collections.unmodifiableSet(cc);
}
public Set<Account.Id> getAll() {
- final Set<Account.Id> all =
- new HashSet<Account.Id>(reviewers.size() + cc.size());
+ final Set<Account.Id> all = new HashSet<>(reviewers.size() + cc.size());
all.addAll(reviewers);
all.addAll(cc);
return Collections.unmodifiableSet(all);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MergedSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MergedSender.java
index 07a5f9a..5cb1ba1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/MergedSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/MergedSender.java
@@ -62,7 +62,7 @@
Table<Account.Id, String, PatchSetApproval> pos = HashBasedTable.create();
Table<Account.Id, String, PatchSetApproval> neg = HashBasedTable.create();
for (PatchSetApproval ca : args.approvalsUtil.byPatchSet(
- args.db.get(), changeData.notes(), patchSet.getId())) {
+ args.db.get(), changeData.changeControl(), patchSet.getId())) {
LabelType lt = labelTypes.byLabel(ca.getLabelId());
if (lt == null) {
continue;
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 9ff0dbd..0dbcbe0 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
@@ -26,8 +26,8 @@
/** Sends an email alerting a user to a new change for them to review. */
public abstract class NewChangeSender extends ChangeEmail {
- private final Set<Account.Id> reviewers = new HashSet<Account.Id>();
- private final Set<Account.Id> extraCC = new HashSet<Account.Id>();
+ private final Set<Account.Id> reviewers = new HashSet<>();
+ private final Set<Account.Id> extraCC = new HashSet<>();
protected NewChangeSender(EmailArguments ea, Change c) {
super(ea, c, "newchange");
@@ -61,7 +61,7 @@
if (reviewers.isEmpty()) {
return null;
}
- List<String> names = new ArrayList<String>();
+ List<String> names = new ArrayList<>();
for (Account.Id id : reviewers) {
names.add(getNameFor(id));
}
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 dc09a9c..32f74bc 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
@@ -52,7 +52,7 @@
private static final String HDR_CC = "CC";
protected String messageClass;
- private final HashSet<Account.Id> rcptTo = new HashSet<Account.Id>();
+ private final HashSet<Account.Id> rcptTo = new HashSet<>();
private final Map<String, EmailHeader> headers;
private final Set<Address> smtpRcptTo = Sets.newHashSet();
private Address smtpFromAddress;
@@ -66,7 +66,7 @@
protected OutgoingEmail(EmailArguments ea, String mc) {
args = ea;
messageClass = mc;
- headers = new LinkedHashMap<String, EmailHeader>();
+ headers = new LinkedHashMap<>();
}
public void setFrom(final Account.Id id) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ProjectWatch.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ProjectWatch.java
index 04c3f9f..3d16372 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/ProjectWatch.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/ProjectWatch.java
@@ -64,7 +64,7 @@
/** Returns all watchers that are relevant */
public final Watchers getWatchers(NotifyType type) throws OrmException {
Watchers matching = new Watchers();
- Set<Account.Id> projectWatchers = new HashSet<Account.Id>();
+ Set<Account.Id> projectWatchers = new HashSet<>();
for (AccountProjectWatch w : args.db.get().accountProjectWatches()
.byProject(project)) {
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 d80fb50..8412d22 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
@@ -33,8 +33,8 @@
public ReplacePatchSetSender create(Change change);
}
- private final Set<Account.Id> reviewers = new HashSet<Account.Id>();
- private final Set<Account.Id> extraCC = new HashSet<Account.Id>();
+ private final Set<Account.Id> reviewers = new HashSet<>();
+ private final Set<Account.Id> extraCC = new HashSet<>();
@Inject
public ReplacePatchSetSender(EmailArguments ea, @Assisted Change c) {
@@ -74,7 +74,7 @@
if (reviewers.isEmpty()) {
return null;
}
- List<String> names = new ArrayList<String>();
+ List<String> names = new ArrayList<>();
for (Account.Id id : reviewers) {
names.add(getNameFor(id));
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/SmtpEmailSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/SmtpEmailSender.java
index f16cb5a..b1c5955 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/SmtpEmailSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/SmtpEmailSender.java
@@ -107,7 +107,7 @@
smtpUser = cfg.getString("sendemail", null, "smtpuser");
smtpPass = cfg.getString("sendemail", null, "smtppass");
- Set<String> rcpt = new HashSet<String>();
+ Set<String> rcpt = new HashSet<>();
for (String addr : cfg.getStringList("sendemail", null, "allowrcpt")) {
rcpt.add(addr);
}
@@ -152,7 +152,7 @@
}
final Map<String, EmailHeader> hdrs =
- new LinkedHashMap<String, EmailHeader>(callerHeaders);
+ new LinkedHashMap<>(callerHeaders);
setMissingHeader(hdrs, "MIME-Version", "1.0");
setMissingHeader(hdrs, "Content-Type", "text/plain; charset=UTF-8");
setMissingHeader(hdrs, "Content-Transfer-Encoding", "8bit");
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 286bf4ad..37be365 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
@@ -414,6 +414,7 @@
protected void onLoad() throws IOException, ConfigInvalidException {
ObjectId rev = getRevision();
if (rev == null) {
+ loadDefaults();
return;
}
RevWalk walk = new RevWalk(reader);
@@ -439,6 +440,12 @@
}
}
+ private void loadDefaults() {
+ approvals = ImmutableListMultimap.of();
+ reviewers = ImmutableSetMultimap.of();
+ submitRecords = ImmutableList.of();
+ }
+
@Override
protected boolean onSave(CommitBuilder commit) {
throw new UnsupportedOperationException(
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigration.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigration.java
index c9ac8de..5321046 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigration.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NotesMigration.java
@@ -14,8 +14,6 @@
package com.google.gerrit.server.notedb;
-import static com.google.common.base.Preconditions.checkArgument;
-
import com.google.common.annotations.VisibleForTesting;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.inject.Inject;
@@ -36,7 +34,7 @@
static NotesMigration allEnabled() {
Config cfg = new Config();
cfg.setBoolean("notedb", null, "write", true);
- //cfg.setBoolean("notedb", "patchSetApprovals", "read", true);
+ cfg.setBoolean("notedb", "patchSetApprovals", "read", true);
return new NotesMigration(cfg);
}
@@ -48,8 +46,6 @@
write = cfg.getBoolean("notedb", null, "write", false);
readPatchSetApprovals =
cfg.getBoolean("notedb", "patchSetApprovals", "read", false);
- checkArgument(!readPatchSetApprovals,
- "notedb.readPatchSetApprovals not yet supported");
}
public boolean write() {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java
index 52cba09..4961bef 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineLoader.java
@@ -78,7 +78,7 @@
}
static IntraLineDiff compute(IntraLineDiffKey key) throws Exception {
- List<Edit> edits = new ArrayList<Edit>(key.getEdits());
+ List<Edit> edits = new ArrayList<>(key.getEdits());
Text aContent = key.getTextA();
Text bContent = key.getTextB();
combineLineEdits(edits, aContent, bContent);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineWorkerPool.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineWorkerPool.java
index 5c6338fe..49ae950 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineWorkerPool.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/IntraLineWorkerPool.java
@@ -45,7 +45,7 @@
int workers = cfg.getInt(
"cache", PatchListCacheImpl.INTRA_NAME, "maxIdleWorkers",
Runtime.getRuntime().availableProcessors() * 3 / 2);
- workerPool = new ArrayBlockingQueue<Worker>(workers, true /* fair */);
+ workerPool = new ArrayBlockingQueue<>(workers, true /* fair */);
}
Worker acquire() {
@@ -73,8 +73,8 @@
private final ArrayBlockingQueue<Result> result;
Worker() {
- input = new ArrayBlockingQueue<Input>(1);
- result = new ArrayBlockingQueue<Result>(1);
+ input = new ArrayBlockingQueue<>(1);
+ result = new ArrayBlockingQueue<>(1);
setName("IntraLineDiff-" + count.getAndIncrement());
setDaemon(true);
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 59e3050..7d44912 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
@@ -127,7 +127,7 @@
* how the cache is keyed versus how the database is keyed.
*/
public List<Patch> toPatchList(final PatchSet.Id setId) {
- final ArrayList<Patch> r = new ArrayList<Patch>(patches.length);
+ final ArrayList<Patch> r = new ArrayList<>(patches.length);
for (final PatchListEntry e : patches) {
r.add(e.toPatch(setId));
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListEntry.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListEntry.java
index 852165c..31f5e96 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListEntry.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListEntry.java
@@ -168,7 +168,7 @@
public List<String> getHeaderLines() {
final IntList m = RawParseUtils.lineMap(header, 0, header.length);
- final List<String> headerLines = new ArrayList<String>(m.size() - 1);
+ final List<String> headerLines = new ArrayList<>(m.size() - 1);
for (int i = 1; i < m.size() - 1; i++) {
final int b = m.get(i);
int e = m.get(i + 1);
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 2cda334..f704ea2 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
@@ -311,7 +311,7 @@
MergeFormatter fmt = new MergeFormatter();
Map<String, MergeResult<? extends Sequence>> r = m.getMergeResults();
- Map<String, ObjectId> resolved = new HashMap<String, ObjectId>();
+ Map<String, ObjectId> resolved = new HashMap<>();
for (Map.Entry<String, MergeResult<? extends Sequence>> entry : r.entrySet()) {
MergeResult<? extends Sequence> p = entry.getValue();
TemporaryBuffer buf = new TemporaryBuffer.LocalFile(10 * 1024 * 1024);
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 0db7dee..0c98ccf 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
@@ -136,7 +136,7 @@
a.resolve(null, aId);
b.resolve(a, bId);
- edits = new ArrayList<Edit>(content.getEdits());
+ edits = new ArrayList<>(content.getEdits());
if (!isModify(content)) {
intralineDifferenceIsPossible = false;
@@ -148,7 +148,7 @@
if (d != null) {
switch (d.getStatus()) {
case EDIT_LIST:
- edits = new ArrayList<Edit>(d.getEdits());
+ edits = new ArrayList<>(d.getEdits());
break;
case DISABLED:
@@ -171,7 +171,9 @@
}
}
- ensureCommentsVisible(comments);
+ if (comments != null) {
+ ensureCommentsVisible(comments);
+ }
boolean hugeFile = false;
if (a.mode == FileMode.GITLINK || b.mode == FileMode.GITLINK) {
@@ -185,7 +187,7 @@
for (int i = 0; i < a.size(); i++) {
a.addLine(i);
}
- edits = new ArrayList<Edit>(1);
+ edits = new ArrayList<>(1);
edits.add(new Edit(a.size(), a.size()));
} else {
@@ -269,7 +271,7 @@
// correct hunks from this, but because the Edit is empty they will not
// style it specially.
//
- final List<Edit> empty = new ArrayList<Edit>();
+ final List<Edit> empty = new ArrayList<>();
int lastLine;
lastLine = -1;
@@ -450,7 +452,9 @@
id = tw != null ? tw.getObjectId(0) : ObjectId.zeroId();
mode = tw != null ? tw.getFileMode(0) : FileMode.MISSING;
- reuse = other != null && other.id.equals(id) && other.mode == mode;
+ reuse = other != null
+ && other.id.equals(id)
+ && (other.mode == mode || isBothFile(other.mode, mode));
if (reuse) {
srcContent = other.srcContent;
@@ -514,4 +518,9 @@
return TreeWalk.forPath(reader, path, tree);
}
}
+
+ private static boolean isBothFile(FileMode a, FileMode b) {
+ return (a.getBits() & FileMode.TYPE_FILE) == FileMode.TYPE_FILE
+ && (b.getBits() & FileMode.TYPE_FILE) == FileMode.TYPE_FILE;
+ }
}
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 ed4470a..4be9e7d 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
@@ -79,6 +79,8 @@
private final AccountDiffPreference diffPrefs;
private final Change.Id changeId;
+ private boolean loadHistory = true;
+ private boolean loadComments = true;
private Change change;
private Project.NameKey projectKey;
@@ -113,6 +115,14 @@
changeId = patchSetB.getParentKey();
}
+ public void setLoadHistory(boolean load) {
+ loadHistory = load;
+ }
+
+ public void setLoadComments(boolean load) {
+ loadComments = load;
+ }
+
@Override
public PatchScript call() throws OrmException, NoSuchChangeException,
LargeObjectException {
@@ -149,7 +159,7 @@
content.getOldName(), //
content.getNewName());
- return b.toPatchScript(content, comments, history);
+ return b.toPatchScript(content, comments, history);
} catch (PatchListNotAvailableException e) {
throw new NoSuchChangeException(changeId, e);
} catch (IOException e) {
@@ -212,93 +222,96 @@
private void loadCommentsAndHistory(final ChangeType changeType,
final String oldName, final String newName) throws OrmException {
- history = new ArrayList<Patch>();
- comments = new CommentDetail(psa, psb);
+ final Map<Patch.Key, Patch> byKey = new HashMap<>();
- final Map<Patch.Key, Patch> byKey = new HashMap<Patch.Key, Patch>();
- final AccountInfoCacheFactory aic = aicFactory.create();
-
- // This seems like a cheap trick. It doesn't properly account for a
- // file that gets renamed between patch set 1 and patch set 2. We
- // will wind up packing the wrong Patch object because we didn't do
- // proper rename detection between the patch sets.
- //
- for (final PatchSet ps : db.patchSets().byChange(changeId)) {
- if (!control.isPatchVisible(ps, db)) {
- continue;
- }
- String name = fileName;
- if (psa != null) {
- switch (changeType) {
- case COPIED:
- case RENAMED:
- if (ps.getId().equals(psa)) {
- name = oldName;
- }
- break;
-
- case MODIFIED:
- case DELETED:
- case ADDED:
- case REWRITE:
- break;
+ if (loadHistory) {
+ // This seems like a cheap trick. It doesn't properly account for a
+ // file that gets renamed between patch set 1 and patch set 2. We
+ // will wind up packing the wrong Patch object because we didn't do
+ // proper rename detection between the patch sets.
+ //
+ history = new ArrayList<>();
+ for (final PatchSet ps : db.patchSets().byChange(changeId)) {
+ if (!control.isPatchVisible(ps, db)) {
+ continue;
}
- }
-
- final Patch p = new Patch(new Patch.Key(ps.getId(), name));
- history.add(p);
- byKey.put(p.getKey(), p);
- }
-
- switch (changeType) {
- case ADDED:
- case MODIFIED:
- loadPublished(byKey, aic, newName);
- break;
-
- case DELETED:
- loadPublished(byKey, aic, newName);
- break;
-
- case COPIED:
- case RENAMED:
+ String name = fileName;
if (psa != null) {
- loadPublished(byKey, aic, oldName);
- }
- loadPublished(byKey, aic, newName);
- break;
+ switch (changeType) {
+ case COPIED:
+ case RENAMED:
+ if (ps.getId().equals(psa)) {
+ name = oldName;
+ }
+ break;
- case REWRITE:
- break;
+ case MODIFIED:
+ case DELETED:
+ case ADDED:
+ case REWRITE:
+ break;
+ }
+ }
+
+ final Patch p = new Patch(new Patch.Key(ps.getId(), name));
+ history.add(p);
+ byKey.put(p.getKey(), p);
+ }
}
- final CurrentUser user = control.getCurrentUser();
- if (user.isIdentifiedUser()) {
- final Account.Id me = ((IdentifiedUser) user).getAccountId();
+ if (loadComments) {
+ final AccountInfoCacheFactory aic = aicFactory.create();
+ comments = new CommentDetail(psa, psb);
switch (changeType) {
case ADDED:
case MODIFIED:
- loadDrafts(byKey, aic, me, newName);
+ loadPublished(byKey, aic, newName);
break;
case DELETED:
- loadDrafts(byKey, aic, me, newName);
+ loadPublished(byKey, aic, newName);
break;
case COPIED:
case RENAMED:
if (psa != null) {
- loadDrafts(byKey, aic, me, oldName);
+ loadPublished(byKey, aic, oldName);
}
- loadDrafts(byKey, aic, me, newName);
+ loadPublished(byKey, aic, newName);
break;
case REWRITE:
break;
}
- }
- comments.setAccountInfoCache(aic.create());
+ final CurrentUser user = control.getCurrentUser();
+ if (user.isIdentifiedUser()) {
+ final Account.Id me = ((IdentifiedUser) user).getAccountId();
+ switch (changeType) {
+ case ADDED:
+ case MODIFIED:
+ loadDrafts(byKey, aic, me, newName);
+ break;
+
+ case DELETED:
+ loadDrafts(byKey, aic, me, newName);
+ break;
+
+ case COPIED:
+ case RENAMED:
+ if (psa != null) {
+ loadDrafts(byKey, aic, me, oldName);
+ }
+ loadDrafts(byKey, aic, me, newName);
+ break;
+
+ case REWRITE:
+ break;
+ }
+ }
+
+ comments.setAccountInfoCache(aic.create());
+ }
}
private void loadPublished(final Map<Patch.Key, Patch> byKey,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java
index 8165bf2..340300a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchSetInfoFactory.java
@@ -123,8 +123,7 @@
private List<PatchSetInfo.ParentInfo> toParentInfos(final RevCommit[] parents,
final RevWalk walk) throws IOException, MissingObjectException {
- List<PatchSetInfo.ParentInfo> pInfos =
- new ArrayList<PatchSetInfo.ParentInfo>(parents.length);
+ List<PatchSetInfo.ParentInfo> pInfos = new ArrayList<>(parents.length);
for (RevCommit parent : parents) {
walk.parseBody(parent);
RevId rev = new RevId(parent.getId().name());
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 2f25ed0..c4fe1ec 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
@@ -57,26 +57,17 @@
@Override
public ExtensionMetaData apply(ClassData classData) {
return new ExtensionMetaData(classData.className,
- classData.annotationValue, classData.interfaces);
- }
- };
- private static final Function<String, String> TO_JAVA_QUALIFIED_CLASS_NAME =
- new Function<String, String>() {
- @Override
- public String apply(String in) {
- return in.replace("/", ".");
+ classData.annotationValue);
}
};
public static class ExtensionMetaData {
private final String className;
private final String annotationValue;
- private final Iterable<String> interfaces;
- private ExtensionMetaData(String className, String annotationValue, Iterable<String> interfaces) {
+ private ExtensionMetaData(String className, String annotationValue) {
this.className = className;
this.annotationValue = annotationValue;
- this.interfaces = interfaces;
}
public String getAnnotationValue() {
@@ -86,10 +77,6 @@
public String getClassName() {
return className;
}
-
- public Iterable<String> getInterfaces() {
- return interfaces;
- }
}
public static Map<Class<? extends Annotation>, Iterable<ExtensionMetaData>> scan(
@@ -183,7 +170,6 @@
String className;
String annotationName;
String annotationValue;
- Iterable<String> interfaces;
Iterable<String> exports;
private ClassData(Iterable<String> exports) {
@@ -199,9 +185,6 @@
@Override
public void visit(int version, int access, String name, String signature,
String superName, String[] interfaces) {
- this.interfaces =
- Iterables.transform(Sets.newHashSet(interfaces),
- TO_JAVA_QUALIFIED_CLASS_NAME);
this.className = Type.getObjectType(name).getClassName();
this.access = access;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
index ae90d5b..ba90bdd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginGuiceEnvironment.java
@@ -24,6 +24,7 @@
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.gerrit.common.Nullable;
+import com.google.gerrit.extensions.annotations.RootRelative;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.gerrit.extensions.registration.DynamicMap;
@@ -56,6 +57,8 @@
import java.util.concurrent.CopyOnWriteArrayList;
import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
/**
* Tracks Guice bindings that should be exposed to loaded plugins.
@@ -82,6 +85,8 @@
private Provider<ModuleGenerator> httpGen;
private Map<TypeLiteral<?>, DynamicItem<?>> sysItems;
+ private Map<TypeLiteral<?>, DynamicItem<?>> sshItems;
+ private Map<TypeLiteral<?>, DynamicItem<?>> httpItems;
private Map<TypeLiteral<?>, DynamicSet<?>> sysSets;
private Map<TypeLiteral<?>, DynamicSet<?>> sshSets;
@@ -103,10 +108,10 @@
this.copyConfigModule = ccm;
this.copyConfigKeys = Guice.createInjector(ccm).getAllBindings().keySet();
- onStart = new CopyOnWriteArrayList<StartPluginListener>();
+ onStart = new CopyOnWriteArrayList<>();
onStart.addAll(listeners(sysInjector, StartPluginListener.class));
- onReload = new CopyOnWriteArrayList<ReloadPluginListener>();
+ onReload = new CopyOnWriteArrayList<>();
onReload.addAll(listeners(sysInjector, ReloadPluginListener.class));
sysItems = dynamicItemsOf(sysInjector);
@@ -119,7 +124,9 @@
}
boolean hasDynamicItem(TypeLiteral<?> type) {
- return sysItems.containsKey(type);
+ return sysItems.containsKey(type)
+ || (sshItems != null && sshItems.containsKey(type))
+ || (httpItems != null && httpItems.containsKey(type));
}
boolean hasDynamicSet(TypeLiteral<?> type) {
@@ -154,6 +161,7 @@
public void setSshInjector(Injector injector) {
sshModule = copy(injector);
sshGen = injector.getProvider(ModuleGenerator.class);
+ sshItems = dynamicItemsOf(injector);
sshSets = dynamicSetsOf(injector);
sshMaps = dynamicMapsOf(injector);
onStart.addAll(listeners(injector, StartPluginListener.class));
@@ -175,6 +183,7 @@
public void setHttpInjector(Injector injector) {
httpModule = copy(injector);
httpGen = injector.getProvider(ModuleGenerator.class);
+ httpItems = dynamicItemsOf(injector);
httpSets = dynamicSetsOf(injector);
httpMaps = dynamicMapsOf(injector);
onStart.addAll(listeners(injector, StartPluginListener.class));
@@ -209,6 +218,8 @@
RequestContext oldContext = enter(plugin);
try {
attachItem(sysItems, plugin.getSysInjector(), plugin);
+ attachItem(sshItems, plugin.getSshInjector(), plugin);
+ attachItem(httpItems, plugin.getHttpInjector(), plugin);
attachSet(sysSets, plugin.getSysInjector(), plugin);
attachSet(sshSets, plugin.getSshInjector(), plugin);
@@ -274,6 +285,8 @@
reattachSet(old, httpSets, newPlugin.getHttpInjector(), newPlugin);
reattachItem(old, sysItems, newPlugin.getSysInjector(), newPlugin);
+ reattachItem(old, sshItems, newPlugin.getSshInjector(), newPlugin);
+ reattachItem(old, httpItems, newPlugin.getHttpInjector(), newPlugin);
} finally {
exit(oldContext);
}
@@ -459,9 +472,13 @@
private Module copy(Injector src) {
Set<TypeLiteral<?>> dynamicTypes = Sets.newHashSet();
+ Set<TypeLiteral<?>> dynamicItemTypes = Sets.newHashSet();
for (Map.Entry<Key<?>, Binding<?>> e : src.getBindings().entrySet()) {
TypeLiteral<?> type = e.getKey().getTypeLiteral();
- if (type.getRawType() == DynamicSet.class
+ if (type.getRawType() == DynamicItem.class) {
+ ParameterizedType t = (ParameterizedType) type.getType();
+ dynamicItemTypes.add(TypeLiteral.get(t.getActualTypeArguments()[0]));
+ } else if (type.getRawType() == DynamicSet.class
|| type.getRawType() == DynamicMap.class) {
ParameterizedType t = (ParameterizedType) type.getType();
dynamicTypes.add(TypeLiteral.get(t.getActualTypeArguments()[0]));
@@ -478,6 +495,8 @@
// using DynamicSet<F> or DynamicMap<F> internally. That should be
// exported to plugins.
continue;
+ } else if (dynamicItemTypes.contains(e.getKey().getTypeLiteral())) {
+ continue;
} else if (shouldCopy(e.getKey())) {
bindings.put(e.getKey(), e.getValue());
}
@@ -485,6 +504,12 @@
bindings.remove(Key.get(Injector.class));
bindings.remove(Key.get(java.util.logging.Logger.class));
+ final @Nullable Binding<HttpServletRequest> requestBinding =
+ src.getExistingBinding(Key.get(HttpServletRequest.class));
+
+ final @Nullable Binding<HttpServletResponse> responseBinding =
+ src.getExistingBinding(Key.get(HttpServletResponse.class));
+
return new AbstractModule() {
@SuppressWarnings("unchecked")
@Override
@@ -494,6 +519,17 @@
Binding<Object> b = (Binding<Object>) e.getValue();
bind(k).toProvider(b.getProvider());
}
+
+ if (requestBinding != null) {
+ bind(HttpServletRequest.class)
+ .annotatedWith(RootRelative.class)
+ .toProvider(requestBinding.getProvider());
+ }
+ if (responseBinding != null) {
+ bind(HttpServletResponse.class)
+ .annotatedWith(RootRelative.class)
+ .toProvider(responseBinding.getProvider());
+ }
}
};
}
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 732da4b..96d9999 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
@@ -31,6 +31,7 @@
import com.google.gerrit.extensions.systemstatus.ServerInformation;
import com.google.gerrit.extensions.webui.JavaScriptPlugin;
import com.google.gerrit.server.PluginUser;
+import com.google.gerrit.server.cache.PersistentCacheFactory;
import com.google.gerrit.server.config.CanonicalWebUrl;
import com.google.gerrit.server.config.ConfigUtil;
import com.google.gerrit.server.config.GerritServerConfig;
@@ -76,6 +77,10 @@
static final String PLUGIN_TMP_PREFIX = "plugin_";
static final Logger log = LoggerFactory.getLogger(PluginLoader.class);
+ public static String getPluginName(File srcFile) throws IOException {
+ return Objects.firstNonNull(getGerritPluginName(srcFile), nameOf(srcFile)).toLowerCase();
+ }
+
private final File pluginsDir;
private final File dataDir;
private final File tmpDir;
@@ -90,6 +95,7 @@
private final Provider<PluginCleanerTask> cleaner;
private final PluginScannerThread scanner;
private final Provider<String> urlProvider;
+ private final PersistentCacheFactory persistentCacheFactory;
private final boolean remoteAdmin;
@Inject
@@ -99,7 +105,8 @@
PluginUser.Factory puf,
Provider<PluginCleanerTask> pct,
@GerritServerConfig Config cfg,
- @CanonicalWebUrl Provider<String> provider) {
+ @CanonicalWebUrl Provider<String> provider,
+ PersistentCacheFactory cacheFactory) {
pluginsDir = sitePaths.plugins_dir;
dataDir = sitePaths.data_dir;
tmpDir = sitePaths.tmp_dir;
@@ -113,6 +120,7 @@
cleanupHandles = Maps.newConcurrentMap();
cleaner = pct;
urlProvider = provider;
+ persistentCacheFactory = cacheFactory;
remoteAdmin =
cfg.getBoolean("plugins", null, "allowRemoteAdmin", false);
@@ -143,7 +151,7 @@
if (!all) {
return running.values();
} else {
- ArrayList<Plugin> plugins = new ArrayList<Plugin>(running.values());
+ List<Plugin> plugins = new ArrayList<>(running.values());
plugins.addAll(disabled.values());
return plugins;
}
@@ -228,6 +236,7 @@
}
synchronized private void unloadPlugin(Plugin plugin) {
+ persistentCacheFactory.onStop(plugin);
String name = plugin.getName();
log.info(String.format("Unloading plugin %s", name));
plugin.stop(env);
@@ -577,7 +586,7 @@
CharMatcher.is('/').trimTrailingFrom(urlProvider.get()),
name);
- Plugin plugin = new JarPlugin(name, url,
+ Plugin plugin = new ServerPlugin(name, url,
pluginUserFactory.create(name),
srcJar, snapshot,
jarFile, manifest,
@@ -656,7 +665,7 @@
// If multiple plugin files provide the same plugin name, then only
// the first plugin remains active and all other plugins with the same
// name are disabled.
- private static Multimap<String, File> prunePlugins(File pluginsDir) {
+ public static Multimap<String, File> prunePlugins(File pluginsDir) {
List<File> jars = scanJarsInPluginsDirectory(pluginsDir);
Multimap<String, File> map;
try {
@@ -752,8 +761,7 @@
throws IOException {
Multimap<String, File> map = LinkedHashMultimap.create();
for (File srcFile : plugins) {
- map.put(Objects.firstNonNull(getGerritPluginName(srcFile),
- nameOf(srcFile)), srcFile);
+ map.put(getPluginName(srcFile), srcFile);
}
return map;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java
similarity index 99%
rename from gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPlugin.java
rename to gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java
index 1568997..8dae5ae 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPlugin.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ServerPlugin.java
@@ -40,7 +40,7 @@
import java.util.jar.JarFile;
import java.util.jar.Manifest;
-class JarPlugin extends Plugin {
+class ServerPlugin extends Plugin {
/** Unique key that changes whenever a plugin reloads. */
public static final class CacheKey {
@@ -72,7 +72,7 @@
private LifecycleManager manager;
private List<ReloadableRegistrationHandle<?>> reloadableHandles;
- public JarPlugin(String name,
+ public ServerPlugin(String name,
String pluginCanonicalWebUrl,
PluginUser pluginUser,
File srcJar,
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 8e3c1e9..1ef5378 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
@@ -22,13 +22,13 @@
import com.google.gerrit.common.data.RefConfigSection;
import com.google.gerrit.common.data.SubmitRecord;
import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.extensions.common.SubmitType;
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.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.ApprovalsUtil;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.notedb.ChangeNotes;
@@ -188,29 +188,25 @@
}
}
- private final ApprovalsUtil approvalsUtil;
private final ChangeData.Factory changeDataFactory;
private final RefControl refControl;
private final ChangeNotes notes;
@AssistedInject
ChangeControl(
- ApprovalsUtil approvalsUtil,
ChangeData.Factory changeDataFactory,
ChangeNotes.Factory notesFactory,
@Assisted RefControl refControl,
@Assisted Change change) {
- this(approvalsUtil, changeDataFactory, refControl,
+ this(changeDataFactory, refControl,
notesFactory.create(change));
}
@AssistedInject
ChangeControl(
- ApprovalsUtil approvalsUtil,
ChangeData.Factory changeDataFactory,
@Assisted RefControl refControl,
@Assisted ChangeNotes notes) {
- this.approvalsUtil = approvalsUtil;
this.changeDataFactory = changeDataFactory;
this.refControl = refControl;
this.notes = notes;
@@ -220,7 +216,7 @@
if (getCurrentUser().equals(who)) {
return this;
}
- return new ChangeControl(approvalsUtil, changeDataFactory,
+ return new ChangeControl(changeDataFactory,
getRefControl().forUser(who), notes);
}
@@ -509,7 +505,7 @@
* the out collection is reversed to restore it to the original ordering.
*/
public List<SubmitRecord> resultsToSubmitRecord(Term submitRule, List<Term> results) {
- List<SubmitRecord> out = new ArrayList<SubmitRecord>(results.size());
+ List<SubmitRecord> out = new ArrayList<>(results.size());
for (int resultIdx = results.size() - 1; 0 <= resultIdx; resultIdx--) {
Term submitRecord = results.get(resultIdx);
SubmitRecord rec = new SubmitRecord();
@@ -538,7 +534,7 @@
return logInvalidResult(submitRule, submitRecord);
}
- rec.labels = new ArrayList<SubmitRecord.Label> (submitRecord.arity());
+ rec.labels = new ArrayList<>(submitRecord.arity());
for (Term state : ((StructureTerm) submitRecord).args()) {
if (!state.isStructure() || 2 != state.arity() || !"label".equals(state.name())) {
@@ -640,7 +636,7 @@
String typeName = ((SymbolTerm)typeTerm).name();
try {
return SubmitTypeRecord.OK(
- Project.SubmitType.valueOf(typeName.toUpperCase()));
+ SubmitType.valueOf(typeName.toUpperCase()));
} catch (IllegalArgumentException e) {
return logInvalidType(evaluator.getSubmitRule(), typeName);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfo.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfo.java
index bb620a0..6ca05f2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfo.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ConfigInfo.java
@@ -18,13 +18,13 @@
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.gerrit.extensions.common.ActionInfo;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.registration.DynamicMap.Entry;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.extensions.webui.UiAction;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.server.config.AllProjectsNameProvider;
import com.google.gerrit.server.config.PluginConfig;
import com.google.gerrit.server.config.PluginConfigFactory;
@@ -48,7 +48,7 @@
public InheritedBooleanInfo requireChangeId;
public MaxObjectSizeLimitInfo maxObjectSizeLimit;
public SubmitType submitType;
- public Project.State state;
+ public com.google.gerrit.extensions.api.projects.ProjectState state;
public Map<String, Map<String, ConfigParameterInfo>> pluginConfig;
public Map<String, ActionInfo> actions;
@@ -108,7 +108,7 @@
this.maxObjectSizeLimit = maxObjectSizeLimit;
this.submitType = p.getSubmitType();
- this.state = p.getState() != Project.State.ACTIVE ? p.getState() : null;
+ this.state = p.getState() != com.google.gerrit.extensions.api.projects.ProjectState.ACTIVE ? p.getState() : null;
this.commentlinks = Maps.newLinkedHashMap();
for (CommentLinkInfo cl : projectState.getCommentLinks()) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java
index 5f3d2da..37ab506 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java
@@ -20,6 +20,10 @@
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.common.errors.ProjectCreationFailedException;
import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
@@ -30,14 +34,9 @@
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.git.ProjectConfig;
import com.google.gerrit.server.group.GroupsCollection;
-import com.google.gerrit.server.project.CreateProject.Input;
-import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
-import com.google.gerrit.server.project.PutConfig.ConfigValue;
import com.google.gerrit.server.validators.ProjectCreationValidationListener;
import com.google.gerrit.server.validators.ValidationException;
import com.google.inject.Inject;
@@ -48,27 +47,9 @@
import java.io.IOException;
import java.util.List;
-import java.util.Map;
@RequiresCapability(GlobalCapability.CREATE_PROJECT)
-public class CreateProject implements RestModifyView<TopLevelResource, Input> {
- public static class Input {
- public String name;
- public String parent;
- public String description;
- public boolean permissionsOnly;
- public boolean createEmptyCommit;
- public SubmitType submitType;
- public List<String> branches;
- public List<String> owners;
- public InheritableBoolean useContributorAgreements;
- public InheritableBoolean useSignedOffBy;
- public InheritableBoolean useContentMerge;
- public InheritableBoolean requireChangeId;
- public String maxObjectSizeLimit;
- public Map<String, Map<String, ConfigValue>> pluginConfigValues;
- }
-
+public class CreateProject implements RestModifyView<TopLevelResource, ProjectInput> {
public static interface Factory {
CreateProject create(String name);
}
@@ -103,12 +84,12 @@
}
@Override
- public Response<ProjectInfo> apply(TopLevelResource resource, Input input)
+ public Response<ProjectInfo> apply(TopLevelResource resource, ProjectInput input)
throws BadRequestException, UnprocessableEntityException,
ResourceConflictException, ProjectCreationFailedException,
ResourceNotFoundException, IOException {
if (input == null) {
- input = new Input();
+ input = new ProjectInput();
}
if (input.name != null && !name.equals(input.name)) {
throw new BadRequestException("name must match URL");
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProjectArgs.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProjectArgs.java
index ea20cea..e937e0f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProjectArgs.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProjectArgs.java
@@ -14,10 +14,10 @@
package com.google.gerrit.server.project;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import java.util.List;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java
index 1659cb7..815653f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetChildProject.java
@@ -14,9 +14,9 @@
package com.google.gerrit.server.project;
+import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
import com.google.inject.Inject;
import org.kohsuke.args4j.Option;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetProject.java
index 961f7b2..af55c15 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetProject.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetProject.java
@@ -14,8 +14,8 @@
package com.google.gerrit.server.project;
+import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.RestReadView;
-import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
import com.google.inject.Inject;
class GetProject implements RestReadView<ProjectResource> {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java
index b39e362c..6a4f013 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListBranches.java
@@ -16,11 +16,17 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
+import com.google.gerrit.extensions.common.ActionInfo;
+import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.extensions.webui.UiAction;
import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.extensions.webui.UiActions;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject;
+import com.google.inject.util.Providers;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Constants;
@@ -34,14 +40,17 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.TreeMap;
public class ListBranches implements RestReadView<ProjectResource> {
-
private final GitRepositoryManager repoManager;
+ private final DynamicMap<RestView<BranchResource>> branchViews;
@Inject
- public ListBranches(GitRepositoryManager repoManager) {
+ public ListBranches(GitRepositoryManager repoManager,
+ DynamicMap<RestView<BranchResource>> branchViews) {
this.repoManager = repoManager;
+ this.branchViews = branchViews;
}
@Override
@@ -136,17 +145,28 @@
return branches;
}
- private static BranchInfo createBranchInfo(Ref ref, RefControl refControl,
+ private BranchInfo createBranchInfo(Ref ref, RefControl refControl,
Set<String> targets) {
- return new BranchInfo(ref.getName(),
+ BranchInfo info = new BranchInfo(ref.getName(),
ref.getObjectId() != null ? ref.getObjectId().name() : null,
!targets.contains(ref.getName()) && refControl.canDelete());
+ for (UiAction.Description d : UiActions.from(
+ branchViews,
+ new BranchResource(refControl.getProjectControl(), info),
+ Providers.of(refControl.getCurrentUser()))) {
+ if (info.actions == null) {
+ info.actions = new TreeMap<>();
+ }
+ info.actions.put(d.getId(), new ActionInfo(d));
+ }
+ return info;
}
public static class BranchInfo {
public String ref;
public String revision;
public Boolean canDelete;
+ public Map<String, ActionInfo> actions;
public BranchInfo(String ref, String revision, boolean canDelete) {
this.ref = ref;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java
index 58abe40..486915a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListChildProjects.java
@@ -16,11 +16,11 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.config.AllProjectsName;
-import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
import com.google.inject.Inject;
import org.kohsuke.args4j.Option;
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 d0b10dc..5153c06 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
@@ -21,22 +21,26 @@
import com.google.common.collect.Maps;
import com.google.gerrit.common.data.GroupReference;
import com.google.gerrit.common.errors.NoSuchGroupException;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
import com.google.gerrit.extensions.restapi.BinaryResult;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.extensions.restapi.TopLevelResource;
+import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.OutputFormat;
import com.google.gerrit.server.StringUtil;
+import com.google.gerrit.server.WebLinks;
import com.google.gerrit.server.account.GroupCache;
import com.google.gerrit.server.account.GroupControl;
import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
import com.google.gerrit.server.util.TreeFormatter;
import com.google.gson.reflect.TypeToken;
import com.google.inject.Inject;
+import com.google.inject.Provider;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Constants;
@@ -105,6 +109,7 @@
private final GroupControl.Factory groupControlFactory;
private final GitRepositoryManager repoManager;
private final ProjectNode.Factory projectNodeFactory;
+ private final Provider<WebLinks> webLinks;
@Deprecated
@Option(name = "--format", usage = "(deprecated) output format")
@@ -178,13 +183,15 @@
@Inject
protected ListProjects(CurrentUser currentUser, ProjectCache projectCache,
GroupCache groupCache, GroupControl.Factory groupControlFactory,
- GitRepositoryManager repoManager, ProjectNode.Factory projectNodeFactory) {
+ GitRepositoryManager repoManager, ProjectNode.Factory projectNodeFactory,
+ Provider<WebLinks> webLinks) {
this.currentUser = currentUser;
this.projectCache = projectCache;
this.groupCache = groupCache;
this.groupControlFactory = groupControlFactory;
this.repoManager = repoManager;
this.projectNodeFactory = projectNodeFactory;
+ this.webLinks = webLinks;
}
public List<String> getShowBranch() {
@@ -240,10 +247,9 @@
int found = 0;
Map<String, ProjectInfo> output = Maps.newTreeMap();
Map<String, String> hiddenNames = Maps.newHashMap();
- Set<String> rejected = new HashSet<String>();
+ Set<String> rejected = new HashSet<>();
- final TreeMap<Project.NameKey, ProjectNode> treeMap =
- new TreeMap<Project.NameKey, ProjectNode>();
+ final TreeMap<Project.NameKey, ProjectNode> treeMap = new TreeMap<>();
try {
for (final Project.NameKey projectName : scan()) {
final ProjectState e = projectCache.get(projectName);
@@ -367,6 +373,13 @@
log.warn("Unexpected error reading " + projectName, err);
continue;
}
+
+ info.webLinks = Lists.newArrayList();
+ for (WebLinks.Link link : webLinks.get().getProjectLinks(projectName.get())) {
+ if (!Strings.isNullOrEmpty(link.name) && !Strings.isNullOrEmpty(link.url)) {
+ info.webLinks.add(new WebLinkInfo(link.name, link.url));
+ }
+ }
}
if (foundIndex++ < start) {
@@ -403,7 +416,7 @@
}
for (ProjectInfo info : output.values()) {
- info.finish();
+ info.id = Url.encode(info.name);
info.name = null;
}
if (stdout == null) {
@@ -441,7 +454,7 @@
private void printProjectTree(final PrintWriter stdout,
final TreeMap<Project.NameKey, ProjectNode> treeMap) {
- final SortedSet<ProjectNode> sortedNodes = new TreeSet<ProjectNode>();
+ final SortedSet<ProjectNode> sortedNodes = new TreeSet<>();
// Builds the inheritance tree using a list.
//
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PerRequestProjectControlCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PerRequestProjectControlCache.java
index 19a42ae..f46a881 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PerRequestProjectControlCache.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PerRequestProjectControlCache.java
@@ -34,7 +34,7 @@
CurrentUser userProvider) {
this.projectCache = projectCache;
this.user = userProvider;
- this.controls = new HashMap<Project.NameKey, ProjectControl>();
+ this.controls = new HashMap<>();
}
ProjectControl get(Project.NameKey nameKey) throws NoSuchProjectException {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PerformCreateProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PerformCreateProject.java
index ca006de..f8cd9c1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PerformCreateProject.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PerformCreateProject.java
@@ -22,12 +22,12 @@
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.common.errors.ProjectCreationFailedException;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.extensions.events.NewProjectCreatedListener;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.GroupBackend;
@@ -240,11 +240,10 @@
if (createProjectArgs.ownerIds == null
|| createProjectArgs.ownerIds.isEmpty()) {
- createProjectArgs.ownerIds =
- new ArrayList<AccountGroup.UUID>(projectOwnerGroups);
+ createProjectArgs.ownerIds = new ArrayList<>(projectOwnerGroups);
}
- List<String> transformedBranches = new ArrayList<String>();
+ List<String> transformedBranches = new ArrayList<>();
if (createProjectArgs.branch == null ||
createProjectArgs.branch.isEmpty()) {
createProjectArgs.branch = Collections.singletonList(Constants.MASTER);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PermissionCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PermissionCollection.java
index 3b6ce91..f3ad45f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PermissionCollection.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PermissionCollection.java
@@ -109,12 +109,11 @@
List<AccessSection> sections = Lists.newArrayList(sectionToProject.keySet());
sorter.sort(ref, sections);
- Set<SeenRule> seen = new HashSet<SeenRule>();
- Set<SeenRule> seenBlockingRules = new HashSet<SeenRule>();
- Set<String> exclusiveGroupPermissions = new HashSet<String>();
+ Set<SeenRule> seen = new HashSet<>();
+ Set<SeenRule> seenBlockingRules = new HashSet<>();
+ Set<String> exclusiveGroupPermissions = new HashSet<>();
- HashMap<String, List<PermissionRule>> permissions =
- new HashMap<String, List<PermissionRule>>();
+ HashMap<String, List<PermissionRule>> permissions = new HashMap<>();
Map<PermissionRule, ProjectRef> ruleProps = Maps.newIdentityHashMap();
for (AccessSection section : sections) {
Project.NameKey project = sectionToProject.get(section);
@@ -133,7 +132,7 @@
if (addRule) {
List<PermissionRule> r = permissions.get(permission.getName());
if (r == null) {
- r = new ArrayList<PermissionRule>(2);
+ r = new ArrayList<>(2);
permissions.put(permission.getName(), r);
}
r.add(rule);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java
index 0e5cecb..fdff1e7 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCache.java
@@ -25,6 +25,9 @@
/** @return the parent state for all projects on this server. */
public ProjectState getAllProjects();
+ /** @return the project state of the project storing meta data for all users. */
+ public ProjectState getAllUsers();
+
/**
* Get the cached data for a project by its unique name.
*
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
index 8ccbca3..1e7a221 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectCacheImpl.java
@@ -22,6 +22,7 @@
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.cache.CacheModule;
import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.ProjectConfig;
import com.google.inject.Inject;
@@ -74,6 +75,7 @@
}
private final AllProjectsName allProjectsName;
+ private final AllUsersName allUsersName;
private final LoadingCache<String, ProjectState> byName;
private final LoadingCache<ListKey, SortedSet<Project.NameKey>> list;
private final Lock listLock;
@@ -82,10 +84,12 @@
@Inject
ProjectCacheImpl(
final AllProjectsName allProjectsName,
+ final AllUsersName allUsersName,
@Named(CACHE_NAME) LoadingCache<String, ProjectState> byName,
@Named(CACHE_LIST) LoadingCache<ListKey, SortedSet<Project.NameKey>> list,
ProjectCacheClock clock) {
this.allProjectsName = allProjectsName;
+ this.allUsersName = allUsersName;
this.byName = byName;
this.list = list;
this.listLock = new ReentrantLock(true /* fair */);
@@ -104,6 +108,16 @@
}
@Override
+ public ProjectState getAllUsers() {
+ ProjectState state = get(allUsersName);
+ if (state == null) {
+ // This should never occur.
+ throw new IllegalStateException("Missing project " + allUsersName);
+ }
+ return state;
+ }
+
+ @Override
public ProjectState get(final Project.NameKey projectName) {
try {
return checkedGet(projectName);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
index f71c4c9..53b7368 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
@@ -193,7 +193,7 @@
public RefControl controlForRef(String refName) {
if (refControls == null) {
- refControls = new HashMap<String, RefControl>();
+ refControls = new HashMap<>();
}
RefControl ctl = refControls.get(refName);
if (ctl == null) {
@@ -232,7 +232,8 @@
}
private boolean isHidden() {
- return getProject().getState().equals(Project.State.HIDDEN);
+ return getProject().getState().equals(
+ com.google.gerrit.extensions.api.projects.ProjectState.HIDDEN);
}
/** Can this user see this project exists? */
@@ -312,7 +313,7 @@
private static Set<GroupReference> getGroups(
final List<SectionMatcher> sectionMatcherList) {
- final Set<GroupReference> all = new HashSet<GroupReference>();
+ final Set<GroupReference> all = new HashSet<>();
for (final SectionMatcher matcher : sectionMatcherList) {
final AccessSection section = matcher.section;
for (final Permission permission : section.getPermissions()) {
@@ -447,7 +448,7 @@
}
private Set<String> allRefPatterns(String permissionName) {
- Set<String> all = new HashSet<String>();
+ Set<String> all = new HashSet<>();
for (SectionMatcher matcher : access()) {
AccessSection section = matcher.section;
Permission permission = section.getPermission(permissionName);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java
index 72910a3..590d69b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectJson.java
@@ -15,20 +15,25 @@
package com.google.gerrit.server.project;
import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.common.ProjectInfo;
+import com.google.gerrit.extensions.common.WebLinkInfo;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.WebLinks;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.inject.Inject;
-
-import java.util.Map;
+import com.google.inject.Provider;
public class ProjectJson {
private final AllProjectsName allProjects;
+ private final Provider<WebLinks> webLinks;
@Inject
- ProjectJson(AllProjectsName allProjects) {
+ ProjectJson(AllProjectsName allProjects, Provider<WebLinks> webLinks) {
this.allProjects = allProjects;
+ this.webLinks = webLinks;
}
public ProjectInfo format(ProjectResource rsrc) {
@@ -42,21 +47,15 @@
info.parent = parentName != null ? parentName.get() : null;
info.description = Strings.emptyToNull(p.getDescription());
info.state = p.getState();
- info.finish();
- return info;
- }
+ info.id = Url.encode(info.name);
- public static class ProjectInfo {
- public final String kind = "gerritcodereview#project";
- public String id;
- public String name;
- public String parent;
- public String description;
- public Project.State state;
- public Map<String, String> branches;
-
- void finish() {
- id = Url.encode(name);
+ info.webLinks = Lists.newArrayList();
+ for (WebLinks.Link link : webLinks.get().getProjectLinks(p.getName())) {
+ if (!Strings.isNullOrEmpty(link.name) && !Strings.isNullOrEmpty(link.url)) {
+ info.webLinks.add(new WebLinkInfo(link.name, link.url));
+ }
}
+
+ return info;
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectNode.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectNode.java
index cc85312..e74511a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectNode.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectNode.java
@@ -33,7 +33,7 @@
private final Project project;
private final boolean isVisible;
- private final SortedSet<ProjectNode> children = new TreeSet<ProjectNode>();
+ private final SortedSet<ProjectNode> children = new TreeSet<>();
@Inject
protected ProjectNode(final AllProjectsName allProjectsName,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java
index 459e392..d6a2e09 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectResource.java
@@ -14,6 +14,7 @@
package com.google.gerrit.server.project;
+import com.google.gerrit.extensions.api.projects.ProjectState;
import com.google.gerrit.extensions.restapi.RestResource;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.Project;
@@ -41,7 +42,7 @@
return control.getProject().getNameKey();
}
- public Project.State getState() {
+ public ProjectState getState() {
return control.getProject().getState();
}
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 50f232a..f6b96d7 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
@@ -29,9 +29,9 @@
import com.google.gerrit.common.data.LabelTypes;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.extensions.common.InheritableBoolean;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.rules.PrologEnvironment;
import com.google.gerrit.rules.RulesCache;
@@ -134,7 +134,7 @@
if (isAllProjects && !Permission.canBeOnAllProjects(AccessSection.ALL, Permission.OWNER)) {
localOwners = Collections.emptySet();
} else {
- HashSet<AccountGroup.UUID> groups = new HashSet<AccountGroup.UUID>();
+ HashSet<AccountGroup.UUID> groups = new HashSet<>();
AccessSection all = config.getAccessSection(AccessSection.ALL);
if (all != null) {
Permission owner = all.getPermission(Permission.OWNER);
@@ -254,7 +254,7 @@
List<SectionMatcher> sm = localAccessSections;
if (sm == null) {
Collection<AccessSection> fromConfig = config.getAccessSections();
- sm = new ArrayList<SectionMatcher>(fromConfig.size());
+ sm = new ArrayList<>(fromConfig.size());
for (AccessSection section : fromConfig) {
if (isAllProjects) {
List<Permission> copy =
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java
index c481eb4..39d2367 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java
@@ -19,6 +19,9 @@
import com.google.common.base.Objects;
import com.google.common.base.Strings;
import com.google.gerrit.common.ChangeHooks;
+import com.google.gerrit.extensions.api.projects.ProjectInput.ConfigValue;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
@@ -27,8 +30,6 @@
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.config.AllProjectsNameProvider;
@@ -58,10 +59,6 @@
public class PutConfig implements RestModifyView<ProjectResource, Input> {
private static final Logger log = LoggerFactory.getLogger(PutConfig.class);
- public static class ConfigValue {
- public String value;
- public List<String> values;
- }
public static class Input {
public String description;
public InheritableBoolean useContributorAgreements;
@@ -70,7 +67,7 @@
public InheritableBoolean requireChangeId;
public String maxObjectSizeLimit;
public SubmitType submitType;
- public Project.State state;
+ public com.google.gerrit.extensions.api.projects.ProjectState state;
public Map<String, Map<String, ConfigValue>> pluginConfigValues;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutProject.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutProject.java
index 836899a2..19ba794 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutProject.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutProject.java
@@ -14,14 +14,14 @@
package com.google.gerrit.server.project;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestModifyView;
-import com.google.gerrit.server.project.CreateProject.Input;
-public class PutProject implements RestModifyView<ProjectResource, Input> {
+public class PutProject implements RestModifyView<ProjectResource, ProjectInput> {
@Override
- public Response<?> apply(ProjectResource resource, Input input)
+ public Response<?> apply(ProjectResource resource, ProjectInput input)
throws ResourceConflictException {
throw new ResourceConflictException("Project \"" + resource.getName()
+ "\" already exists");
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 7c956da..00ecee3 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
@@ -22,7 +22,7 @@
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.common.data.RefConfigSection;
import com.google.gerrit.common.errors.InvalidNameException;
-import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.extensions.api.projects.ProjectState;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
@@ -68,7 +68,7 @@
this.projectControl = projectControl;
this.refName = ref;
this.relevant = relevant;
- this.effective = new HashMap<String, List<PermissionRule>>();
+ this.effective = new HashMap<>();
}
public String getRefName() {
@@ -207,12 +207,12 @@
public boolean canWrite() {
return getProjectControl().getProject().getState().equals(
- Project.State.ACTIVE);
+ ProjectState.ACTIVE);
}
public boolean canRead() {
return getProjectControl().getProject().getState().equals(
- Project.State.READ_ONLY) || canWrite();
+ ProjectState.READ_ONLY) || canWrite();
}
private boolean canPushWithForce() {
@@ -387,7 +387,7 @@
/** All value ranges of any allowed label permission. */
public List<PermissionRange> getLabelRanges(boolean isChangeOwner) {
- List<PermissionRange> r = new ArrayList<PermissionRange>();
+ List<PermissionRange> r = new ArrayList<>();
for (Map.Entry<String, List<PermissionRule>> e : relevant.getDeclaredPermissions()) {
if (Permission.isLabel(e.getKey())) {
int min = 0;
@@ -565,7 +565,7 @@
return rules;
}
- List<PermissionRule> mine = new ArrayList<PermissionRule>(rules.size());
+ List<PermissionRule> mine = new ArrayList<>(rules.size());
for (PermissionRule rule : rules) {
if (projectControl.match(rule, isChangeOwner)) {
mine.add(rule);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java
index aeb92d3..c012bd5 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SectionSortCache.java
@@ -77,8 +77,7 @@
} else {
boolean poison = false;
- IdentityHashMap<AccessSection, Integer> srcMap =
- new IdentityHashMap<AccessSection, Integer>();
+ IdentityHashMap<AccessSection, Integer> srcMap = new IdentityHashMap<>();
for (int i = 0; i < cnt; i++) {
poison |= srcMap.put(sections.get(i), i) != null;
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java
index f7c3c9d..d79716c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SubmitRuleEvaluator.java
@@ -134,7 +134,7 @@
env.once("gerrit", "assume_range_from_label");
}
- List<Term> results = new ArrayList<Term>();
+ List<Term> results = new ArrayList<>();
try {
for (Term[] template : env.all("gerrit", userRuleWrapperName,
submitRule, new VariableTerm())) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java
index c73de60..4a4e82d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SuggestParentCandidates.java
@@ -45,8 +45,7 @@
public List<Project.NameKey> getNameKeys() throws OrmException,
NoSuchProjectException {
List<Project> pList = getProjects();
- final List<Project.NameKey> nameKeys =
- new ArrayList<Project.NameKey>(pList.size());
+ final List<Project.NameKey> nameKeys = new ArrayList<>(pList.size());
for (Project p : pList) {
nameKeys.add(p.getNameKey());
}
@@ -55,7 +54,7 @@
public List<Project> getProjects() throws OrmException,
NoSuchProjectException {
- Set<Project> projects = new TreeSet<Project>(new Comparator<Project>() {
+ Set<Project> projects = new TreeSet<>(new Comparator<Project>() {
@Override
public int compare(Project o1, Project o2) {
return o1.getName().compareTo(o2.getName());
@@ -76,6 +75,6 @@
}
}
projects.add(projectControlFactory.controlFor(allProject).getProject());
- return new ArrayList<Project>(projects);
+ return new ArrayList<>(projects);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/AndPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/AndPredicate.java
index 915a364..953dabf 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/AndPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/AndPredicate.java
@@ -33,7 +33,7 @@
}
protected AndPredicate(final Collection<? extends Predicate<T>> that) {
- final ArrayList<Predicate<T>> t = new ArrayList<Predicate<T>>(that.size());
+ List<Predicate<T>> t = new ArrayList<>(that.size());
int c = 0;
for (Predicate<T> p : that) {
if (getClass() == p.getClass()) {
@@ -67,7 +67,7 @@
@Override
public Predicate<T> copy(final Collection<? extends Predicate<T>> children) {
- return new AndPredicate<T>(children);
+ return new AndPredicate<>(children);
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/NotPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/NotPredicate.java
index f94e1f6..6a9a877 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/NotPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/NotPredicate.java
@@ -54,7 +54,7 @@
if (children.size() != 1) {
throw new IllegalArgumentException("Expected exactly one child");
}
- return new NotPredicate<T>(children.iterator().next());
+ return new NotPredicate<>(children.iterator().next());
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/OrPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/OrPredicate.java
index 2c91809..845c805 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/OrPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/OrPredicate.java
@@ -33,7 +33,7 @@
}
protected OrPredicate(final Collection<? extends Predicate<T>> that) {
- final ArrayList<Predicate<T>> t = new ArrayList<Predicate<T>>(that.size());
+ List<Predicate<T>> t = new ArrayList<>(that.size());
int c = 0;
for (Predicate<T> p : that) {
if (getClass() == p.getClass()) {
@@ -67,7 +67,7 @@
@Override
public Predicate<T> copy(final Collection<? extends Predicate<T>> children) {
- return new OrPredicate<T>(children);
+ return new OrPredicate<>(children);
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/Predicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/Predicate.java
index c134458..7b43572 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/Predicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/Predicate.java
@@ -55,7 +55,7 @@
if (that.length == 1) {
return that[0];
}
- return new AndPredicate<T>(that);
+ return new AndPredicate<>(that);
}
/** Combine the passed predicates into a single AND node. */
@@ -64,7 +64,7 @@
if (that.size() == 1) {
return Iterables.getOnlyElement(that);
}
- return new AndPredicate<T>(that);
+ return new AndPredicate<>(that);
}
/** Combine the passed predicates into a single OR node. */
@@ -73,7 +73,7 @@
if (that.length == 1) {
return that[0];
}
- return new OrPredicate<T>(that);
+ return new OrPredicate<>(that);
}
/** Combine the passed predicates into a single OR node. */
@@ -82,7 +82,7 @@
if (that.size() == 1) {
return Iterables.getOnlyElement(that);
}
- return new OrPredicate<T>(that);
+ return new OrPredicate<>(that);
}
/** Invert the passed node. */
@@ -130,7 +130,7 @@
public abstract boolean equals(Object other);
private static class Any<T> extends Predicate<T> {
- private static final Any<Object> INSTANCE = new Any<Object>();
+ private static final Any<Object> INSTANCE = new Any<>();
private Any() {
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryBuilder.java
index a276992..5be42be 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryBuilder.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryBuilder.java
@@ -84,7 +84,7 @@
*/
public static class Definition<T, Q extends QueryBuilder<T>> {
private final Map<String, OperatorFactory<T, Q>> opFactories =
- new HashMap<String, OperatorFactory<T, Q>>();
+ new HashMap<>();
public Definition(Class<Q> clazz) {
// Guess at the supported operators by scanning methods.
@@ -204,11 +204,11 @@
final Tree val = onlyChildOf(opTree);
if (val.getType() == SINGLE_WORD && "*".equals(val.getText())) {
final String op = opTree.getText();
- final WildPatternPredicate<T> pat = new WildPatternPredicate<T>(op);
- return new VariablePredicate<T>(var, pat);
+ final WildPatternPredicate<T> pat = new WildPatternPredicate<>(op);
+ return new VariablePredicate<>(var, pat);
}
}
- return new VariablePredicate<T>(var, toPredicate(opTree));
+ return new VariablePredicate<>(var, toPredicate(opTree));
}
default:
@@ -224,7 +224,7 @@
//
case AND:
case OR: {
- List<Predicate<T>> p = new ArrayList<Predicate<T>>(val.getChildCount());
+ List<Predicate<T>> p = new ArrayList<>(val.getChildCount());
for (int i = 0; i < val.getChildCount(); i++) {
final Tree c = val.getChild(i);
if (c.getType() != DEFAULT_FIELD) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryRewriter.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryRewriter.java
index c0f8414..6173fb6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryRewriter.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/QueryRewriter.java
@@ -76,7 +76,7 @@
if ((m.getModifiers() & Modifier.ABSTRACT) != Modifier.ABSTRACT
&& (m.getModifiers() & Modifier.PUBLIC) == Modifier.PUBLIC
&& rp != null) {
- rewriteRules.add(new MethodRewrite<T>(qb, rp.value(), m));
+ rewriteRules.add(new MethodRewrite<>(qb, rp.value(), m));
}
}
c = c.getSuperclass();
@@ -138,7 +138,7 @@
in = rewriteOne(in);
if (old.equals(in) && in.getChildCount() > 0) {
- List<Predicate<T>> n = new ArrayList<Predicate<T>>(in.getChildCount());
+ List<Predicate<T>> n = new ArrayList<>(in.getChildCount());
for (Predicate<T> p : in.getChildren()) {
n.add(rewriteImpl(p));
}
@@ -159,14 +159,14 @@
return not(replaceGenericNodes(in.getChild(0)));
} else if (in instanceof AndPredicate) {
- List<Predicate<T>> n = new ArrayList<Predicate<T>>(in.getChildCount());
+ List<Predicate<T>> n = new ArrayList<>(in.getChildCount());
for (Predicate<T> c : in.getChildren()) {
n.add(replaceGenericNodes(c));
}
return and(n);
} else if (in instanceof OrPredicate) {
- List<Predicate<T>> n = new ArrayList<Predicate<T>>(in.getChildCount());
+ List<Predicate<T>> n = new ArrayList<>(in.getChildCount());
for (Predicate<T> c : in.getChildren()) {
n.add(replaceGenericNodes(c));
}
@@ -198,8 +198,8 @@
}
private static class MatchResult<T> {
- private static final MatchResult<?> FAIL = new MatchResult<Object>(null);
- private static final MatchResult<?> OK = new MatchResult<Object>(null);
+ private static final MatchResult<?> FAIL = new MatchResult<>(null);
+ private static final MatchResult<?> OK = new MatchResult<>(null);
@SuppressWarnings("unchecked")
static <T> MatchResult<T> fail() {
@@ -251,7 +251,7 @@
// but in any order.
//
final LinkedList<Predicate<T>> have = dup(actual);
- final LinkedList<Predicate<T>> extra = new LinkedList<Predicate<T>>();
+ final LinkedList<Predicate<T>> extra = new LinkedList<>();
for (final Predicate<T> pat : pattern.getChildren()) {
boolean found = false;
for (final Iterator<Predicate<T>> i = have.iterator(); i.hasNext();) {
@@ -275,11 +275,11 @@
return MatchResult.ok();
case 1:
if (isNOT(actual)) {
- return new MatchResult<T>(actual.copy(have));
+ return new MatchResult<>(actual.copy(have));
}
- return new MatchResult<T>(have.get(0));
+ return new MatchResult<>(have.get(0));
default:
- return new MatchResult<T>(actual.copy(have));
+ return new MatchResult<>(actual.copy(have));
}
} else if (pattern.equals(actual)) {
@@ -297,7 +297,7 @@
}
private static <T> LinkedList<Predicate<T>> dup(final Predicate<T> actual) {
- return new LinkedList<Predicate<T>>(actual.getChildren());
+ return new LinkedList<>(actual.getChildren());
}
/**
@@ -412,8 +412,7 @@
@Override
public Predicate<T> rewrite(QueryRewriter<T> rewriter,
final Predicate<T> input) {
- final HashMap<String, Predicate<T>> args =
- new HashMap<String, Predicate<T>>();
+ final HashMap<String, Predicate<T>> args = new HashMap<>();
final MatchResult<T> res = rewriter.match(args, pattern, input);
if (!res.success()) {
return null;
@@ -483,7 +482,7 @@
}
private static <T> List<Predicate<T>> removeDuplicates(List<Predicate<T>> n) {
- List<Predicate<T>> r = new ArrayList<Predicate<T>>();
+ List<Predicate<T>> r = new ArrayList<>();
for (Predicate<T> p : n) {
if (!r.contains(p)) {
r.add(p);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/VariablePredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/VariablePredicate.java
index 45b27e5..d6d0f9c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/VariablePredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/VariablePredicate.java
@@ -61,7 +61,7 @@
if (children.size() != 1) {
throw new IllegalArgumentException("Expected exactly one child");
}
- return new VariablePredicate<T>(getName(), children.iterator().next());
+ return new VariablePredicate<>(getName(), children.iterator().next());
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AbstractResultSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AbstractResultSet.java
index e072760..9bbc02f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AbstractResultSet.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AbstractResultSet.java
@@ -22,7 +22,7 @@
abstract class AbstractResultSet<T> implements ResultSet<T> {
@Override
public List<T> toList() {
- ArrayList<T> r = new ArrayList<T>();
+ ArrayList<T> r = new ArrayList<>();
for (T t : this) {
r.add(t);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndSource.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndSource.java
index ad0ec3c..55fd281 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndSource.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/AndSource.java
@@ -68,8 +68,7 @@
private static List<Predicate<ChangeData>> sort(
Collection<? extends Predicate<ChangeData>> that) {
- ArrayList<Predicate<ChangeData>> r =
- new ArrayList<Predicate<ChangeData>>(that);
+ List<Predicate<ChangeData>> r = new ArrayList<>(that);
Collections.sort(r, CMP);
return r;
}
@@ -158,7 +157,7 @@
} else if (start > 0) {
r = ImmutableList.copyOf(r.subList(start, r.size()));
}
- return new ListResultSet<ChangeData>(r);
+ return new ListResultSet<>(r);
}
private Iterable<ChangeData> buffer(
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 333c343..3d7c779 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
@@ -281,7 +281,7 @@
return currentFiles;
}
- List<String> r = new ArrayList<String>(p.getPatches().size());
+ List<String> r = new ArrayList<>(p.getPatches().size());
for (PatchListEntry e : p.getPatches()) {
if (Patch.COMMIT_MSG.equals(e.getNewName())) {
continue;
@@ -343,12 +343,15 @@
return changeControl != null;
}
- public ChangeControl changeControl() throws NoSuchChangeException,
- OrmException {
+ public ChangeControl changeControl() throws OrmException {
if (changeControl == null) {
Change c = change();
- changeControl =
- changeControlFactory.controlFor(c, userFactory.create(c.getOwner()));
+ try {
+ changeControl =
+ changeControlFactory.controlFor(c, userFactory.create(c.getOwner()));
+ } catch (NoSuchChangeException e) {
+ throw new OrmException(e);
+ }
}
return changeControl;
}
@@ -394,11 +397,9 @@
Change c = change();
if (c == null) {
currentApprovals = Collections.emptyList();
- } else if (allApprovals != null) {
- return allApprovals.get(c.currentPatchSetId());
} else {
- currentApprovals = approvalsUtil.byPatchSet(
- db, notes(), c.currentPatchSetId());
+ currentApprovals = ImmutableList.copyOf(approvalsUtil.byPatchSet(
+ db, changeControl(), c.currentPatchSetId()));
}
}
return currentApprovals;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeDataResultSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeDataResultSet.java
index f469228..52a5b7b 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeDataResultSet.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeDataResultSet.java
@@ -23,6 +23,7 @@
import java.util.HashSet;
import java.util.Iterator;
import java.util.NoSuchElementException;
+import java.util.Set;
abstract class ChangeDataResultSet<T> extends AbstractResultSet<ChangeData> {
static ResultSet<ChangeData> change(final ChangeData.Factory factory,
@@ -78,7 +79,7 @@
} else {
return new Iterator<ChangeData>() {
private final Iterator<T> itr = source.iterator();
- private final HashSet<Change.Id> seen = new HashSet<Change.Id>();
+ private final Set<Change.Id> seen = new HashSet<>();
private ChangeData next;
@Override
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 4a6381e..4c595ea 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
@@ -22,8 +22,6 @@
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.RevId;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
@@ -36,6 +34,7 @@
import com.google.gerrit.server.config.TrackingFooters;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.strategy.SubmitStrategyFactory;
+import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.ChangeIndex;
import com.google.gerrit.server.index.IndexCollection;
import com.google.gerrit.server.index.Schema;
@@ -55,7 +54,6 @@
import org.eclipse.jgit.lib.AbbreviatedObjectId;
import org.eclipse.jgit.lib.Config;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
@@ -74,14 +72,6 @@
private static final Pattern DEF_CHANGE =
Pattern.compile("^([1-9][0-9]*|[iI][0-9a-f]{4,}.*)$");
- private static final Pattern PAT_COMMIT =
- Pattern.compile("^([0-9a-fA-F]{4," + RevId.LEN + "})$");
- private static final Pattern PAT_EMAIL =
- Pattern.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+");
-
- private static final Pattern PAT_LABEL =
- Pattern.compile("^[a-zA-Z][a-zA-Z0-9]*((=|>=|<=)[+-]?|[+-])\\d+$");
-
// NOTE: As new search operations are added, please keep the
// SearchSuggestOracle up to date.
@@ -106,6 +96,7 @@
public static final String FIELD_PARENTPROJECT = "parentproject";
public static final String FIELD_PATH = "path";
public static final String FIELD_PROJECT = "project";
+ public static final String FIELD_PROJECTS = "projects";
public static final String FIELD_REF = "ref";
public static final String FIELD_REVIEWER = "reviewer";
public static final String FIELD_REVIEWERIN = "reviewerin";
@@ -278,7 +269,7 @@
@Operator
public Predicate<ChangeData> status(String statusName) {
- if ("open".equals(statusName)) {
+ if ("open".equals(statusName) || "pending".equals(statusName)) {
return status_open();
} else if ("closed".equals(statusName)) {
@@ -372,6 +363,14 @@
}
@Operator
+ public Predicate<ChangeData> projects(String name) throws QueryParseException {
+ if (!schema(args.indexes).hasField(ChangeField.PROJECTS)) {
+ throw new QueryParseException("Unsupported operator: " + FIELD_PROJECTS);
+ }
+ return new ProjectPrefixPredicate(name);
+ }
+
+ @Operator
public Predicate<ChangeData> parentproject(String name) {
return new ParentProjectPredicate(args.db, args.projectCache,
args.listChildProjects, args.self, name);
@@ -393,8 +392,8 @@
@Operator
public Predicate<ChangeData> topic(String name) {
if (name.startsWith("^"))
- return new RegexTopicPredicate(name);
- return new TopicPredicate(name);
+ return new RegexTopicPredicate(schema(args.indexes), name);
+ return new TopicPredicate(schema(args.indexes), name);
}
@Operator
@@ -549,7 +548,7 @@
//
Collection<GroupReference> suggestions = args.groupBackend.suggest(who, null);
if (!suggestions.isEmpty()) {
- HashSet<AccountGroup.UUID> ids = new HashSet<AccountGroup.UUID>();
+ HashSet<AccountGroup.UUID> ids = new HashSet<>();
for (GroupReference ref : suggestions) {
ids.add(ref.getUUID());
}
@@ -678,52 +677,58 @@
}
@Override
- protected Predicate<ChangeData> defaultField(String query)
- throws QueryParseException {
+ protected Predicate<ChangeData> defaultField(String query) {
if (query.startsWith("refs/")) {
return ref(query);
-
} else if (DEF_CHANGE.matcher(query).matches()) {
return change(query);
-
- } else if (PAT_COMMIT.matcher(query).matches()) {
- return commit(query);
-
- } else if (PAT_EMAIL.matcher(query).find()) {
- try {
- return Predicate.or(owner(query), reviewer(query));
- } catch (OrmException err) {
- throw error("Cannot lookup user", err);
- }
-
- } else if (PAT_LABEL.matcher(query).find()) {
- try {
- return label(query);
- } catch (OrmException err) {
- throw error("Cannot lookup user", err);
- }
-
- } else {
- // Try to match a project name by substring query.
- final List<ProjectPredicate> predicate =
- new ArrayList<ProjectPredicate>();
- for (Project.NameKey name : args.projectCache.all()) {
- if (name.get().toLowerCase().contains(query.toLowerCase())) {
- predicate.add(new ProjectPredicate(name.get()));
- }
- }
-
- // If two or more projects contains "query" as substring create an
- // OrPredicate holding predicates for all these projects, otherwise if
- // only one contains that, return only that one predicate by itself.
- if (predicate.size() == 1) {
- return predicate.get(0);
- } else if (predicate.size() > 1) {
- return Predicate.or(predicate);
- }
-
- throw error("Unsupported query:" + query);
}
+
+ List<Predicate<ChangeData>> predicates = Lists.newArrayListWithCapacity(9);
+ try {
+ predicates.add(commit(query));
+ } catch (IllegalArgumentException e) {
+ // Skip.
+ }
+ try {
+ predicates.add(owner(query));
+ } catch (OrmException | QueryParseException e) {
+ // Skip.
+ }
+ try {
+ predicates.add(reviewer(query));
+ } catch (OrmException | QueryParseException e) {
+ // Skip.
+ }
+ try {
+ predicates.add(file(query));
+ } catch (QueryParseException e) {
+ // Skip.
+ }
+ try {
+ predicates.add(label(query));
+ } catch (OrmException | QueryParseException e) {
+ // Skip.
+ }
+ try {
+ predicates.add(message(query));
+ } catch (QueryParseException e) {
+ // Skip.
+ }
+ try {
+ predicates.add(comment(query));
+ } catch (QueryParseException e) {
+ // Skip.
+ }
+ try {
+ predicates.add(projects(query));
+ } catch (QueryParseException e) {
+ // Skip.
+ }
+ predicates.add(ref(query));
+ predicates.add(branch(query));
+ predicates.add(topic(query));
+ return Predicate.or(predicates);
}
private Set<Account.Id> parseAccount(String who)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java
index 9ff416f..cea6af8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java
@@ -49,7 +49,7 @@
}
public static Predicate<ChangeData> open(Provider<ReviewDb> dbProvider) {
- List<Predicate<ChangeData>> r = new ArrayList<Predicate<ChangeData>>(4);
+ List<Predicate<ChangeData>> r = new ArrayList<>(4);
for (final Change.Status e : Change.Status.values()) {
if (e.isOpen()) {
r.add(new ChangeStatusPredicate(e));
@@ -59,7 +59,7 @@
}
public static Predicate<ChangeData> closed(Provider<ReviewDb> dbProvider) {
- List<Predicate<ChangeData>> r = new ArrayList<Predicate<ChangeData>>(4);
+ List<Predicate<ChangeData>> r = new ArrayList<>(4);
for (final Change.Status e : Change.Status.values()) {
if (e.isClosed()) {
r.add(new ChangeStatusPredicate(e));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictKey.java
index e177e37..e64ff13 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictKey.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictKey.java
@@ -15,14 +15,14 @@
package com.google.gerrit.server.query.change;
import com.google.common.base.Objects;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
+import com.google.gerrit.extensions.common.SubmitType;
import org.eclipse.jgit.lib.ObjectId;
import java.io.Serializable;
public class ConflictKey implements Serializable {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 2L;
private final ObjectId commit;
private final ObjectId otherCommit;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java
index ee6587d..61454a8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java
@@ -17,8 +17,8 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.gerrit.common.data.SubmitTypeRecord;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.git.CodeReviewCommit;
import com.google.gerrit.server.git.MergeException;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java
index 54e5a7d..db9b29d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/EqualsLabelPredicate.java
@@ -63,13 +63,19 @@
//
return false;
}
+
ProjectState project = projectCache.get(c.getDest().getParentKey());
if (project == null) {
// The project has disappeared.
//
return false;
}
+
LabelType labelType = type(project.getLabelTypes(), label);
+ if (labelType == null) {
+ return false; // Label is not defined by this project.
+ }
+
boolean hasVote = false;
for (PatchSetApproval p : object.currentApprovals()) {
if (labelType.matches(p)) {
@@ -103,8 +109,7 @@
return lt;
}
}
-
- return LabelType.withDefaultValues(toFind);
+ return null;
}
private boolean match(Change change, int value, Account.Id approver,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HasDraftByPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HasDraftByPredicate.java
index 6d44b96..53d2bbd 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HasDraftByPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/HasDraftByPredicate.java
@@ -25,6 +25,8 @@
import java.util.ArrayList;
import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
class HasDraftByPredicate extends OperatorPredicate<ChangeData> implements
ChangeDataSource {
@@ -50,17 +52,17 @@
@Override
public ResultSet<ChangeData> read() throws OrmException {
- HashSet<Change.Id> ids = new HashSet<Change.Id>();
+ Set<Change.Id> ids = new HashSet<>();
for (PatchLineComment sc : args.db.get().patchComments()
.draftByAuthor(accountId)) {
ids.add(sc.getKey().getParentKey().getParentKey().getParentKey());
}
- ArrayList<ChangeData> r = new ArrayList<ChangeData>(ids.size());
+ List<ChangeData> r = new ArrayList<>(ids.size());
for (Change.Id id : ids) {
r.add(args.changeDataFactory.create(args.db.get(), id));
}
- return new ListResultSet<ChangeData>(r);
+ return new ListResultSet<>(r);
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/LegacyChangeIdPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/LegacyChangeIdPredicate.java
index c62d7ca..1cbb499 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/LegacyChangeIdPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/LegacyChangeIdPredicate.java
@@ -44,10 +44,10 @@
public ResultSet<ChangeData> read() throws OrmException {
Change c = args.db.get().changes().get(id);
if (c != null) {
- return new ListResultSet<ChangeData>(Collections.singletonList(
+ return new ListResultSet<>(Collections.singletonList(
args.changeDataFactory.create(args.db.get(), c)));
} else {
- return new ListResultSet<ChangeData>(Collections.<ChangeData> emptyList());
+ return new ListResultSet<>(Collections.<ChangeData> emptyList());
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OrSource.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OrSource.java
index 4f36777..28aef5e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OrSource.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/OrSource.java
@@ -24,6 +24,8 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
public class OrSource extends OrPredicate<ChangeData> implements ChangeDataSource {
private int cardinality = -1;
@@ -36,8 +38,8 @@
public ResultSet<ChangeData> read() throws OrmException {
// TODO(spearce) This probably should be more lazy.
//
- ArrayList<ChangeData> r = new ArrayList<ChangeData>();
- HashSet<Change.Id> have = new HashSet<Change.Id>();
+ List<ChangeData> r = new ArrayList<>();
+ Set<Change.Id> have = new HashSet<>();
for (Predicate<ChangeData> p : getChildren()) {
if (p instanceof ChangeDataSource) {
for (ChangeData cd : ((ChangeDataSource) p).read()) {
@@ -49,7 +51,7 @@
throw new OrmException("No ChangeDataSource: " + p);
}
}
- return new ListResultSet<ChangeData>(r);
+ return new ListResultSet<>(r);
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java
index 822ffc2..253f719 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java
@@ -15,12 +15,12 @@
package com.google.gerrit.server.query.change;
import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.project.ListChildProjects;
import com.google.gerrit.server.project.ProjectCache;
-import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
import com.google.gerrit.server.project.ProjectResource;
import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.query.OrPredicate;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ProjectPrefixPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ProjectPrefixPredicate.java
new file mode 100644
index 0000000..d0faf0f
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ProjectPrefixPredicate.java
@@ -0,0 +1,37 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.query.change;
+
+import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.server.index.ChangeField;
+import com.google.gerrit.server.index.IndexPredicate;
+import com.google.gwtorm.server.OrmException;
+
+class ProjectPrefixPredicate extends IndexPredicate<ChangeData> {
+ ProjectPrefixPredicate(String prefix) {
+ super(ChangeField.PROJECTS, prefix);
+ }
+
+ @Override
+ public boolean match(ChangeData object) throws OrmException {
+ Change c = object.change();
+ return c != null && c.getDest().getParentKey().get().startsWith(getValue());
+ }
+
+ @Override
+ public int getCost() {
+ return 1;
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryProcessor.java
index 33208863..8889f53 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryProcessor.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryProcessor.java
@@ -551,7 +551,7 @@
}
private List<Field> fieldsOf(Class<?> type) {
- List<Field> r = new ArrayList<Field>();
+ List<Field> r = new ArrayList<>();
if (type.getSuperclass() != null) {
r.addAll(fieldsOf(type.getSuperclass()));
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java
index 3a9604f..7d5f1dc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/RegexTopicPredicate.java
@@ -15,8 +15,8 @@
package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Change;
-import com.google.gerrit.server.index.ChangeField;
import com.google.gerrit.server.index.RegexPredicate;
+import com.google.gerrit.server.index.Schema;
import com.google.gwtorm.server.OrmException;
import dk.brics.automaton.RegExp;
@@ -25,8 +25,8 @@
class RegexTopicPredicate extends RegexPredicate<ChangeData> {
private final RunAutomaton pattern;
- RegexTopicPredicate(String re) {
- super(ChangeField.TOPIC, re);
+ RegexTopicPredicate(Schema<ChangeData> schema, String re) {
+ super(TopicPredicate.topicField(schema), re);
if (re.startsWith("^")) {
re = re.substring(1);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java
index ee4e2ef..7196c9f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java
@@ -14,14 +14,30 @@
package com.google.gerrit.server.query.change;
+import static com.google.gerrit.server.index.ChangeField.TOPIC;
+
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.index.ChangeField;
+import com.google.gerrit.server.index.FieldDef;
import com.google.gerrit.server.index.IndexPredicate;
+import com.google.gerrit.server.index.Schema;
import com.google.gwtorm.server.OrmException;
class TopicPredicate extends IndexPredicate<ChangeData> {
- TopicPredicate(String topic) {
- super(ChangeField.TOPIC, topic);
+ @SuppressWarnings("deprecation")
+ static FieldDef<ChangeData, ?> topicField(Schema<ChangeData> schema) {
+ if (schema == null) {
+ return ChangeField.LEGACY_TOPIC;
+ }
+ FieldDef<ChangeData, ?> f = schema.getFields().get(TOPIC.getName());
+ if (f != null) {
+ return f;
+ }
+ return schema.getFields().get(ChangeField.LEGACY_TOPIC.getName());
+ }
+
+ TopicPredicate(Schema<ChangeData> schema, String topic) {
+ super(topicField(schema), topic);
}
@Override
@@ -30,7 +46,11 @@
if (change == null) {
return false;
}
- return getValue().equals(change.getTopic());
+ String t = change.getTopic();
+ if (t == null && getField() == TOPIC) {
+ t = "";
+ }
+ return getValue().equals(t);
}
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllProjectsCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllProjectsCreator.java
index f592530..7712650 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllProjectsCreator.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllProjectsCreator.java
@@ -28,9 +28,9 @@
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.common.data.PermissionRule.Action;
+import com.google.gerrit.extensions.common.InheritableBoolean;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllUsersCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllUsersCreator.java
new file mode 100644
index 0000000..fda5306
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/AllUsersCreator.java
@@ -0,0 +1,91 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.schema;
+
+import com.google.gerrit.common.Version;
+import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.RefNames;
+import com.google.gerrit.server.GerritPersonIdent;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.git.MetaDataUpdate;
+import com.google.gerrit.server.git.ProjectConfig;
+import com.google.inject.Inject;
+
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.errors.RepositoryNotFoundException;
+import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Repository;
+
+import java.io.IOException;
+
+/** Creates the {@code All-Users} repository. */
+public class AllUsersCreator {
+ private final GitRepositoryManager mgr;
+ private final AllUsersName allUsersName;
+ private final PersonIdent serverUser;
+
+ @Inject
+ AllUsersCreator(
+ GitRepositoryManager mgr,
+ AllUsersName allUsersName,
+ @GerritPersonIdent PersonIdent serverUser) {
+ this.mgr = mgr;
+ this.allUsersName = allUsersName;
+ this.serverUser = serverUser;
+ }
+
+ public void create() throws IOException, ConfigInvalidException {
+ Repository git = null;
+ try {
+ git = mgr.openRepository(allUsersName);
+ initAllUsers(git);
+ } catch (RepositoryNotFoundException notFound) {
+ try {
+ git = mgr.createRepository(allUsersName);
+ initAllUsers(git);
+ } catch (RepositoryNotFoundException err) {
+ String name = allUsersName.get();
+ throw new IOException("Cannot create repository " + name, err);
+ }
+ } finally {
+ if (git != null) {
+ git.close();
+ }
+ }
+ }
+
+ private void initAllUsers(Repository git)
+ throws IOException, ConfigInvalidException {
+ MetaDataUpdate md = new MetaDataUpdate(
+ GitReferenceUpdated.DISABLED,
+ allUsersName,
+ git);
+ md.getCommitBuilder().setAuthor(serverUser);
+ md.getCommitBuilder().setCommitter(serverUser);
+ md.setMessage("Initialized Gerrit Code Review " + Version.getVersion());
+
+ ProjectConfig config = ProjectConfig.read(md);
+ Project project = config.getProject();
+ project.setDescription("Individual user settings and preferences.");
+
+ AccessSection all = config.getAccessSection(RefNames.REFS_USER + "*", true);
+ all.getPermission(Permission.READ, true).setExclusiveGroup(true);
+ config.commit(md);
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbDatabaseProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbDatabaseProvider.java
index ed77fff..9ceaf1c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbDatabaseProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ReviewDbDatabaseProvider.java
@@ -36,7 +36,7 @@
@Override
public Database<ReviewDb> get() {
try {
- return new Database<ReviewDb>(datasource, ReviewDb.class);
+ return new Database<>(datasource, ReviewDb.class);
} catch (OrmException e) {
throw new ProvisionException("Cannot create ReviewDb", e);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java
index 589d177..298c0d8 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaCreator.java
@@ -42,6 +42,7 @@
File site_path;
private final AllProjectsCreator allProjectsCreator;
+ private final AllUsersCreator allUsersCreator;
private final PersonIdent serverUser;
private final DataSourceType dataSourceType;
@@ -54,18 +55,21 @@
public SchemaCreator(SitePaths site,
@Current SchemaVersion version,
AllProjectsCreator ap,
+ AllUsersCreator auc,
@GerritPersonIdent PersonIdent au,
DataSourceType dst) {
- this(site.site_path, version, ap, au, dst);
+ this(site.site_path, version, ap, auc, au, dst);
}
public SchemaCreator(@SitePath File site,
@Current SchemaVersion version,
AllProjectsCreator ap,
+ AllUsersCreator auc,
@GerritPersonIdent PersonIdent au,
DataSourceType dst) {
site_path = site;
allProjectsCreator = ap;
+ allUsersCreator = auc;
serverUser = au;
dataSourceType = dst;
versionNbr = version.getVersionNbr();
@@ -90,6 +94,7 @@
.setAdministrators(GroupReference.forGroup(admin))
.setBatchUsers(GroupReference.forGroup(batch))
.create();
+ allUsersCreator.create();
dataSourceType.getIndexScript().run(db);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaModule.java
index 5ba7d4c..aaf4607 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaModule.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaModule.java
@@ -20,6 +20,8 @@
import com.google.gerrit.server.GerritPersonIdentProvider;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.AllProjectsNameProvider;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
import com.google.gerrit.server.config.AnonymousCowardName;
import com.google.gerrit.server.config.AnonymousCowardNameProvider;
import com.google.gerrit.server.config.FactoryModule;
@@ -39,6 +41,10 @@
.toProvider(AllProjectsNameProvider.class)
.in(SINGLETON);
+ bind(AllUsersName.class)
+ .toProvider(AllUsersNameProvider.class)
+ .in(SINGLETON);
+
bind(String.class).annotatedWith(AnonymousCowardName.class).toProvider(
AnonymousCowardNameProvider.class);
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java
index 8800929..90d23ff 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/SchemaVersion.java
@@ -32,7 +32,7 @@
/** A version of the database schema. */
public abstract class SchemaVersion {
/** The current schema version. */
- public static final Class<Schema_93> C = Schema_93.class;
+ public static final Class<Schema_95> C = Schema_95.class;
public static class Module extends AbstractModule {
@Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_53.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_53.java
index cbcda9f..697f303 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_53.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_53.java
@@ -31,11 +31,12 @@
import com.google.gerrit.common.data.LabelType;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.data.PermissionRule;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.client.PatchSetApproval.LabelId;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
import com.google.gerrit.reviewdb.client.SystemConfig;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.GerritPersonIdent;
@@ -122,7 +123,7 @@
}
private void assignGroupUUIDs(ReviewDb db) throws OrmException {
- groupMap = new HashMap<AccountGroup.Id, GroupReference>();
+ groupMap = new HashMap<>();
List<AccountGroup> groups = db.accountGroups().all().toList();
for (AccountGroup g : groups) {
if (g.getId().equals(systemConfig.ownerGroupId)) {
@@ -213,16 +214,16 @@
switch (rs.getString("submit_type").charAt(0)) {
case 'F':
- project.setSubmitType(Project.SubmitType.FAST_FORWARD_ONLY);
+ project.setSubmitType(SubmitType.FAST_FORWARD_ONLY);
break;
case 'M':
- project.setSubmitType(Project.SubmitType.MERGE_IF_NECESSARY);
+ project.setSubmitType(SubmitType.MERGE_IF_NECESSARY);
break;
case 'A':
- project.setSubmitType(Project.SubmitType.MERGE_ALWAYS);
+ project.setSubmitType(SubmitType.MERGE_ALWAYS);
break;
case 'C':
- project.setSubmitType(Project.SubmitType.CHERRY_PICK);
+ project.setSubmitType(SubmitType.CHERRY_PICK);
break;
default:
throw new OrmException("Unsupported submit_type="
@@ -238,12 +239,12 @@
private static InheritableBoolean asInheritableBoolean(ResultSet rs, String col)
throws SQLException {
return "Y".equals(rs.getString(col))
- ? Project.InheritableBoolean.TRUE
- : Project.InheritableBoolean.INHERIT;
+ ? InheritableBoolean.TRUE
+ : InheritableBoolean.INHERIT;
}
private void readOldRefRights(ReviewDb db) throws SQLException {
- rightsByProject = new HashMap<Project.NameKey, List<OldRefRight>>();
+ rightsByProject = new HashMap<>();
Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM ref_rights");
@@ -257,7 +258,7 @@
list = rightsByProject.get(right.project);
if (list == null) {
- list = new ArrayList<OldRefRight>();
+ list = new ArrayList<>();
rightsByProject.put(right.project, list);
}
list.add(right);
@@ -267,7 +268,7 @@
}
private void readProjectParents(ReviewDb db) throws SQLException {
- parentsByProject = new HashMap<Project.NameKey, Project.NameKey>();
+ parentsByProject = new HashMap<>();
Statement stmt = ((JdbcSchema) db).getConnection().createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM projects");
while (rs.next()) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_56.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_56.java
index bcd5f40..852ca2a 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_56.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_56.java
@@ -42,8 +42,8 @@
super(prior);
this.mgr = mgr;
- keysOne = new HashSet<String>();
- keysTwo = new HashSet<String>();
+ keysOne = new HashSet<>();
+ keysTwo = new HashSet<>();
keysOne.add(RefNames.REFS_CONFIG);
keysTwo.add(RefNames.REFS_CONFIG);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_60.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_60.java
index 3f49b0c..7fe0cde 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_60.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_60.java
@@ -40,7 +40,7 @@
Pattern patternA = Pattern.compile("Patch Set ([0-9]+):.*", Pattern.DOTALL);
Pattern patternB = Pattern.compile("Uploaded patch set ([0-9]+).");
ResultSet<ChangeMessage> results = db.changeMessages().all();
- List<ChangeMessage> updates = new LinkedList<ChangeMessage>();
+ List<ChangeMessage> updates = new LinkedList<>();
for (ChangeMessage cm : results) {
Change.Id id = cm.getKey().getParentKey();
String msg = cm.getMessage();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_74.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_74.java
index 4a2c477..e5480b4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_74.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_74.java
@@ -43,18 +43,15 @@
protected void migrateData(final ReviewDb db, final UpdateUI ui)
throws SQLException, OrmException {
// Grab all the groups since we don't have the cache available
- HashMap<AccountGroup.Id, AccountGroup.UUID> allGroups =
- new HashMap<AccountGroup.Id, AccountGroup.UUID>();
+ HashMap<AccountGroup.Id, AccountGroup.UUID> allGroups = new HashMap<>();
for (AccountGroup ag : db.accountGroups().all()) {
allGroups.put(ag.getId(), ag.getGroupUUID());
}
// Initialize some variables
Connection conn = ((JdbcSchema) db).getConnection();
- ArrayList<AccountGroupById> newIncludes =
- new ArrayList<AccountGroupById>();
- ArrayList<AccountGroupByIdAud> newIncludeAudits =
- new ArrayList<AccountGroupByIdAud>();
+ ArrayList<AccountGroupById> newIncludes = new ArrayList<>();
+ ArrayList<AccountGroupByIdAud> newIncludeAudits = new ArrayList<>();
// Iterate over all entries in account_group_includes
Statement oldGroupIncludesStmt = conn.createStatement();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_94.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_94.java
new file mode 100644
index 0000000..3d45274
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_94.java
@@ -0,0 +1,38 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.schema;
+
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gwtorm.jdbc.JdbcSchema;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+import java.sql.SQLException;
+import java.sql.Statement;
+
+public class Schema_94 extends SchemaVersion {
+ @Inject
+ Schema_94(Provider<Schema_93> prior) {
+ super(prior);
+ }
+
+ @Override
+ protected void migrateData(ReviewDb db, UpdateUI ui) throws SQLException {
+ try (Statement stmt = ((JdbcSchema) db).getConnection().createStatement()) {
+ stmt.execute("CREATE INDEX patch_sets_byRevision"
+ + " ON patch_sets (revision)");
+ }
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_95.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_95.java
new file mode 100644
index 0000000..1c839f7
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_95.java
@@ -0,0 +1,45 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.schema;
+
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
+import java.io.IOException;
+import java.sql.SQLException;
+
+public class Schema_95 extends SchemaVersion {
+ private final AllUsersCreator allUsersCreator;
+
+ @Inject
+ Schema_95(Provider<Schema_94> prior, AllUsersCreator allUsersCreator) {
+ super(prior);
+ this.allUsersCreator = allUsersCreator;
+ }
+
+ @Override
+ protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException,
+ SQLException {
+ try {
+ allUsersCreator.create();
+ } catch (IOException | ConfigInvalidException e) {
+ throw new OrmException(e);
+ }
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java
index 12c80f4..d03cb3e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/ScriptRunner.java
@@ -78,7 +78,7 @@
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
try {
String delimiter = ";";
- List<String> commands = new ArrayList<String>();
+ List<String> commands = new ArrayList<>();
StringBuilder buffer = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java
new file mode 100644
index 0000000..e0e8237
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/DefaultSecureStore.java
@@ -0,0 +1,98 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.securestore;
+
+import com.google.gerrit.common.FileUtil;
+import com.google.gerrit.extensions.annotations.Export;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import org.eclipse.jgit.internal.storage.file.LockFile;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
+
+import java.io.File;
+import java.io.IOException;
+
+@Singleton
+@Export(DefaultSecureStore.NAME)
+public class DefaultSecureStore implements SecureStore {
+ public static final String NAME = "default";
+
+ private final FileBasedConfig sec;
+
+ @Inject
+ DefaultSecureStore(SitePaths site) {
+ File secureConfig = new File(site.etc_dir, "secure.config");
+ sec = new FileBasedConfig(secureConfig, FS.DETECTED);
+ try {
+ sec.load();
+ } catch (Exception e) {
+ throw new RuntimeException("Cannot load secure.config", e);
+ }
+ }
+
+ @Override
+ public String get(String section, String subsection, String name) {
+ return sec.getString(section, subsection, name);
+ }
+
+ @Override
+ public void set(String section, String subsection, String name, String value) {
+ if (value != null) {
+ sec.setString(section, subsection, name, value);
+ } else {
+ sec.unset(section, subsection, name);
+ }
+ save();
+ }
+
+ @Override
+ public void unset(String section, String subsection, String name) {
+ sec.unset(section, subsection, name);
+ save();
+ }
+
+ private void save() {
+ try {
+ saveSecure(sec);
+ } catch (IOException e) {
+ throw new RuntimeException("Cannot save secure.config", e);
+ }
+ }
+
+ private static void saveSecure(final FileBasedConfig sec) throws IOException {
+ if (FileUtil.modified(sec)) {
+ final byte[] out = Constants.encode(sec.toText());
+ final File path = sec.getFile();
+ final LockFile lf = new LockFile(path, FS.DETECTED);
+ if (!lf.lock()) {
+ throw new IOException("Cannot lock " + path);
+ }
+ try {
+ FileUtil.chmod(0600, new File(path.getParentFile(), path.getName()
+ + ".lock"));
+ lf.write(out);
+ if (!lf.commit()) {
+ throw new IOException("Cannot commit write to " + path);
+ }
+ } finally {
+ lf.unlock();
+ }
+ }
+ }
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStore.java b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStore.java
new file mode 100644
index 0000000..3fe00f4
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStore.java
@@ -0,0 +1,27 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.securestore;
+
+import com.google.gerrit.extensions.annotations.ExtensionPoint;
+
+@ExtensionPoint
+public interface SecureStore {
+
+ String get(String section, String subsection, String name);
+
+ void set(String section, String subsection, String name, String value);
+
+ void unset(String section, String subsection, String name);
+}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreData.java b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreData.java
new file mode 100644
index 0000000..b925105
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreData.java
@@ -0,0 +1,77 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.securestore;
+
+import com.google.common.base.Objects;
+
+import java.io.File;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+public class SecureStoreData {
+ public final File pluginFile;
+ public final String storeName;
+ public final String className;
+
+ public SecureStoreData(String pluginName, String className, File jarFile,
+ String storeName) {
+ this.className = className;
+ this.pluginFile = jarFile;
+ this.storeName = String.format("%s/%s", pluginName, storeName);
+ }
+
+ public String getStoreName() {
+ return storeName;
+ }
+
+ public Class<? extends SecureStore> load() {
+ return load(pluginFile);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Class<? extends SecureStore> load(File pluginFile) {
+ try {
+ URL[] pluginJarUrls = new URL[] {pluginFile.toURI().toURL()};
+ ClassLoader currentCL = Thread.currentThread().getContextClassLoader();
+ final URLClassLoader newClassLoader =
+ new URLClassLoader(pluginJarUrls, currentCL);
+ Thread.currentThread().setContextClassLoader(newClassLoader);
+ return (Class<? extends SecureStore>) newClassLoader.loadClass(className);
+ } catch (Exception e) {
+ throw new SecureStoreException(String.format(
+ "Cannot load secure store implementation for %s", storeName), e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return Objects.toStringHelper(this).add("storeName", storeName)
+ .add("className", className).add("file", pluginFile).toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof SecureStoreData) {
+ SecureStoreData o = (SecureStoreData) obj;
+ return storeName.equals(o.storeName);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(storeName);
+ }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreException.java
similarity index 61%
copy from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
copy to gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreException.java
index 96e2ec8..01450f8 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/securestore/SecureStoreException.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// Copyright (C) 2013 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,16 +12,16 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.pgm.util;
+package com.google.gerrit.server.securestore;
-public class Die extends RuntimeException {
- private static final long serialVersionUID = 1L;
+public class SecureStoreException extends RuntimeException {
+ private static final long serialVersionUID = 5581700510568485065L;
- public Die(final String why) {
- super(why);
+ SecureStoreException(String msg) {
+ super(msg);
}
- public Die(final String why, final Throwable cause) {
- super(why, cause);
+ SecureStoreException(String msg, Exception e) {
+ super(msg, e);
}
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java b/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java
index a2b0ad1..3e41858 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/tools/ToolsCatalog.java
@@ -69,7 +69,7 @@
}
private static SortedMap<String, Entry> readToc() throws IOException {
- SortedMap<String, Entry> toc = new TreeMap<String, Entry>();
+ SortedMap<String, Entry> toc = new TreeMap<>();
final BufferedReader br =
new BufferedReader(new InputStreamReader(new ByteArrayInputStream(
read("TOC")), "UTF-8"));
@@ -81,7 +81,7 @@
}
}
- final List<Entry> all = new ArrayList<Entry>(toc.values());
+ final List<Entry> all = new ArrayList<>(toc.values());
for (Entry e : all) {
String path = dirOf(e.getPath());
while (path != null) {
@@ -159,7 +159,7 @@
if (type == Type.FILE) {
this.children = Collections.emptyList();
} else {
- this.children = new ArrayList<Entry>();
+ this.children = new ArrayList<>();
}
}
@@ -167,7 +167,7 @@
this.type = type;
this.mode = mode;
this.path = path;
- this.children = new ArrayList<Entry>();
+ this.children = new ArrayList<>();
}
public Type getType() {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/SubmoduleSectionParser.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/SubmoduleSectionParser.java
index fbb3e93..8970425 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/SubmoduleSectionParser.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/SubmoduleSectionParser.java
@@ -60,8 +60,7 @@
}
public List<SubmoduleSubscription> parseAllSections() {
- List<SubmoduleSubscription> parsedSubscriptions =
- new ArrayList<SubmoduleSubscription>();
+ List<SubmoduleSubscription> parsedSubscriptions = new ArrayList<>();
for (final String id : bbc.getSubsections("submodule")) {
final SubmoduleSubscription subscription = parse(id);
if (subscription != null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestContext.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestContext.java
index 2a67c90..f8bad77 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestContext.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/ThreadLocalRequestContext.java
@@ -72,8 +72,7 @@
};
}
- private static final ThreadLocal<RequestContext> local =
- new ThreadLocal<RequestContext>();
+ private static final ThreadLocal<RequestContext> local = new ThreadLocal<>();
@Inject
ThreadLocalRequestContext() {
diff --git a/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java b/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java
index 0f173c7..a471450 100644
--- a/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java
+++ b/gerrit-server/src/main/java/gerrit/PRED_project_default_submit_type_1.java
@@ -14,7 +14,7 @@
package gerrit;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.rules.StoredValues;
import com.google.gerrit.server.project.ChangeControl;
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mime-types.properties b/gerrit-server/src/main/resources/com/google/gerrit/server/mime-types.properties
new file mode 100644
index 0000000..aac1e5a
--- /dev/null
+++ b/gerrit-server/src/main/resources/com/google/gerrit/server/mime-types.properties
@@ -0,0 +1,38 @@
+as = text/x-gas
+bucklet = text/x-python
+BUCK = text/x-python
+clj = text/x-clojure
+cl = text/x-common-lisp
+coffee = text/x-coffeescript
+cxx = text/x-c++src
+d = text/x-d
+defs = text/x-python
+diff = text/x-diff
+dtd = application/xml-dtd
+el = text/x-common-lisp
+erl = text/x-erlang
+gitmodules = text/x-ini
+go = text/x-go
+groovy = text/x-groovy
+hs = text/x-haskell
+hxx = text/x-c++hdr
+lisp = text/x-common-lisp
+lsp = text/x-common-lisp
+lua = text/x-lua
+md = text/x-markdown
+patch = text/x-diff
+php = text/x-php
+pig = text/x-pig
+pl = text/x-perl
+pm = text/x-perl
+project.config = text/x-ini
+properties = text/x-ini
+py = text/x-python
+r = text/r-src
+rb = text/x-ruby
+scala = text/x-scala
+st = text/x-stsrc
+v = text/x-verilog
+vh = text/x-verilog
+vm = text/velocity
+yaml = text/x-yaml
diff --git a/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java b/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java
index 19edaf4..c697400 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/rules/PrologTestCase.java
@@ -57,7 +57,7 @@
protected void load(String pkg, String prologResource, Module... modules)
throws CompileException, IOException {
- ArrayList<Module> moduleList = new ArrayList<Module>();
+ ArrayList<Module> moduleList = new ArrayList<>();
moduleList.add(new PrologModule.EnvironmentModule());
moduleList.addAll(Arrays.asList(modules));
@@ -74,7 +74,7 @@
SymbolTerm.intern(pkg),
new StructureTerm(test_1, new VariableTerm()));
- tests = new ArrayList<Term>();
+ tests = new ArrayList<>();
for (Term[] pair : env.all(Prolog.BUILTIN, "clause", head, new VariableTerm())) {
tests.add(pair[0]);
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/change/CommentsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/change/CommentsTest.java
index 6c24f00..8fdad6f 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/change/CommentsTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/change/CommentsTest.java
@@ -158,7 +158,7 @@
return new IAnswer<ResultSet<PatchLineComment>>() {
@Override
public ResultSet<PatchLineComment> answer() throws Throwable {
- return new ListResultSet<PatchLineComment>(Lists.newArrayList(comments));
+ return new ListResultSet<>(Lists.newArrayList(comments));
}};
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java
index ae58819..65eede6 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/change/IncludedInResolverTest.java
@@ -58,8 +58,8 @@
private RevCommit commit_v1_3;
private RevCommit commit_v2_5;
- private List<String> expTags = new ArrayList<String>();
- private List<String> expBranches = new ArrayList<String>();
+ private List<String> expTags = new ArrayList<>();
+ private List<String> expBranches = new ArrayList<>();
private RevWalk revWalk;
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/ProjectConfigTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/ProjectConfigTest.java
index 1a9f74b..cc4a9e3 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/git/ProjectConfigTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/ProjectConfigTest.java
@@ -21,9 +21,11 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import com.google.common.collect.Iterables;
import com.google.gerrit.common.data.AccessSection;
import com.google.gerrit.common.data.ContributorAgreement;
import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.data.LabelType;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.common.data.PermissionRule;
import com.google.gerrit.reviewdb.client.AccountGroup;
@@ -47,6 +49,7 @@
import java.io.IOException;
import java.util.Collections;
+import java.util.Map;
public class ProjectConfigTest extends LocalDiskRepositoryTestCase {
private final GroupReference developers = new GroupReference(
@@ -62,7 +65,7 @@
public void setUp() throws Exception {
super.setUp();
db = createBareRepository();
- util = new TestRepository<Repository>(db);
+ util = new TestRepository<>(db);
}
@Test
@@ -115,6 +118,60 @@
}
@Test
+ public void testReadConfigLabelDefaultValue() throws Exception {
+ RevCommit rev = util.commit(util.tree( //
+ util.file("groups", util.blob(group(developers))), //
+ util.file("project.config", util.blob(""//
+ + "[label \"CustomLabel\"]\n" //
+ + " value = -1 Negative\n" //
+ + " value = 0 No Score\n" //
+ + " value = 1 Positive\n")) //
+ ));
+
+ ProjectConfig cfg = read(rev);
+ Map<String, LabelType> labels = cfg.getLabelSections();
+ Short dv = labels.entrySet().iterator().next().getValue().getDefaultValue();
+ assertEquals(0, (int) dv);
+ }
+
+ @Test
+ public void testReadConfigLabelDefaultValueInRange() throws Exception {
+ RevCommit rev = util.commit(util.tree( //
+ util.file("groups", util.blob(group(developers))), //
+ util.file("project.config", util.blob(""//
+ + "[label \"CustomLabel\"]\n" //
+ + " value = -1 Negative\n" //
+ + " value = 0 No Score\n" //
+ + " value = 1 Positive\n" //
+ + " defaultValue = -1\n")) //
+ ));
+
+ ProjectConfig cfg = read(rev);
+ Map<String, LabelType> labels = cfg.getLabelSections();
+ Short dv = labels.entrySet().iterator().next().getValue().getDefaultValue();
+ assertEquals(-1, (int) dv);
+ }
+
+ @Test
+ public void testReadConfigLabelDefaultValueNotInRange() throws Exception {
+ RevCommit rev = util.commit(util.tree( //
+ util.file("groups", util.blob(group(developers))), //
+ util.file("project.config", util.blob(""//
+ + "[label \"CustomLabel\"]\n" //
+ + " value = -1 Negative\n" //
+ + " value = 0 No Score\n" //
+ + " value = 1 Positive\n" //
+ + " defaultValue = -2\n")) //
+ ));
+
+ ProjectConfig cfg = read(rev);
+ assertEquals(1, cfg.getValidationErrors().size());
+ assertEquals("project.config: Invalid defaultValue \"-2\" "
+ + "for label \"CustomLabel\"",
+ Iterables.getOnlyElement(cfg.getValidationErrors()).getMessage());
+ }
+
+ @Test
public void testEditConfig() throws Exception {
RevCommit rev = util.commit(util.tree( //
util.file("groups", util.blob(group(developers))), //
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/git/SubmoduleOpTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/git/SubmoduleOpTest.java
index 33ba36e..f931dbf 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/git/SubmoduleOpTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/git/SubmoduleOpTest.java
@@ -127,7 +127,7 @@
expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
final ResultSet<SubmoduleSubscription> emptySubscriptions =
- new ListResultSet<SubmoduleSubscription>(new ArrayList<SubmoduleSubscription>());
+ new ListResultSet<>(new ArrayList<SubmoduleSubscription>());
expect(subscriptions.bySubmodule(branchNameKey)).andReturn(
emptySubscriptions);
@@ -293,8 +293,7 @@
new Branch.NameKey(new Project.NameKey("dest-project"),
"refs/heads/master");
- final List<SubmoduleSubscription> subscriptionsToInsert =
- new ArrayList<SubmoduleSubscription>();
+ List<SubmoduleSubscription> subscriptionsToInsert = new ArrayList<>();
subscriptionsToInsert
.add(new SubmoduleSubscription(mergedBranch, new Branch.NameKey(
new Project.NameKey("source-a"), "refs/heads/master"), "source-a"));
@@ -351,8 +350,7 @@
new Branch.NameKey(new Project.NameKey("dest-project"),
"refs/heads/master");
- final List<SubmoduleSubscription> subscriptionsToInsert =
- new ArrayList<SubmoduleSubscription>();
+ List<SubmoduleSubscription> subscriptionsToInsert = new ArrayList<>();
subscriptionsToInsert
.add(new SubmoduleSubscription(mergedBranch, new Branch.NameKey(
new Project.NameKey("source-a"), "refs/heads/master"), "source-a"));
@@ -409,8 +407,7 @@
new Branch.NameKey(new Project.NameKey("dest-project"),
"refs/heads/master");
- final List<SubmoduleSubscription> subscriptionsToInsert =
- new ArrayList<SubmoduleSubscription>();
+ List<SubmoduleSubscription> subscriptionsToInsert = new ArrayList<>();
subscriptionsToInsert
.add(new SubmoduleSubscription(mergedBranch, new Branch.NameKey(
new Project.NameKey("source-a"), "refs/heads/test-a"), "source-a"));
@@ -464,14 +461,12 @@
new Branch.NameKey(new Project.NameKey("dest-project"),
"refs/heads/master");
- final List<SubmoduleSubscription> subscriptionsToInsert =
- new ArrayList<SubmoduleSubscription>();
+ List<SubmoduleSubscription> subscriptionsToInsert = new ArrayList<>();
subscriptionsToInsert.add(new SubmoduleSubscription(mergedBranch,
new Branch.NameKey(new Project.NameKey("source"), "refs/heads/master"),
"source"));
- final List<SubmoduleSubscription> oldOnesToMergedBranch =
- new ArrayList<SubmoduleSubscription>();
+ List<SubmoduleSubscription> oldOnesToMergedBranch = new ArrayList<>();
oldOnesToMergedBranch.add(new SubmoduleSubscription(mergedBranch,
new Branch.NameKey(new Project.NameKey("old-source"),
"refs/heads/master"), "old-source"));
@@ -531,15 +526,13 @@
new SubmoduleSubscription(mergedBranch, new Branch.NameKey(new Project.NameKey(
"old"), "refs/heads/master"), "old");
- final List<SubmoduleSubscription> extractedsubscriptions =
- new ArrayList<SubmoduleSubscription>();
+ List<SubmoduleSubscription> extractedsubscriptions = new ArrayList<>();
extractedsubscriptions.add(new SubmoduleSubscription(mergedBranch,
new Branch.NameKey(new Project.NameKey("new"), "refs/heads/master"),
"new"));
extractedsubscriptions.add(old);
- final List<SubmoduleSubscription> oldOnesToMergedBranch =
- new ArrayList<SubmoduleSubscription>();
+ List<SubmoduleSubscription> oldOnesToMergedBranch = new ArrayList<>();
oldOnesToMergedBranch.add(old);
doOnlySubscriptionTableOperations(sb.toString(), mergedBranch,
@@ -564,11 +557,8 @@
new Branch.NameKey(new Project.NameKey("dest-project"),
"refs/heads/master");
- final List<SubmoduleSubscription> extractedsubscriptions =
- new ArrayList<SubmoduleSubscription>();
-
- final List<SubmoduleSubscription> oldOnesToMergedBranch =
- new ArrayList<SubmoduleSubscription>();
+ List<SubmoduleSubscription> extractedsubscriptions = new ArrayList<>();
+ List<SubmoduleSubscription> oldOnesToMergedBranch = new ArrayList<>();
oldOnesToMergedBranch
.add(new SubmoduleSubscription(mergedBranch, new Branch.NameKey(
new Project.NameKey("source-a"), "refs/heads/master"), "source-a"));
@@ -613,11 +603,10 @@
new Change.Key(sourceMergeTip.toObjectId().getName()), new Change.Id(1),
new Account.Id(1), sourceBranchNameKey, TimeUtil.nowTs());
- final Map<Change.Id, CodeReviewCommit> mergedCommits =
- new HashMap<Change.Id, CodeReviewCommit>();
+ final Map<Change.Id, CodeReviewCommit> mergedCommits = new HashMap<>();
mergedCommits.put(submittedChange.getId(), codeReviewCommit);
- final List<Change> submitted = new ArrayList<Change>();
+ final List<Change> submitted = new ArrayList<>();
submitted.add(submittedChange);
final Repository targetRepository = createWorkRepository();
@@ -635,7 +624,7 @@
expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
final ResultSet<SubmoduleSubscription> subscribers =
- new ListResultSet<SubmoduleSubscription>(Collections
+ new ListResultSet<>(Collections
.singletonList(new SubmoduleSubscription(targetBranchNameKey,
sourceBranchNameKey, "source-project")));
expect(subscriptions.bySubmodule(sourceBranchNameKey)).andReturn(
@@ -644,13 +633,13 @@
expect(repoManager.openRepository(targetBranchNameKey.getParentKey()))
.andReturn(targetRepository).anyTimes();
- Capture<RefUpdate> ruCapture = new Capture<RefUpdate>();
+ Capture<RefUpdate> ruCapture = new Capture<>();
gitRefUpdated.fire(eq(targetBranchNameKey.getParentKey()),
capture(ruCapture));
expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
final ResultSet<SubmoduleSubscription> emptySubscriptions =
- new ListResultSet<SubmoduleSubscription>(new ArrayList<SubmoduleSubscription>());
+ new ListResultSet<>(new ArrayList<SubmoduleSubscription>());
expect(subscriptions.bySubmodule(targetBranchNameKey)).andReturn(
emptySubscriptions);
@@ -716,11 +705,10 @@
new Change.Key(sourceMergeTip.toObjectId().getName()), new Change.Id(1),
new Account.Id(1), sourceBranchNameKey, TimeUtil.nowTs());
- final Map<Change.Id, CodeReviewCommit> mergedCommits =
- new HashMap<Change.Id, CodeReviewCommit>();
+ final Map<Change.Id, CodeReviewCommit> mergedCommits = new HashMap<>();
mergedCommits.put(submittedChange.getId(), codeReviewCommit);
- final List<Change> submitted = new ArrayList<Change>();
+ final List<Change> submitted = new ArrayList<>();
submitted.add(submittedChange);
final Repository targetRepository = createWorkRepository();
@@ -738,7 +726,7 @@
expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
final ResultSet<SubmoduleSubscription> subscribers =
- new ListResultSet<SubmoduleSubscription>(Collections
+ new ListResultSet<>(Collections
.singletonList(new SubmoduleSubscription(targetBranchNameKey,
sourceBranchNameKey, "source-project")));
expect(subscriptions.bySubmodule(sourceBranchNameKey)).andReturn(
@@ -747,7 +735,7 @@
expect(repoManager.openRepository(targetBranchNameKey.getParentKey()))
.andReturn(targetRepository).anyTimes();
- Capture<RefUpdate> ruCapture = new Capture<RefUpdate>();
+ Capture<RefUpdate> ruCapture = new Capture<>();
gitRefUpdated.fire(eq(targetBranchNameKey.getParentKey()),
capture(ruCapture));
@@ -803,8 +791,7 @@
new Branch.NameKey(new Project.NameKey("dest-project"),
"refs/heads/master");
- final List<SubmoduleSubscription> subscriptionsToInsert =
- new ArrayList<SubmoduleSubscription>();
+ List<SubmoduleSubscription> subscriptionsToInsert = new ArrayList<>();
subscriptionsToInsert.add(new SubmoduleSubscription(mergedBranch,
new Branch.NameKey(new Project.NameKey("source"), sourceBranchName),
"source"));
@@ -878,10 +865,9 @@
expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
expect(subscriptions.bySuperProject(mergedBranch)).andReturn(
- new ListResultSet<SubmoduleSubscription>(previousSubscriptions));
+ new ListResultSet<>(previousSubscriptions));
- SortedSet<Project.NameKey> existingProjects =
- new TreeSet<Project.NameKey>();
+ SortedSet<Project.NameKey> existingProjects = new TreeSet<>();
for (SubmoduleSubscription extracted : extractedSubscriptions) {
existingProjects.add(extracted.getSubmodule().getParentKey());
@@ -891,8 +877,7 @@
expect(repoManager.list()).andReturn(existingProjects);
}
- final Set<SubmoduleSubscription> alreadySubscribeds =
- new HashSet<SubmoduleSubscription>();
+ final Set<SubmoduleSubscription> alreadySubscribeds = new HashSet<>();
for (SubmoduleSubscription s : extractedSubscriptions) {
if (previousSubscriptions.contains(s)) {
alreadySubscribeds.add(s);
@@ -900,9 +885,9 @@
}
final Set<SubmoduleSubscription> subscriptionsToRemove =
- new HashSet<SubmoduleSubscription>(previousSubscriptions);
+ new HashSet<>(previousSubscriptions);
final List<SubmoduleSubscription> subscriptionsToInsert =
- new ArrayList<SubmoduleSubscription>(extractedSubscriptions);
+ new ArrayList<>(extractedSubscriptions);
subscriptionsToRemove.removeAll(subscriptionsToInsert);
subscriptionsToInsert.removeAll(alreadySubscribeds);
@@ -917,7 +902,7 @@
expect(schema.submoduleSubscriptions()).andReturn(subscriptions);
expect(subscriptions.bySubmodule(mergedBranch)).andReturn(
- new ListResultSet<SubmoduleSubscription>(new ArrayList<SubmoduleSubscription>()));
+ new ListResultSet<>(new ArrayList<SubmoduleSubscription>()));
schema.close();
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeIndex.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeIndex.java
index 4db3b27..1b6ae4e 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeIndex.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeIndex.java
@@ -23,11 +23,11 @@
import com.google.gwtorm.server.ResultSet;
class FakeIndex implements ChangeIndex {
- static Schema<ChangeData> V1 = new Schema<ChangeData>(1, false,
+ static Schema<ChangeData> V1 = new Schema<>(1, false,
ImmutableList.<FieldDef<ChangeData, ?>> of(
ChangeField.STATUS));
- static Schema<ChangeData> V2 = new Schema<ChangeData>(2, false,
+ static Schema<ChangeData> V2 = new Schema<>(2, false,
ImmutableList.of(
ChangeField.STATUS,
ChangeField.PATH,
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeQueryBuilder.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeQueryBuilder.java
index 2079d3d..50e5764 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeQueryBuilder.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/FakeQueryBuilder.java
@@ -23,7 +23,7 @@
public class FakeQueryBuilder extends ChangeQueryBuilder {
FakeQueryBuilder(IndexCollection indexes) {
super(
- new FakeQueryBuilder.Definition<ChangeData, FakeQueryBuilder>(
+ new FakeQueryBuilder.Definition<>(
FakeQueryBuilder.class),
new ChangeQueryBuilder.Arguments(null, null, null, null, null, null,
null, null, null, null, null, null, null, null, indexes, null, null,
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java
index e4de9ed..9ac8ba9 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/project/Util.java
@@ -38,6 +38,8 @@
import com.google.gerrit.server.account.GroupBackend;
import com.google.gerrit.server.account.GroupMembership;
import com.google.gerrit.server.account.ListGroupMembership;
+import com.google.gerrit.server.change.ChangeKindCache;
+import com.google.gerrit.server.change.ChangeKindCacheImpl;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.AnonymousCowardName;
import com.google.gerrit.server.config.AnonymousCowardNameProvider;
@@ -138,7 +140,7 @@
private final ProjectConfig parent = new ProjectConfig(allProjectsName);
public Util() {
- all = new HashMap<Project.NameKey, ProjectState>();
+ all = new HashMap<>();
repoManager = new InMemoryRepositoryManager();
try {
Repository repo = repoManager.createRepository(allProjectsName);
@@ -156,6 +158,11 @@
}
@Override
+ public ProjectState getAllUsers() {
+ return null;
+ }
+
+ @Override
public ProjectState get(Project.NameKey projectName) {
return all.get(projectName);
}
@@ -217,6 +224,7 @@
.toProvider(CanonicalWebUrlProvider.class);
bind(String.class).annotatedWith(AnonymousCowardName.class)
.toProvider(AnonymousCowardNameProvider.class);
+ bind(ChangeKindCache.class).to(ChangeKindCacheImpl.NoCache.class);
}
});
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 4342684..ef92cbf 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
@@ -28,6 +28,7 @@
import com.google.common.hash.Hashing;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.api.changes.ReviewInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
import com.google.gerrit.extensions.restapi.TopLevelResource;
import com.google.gerrit.lifecycle.LifecycleManager;
import com.google.gerrit.reviewdb.client.Account;
@@ -110,6 +111,9 @@
schemaCreator.create(db);
userId = accountManager.authenticate(AuthRequest.forUser("user"))
.getAccountId();
+ Account userAccount = db.accounts().get(userId);
+ userAccount.setPreferredEmail("user@example.com");
+ db.accounts().update(ImmutableList.of(userAccount));
user = userFactory.create(userId);
requestContext.setContext(new RequestContext() {
@@ -303,11 +307,30 @@
Change change2 = newChange(repo2, null, null, null, null).insert();
assertTrue(query("project:foo").isEmpty());
+ assertTrue(query("project:repo").isEmpty());
assertResultEquals(change1, queryOne("project:repo1"));
assertResultEquals(change2, queryOne("project:repo2"));
}
@Test
+ public void byProjectPrefix() throws Exception {
+ TestRepository<InMemoryRepository> repo1 = createProject("repo1");
+ TestRepository<InMemoryRepository> repo2 = createProject("repo2");
+ Change change1 = newChange(repo1, null, null, null, null).insert();
+ Change change2 = newChange(repo2, null, null, null, null).insert();
+
+ assertTrue(query("projects:foo").isEmpty());
+ assertResultEquals(change1, queryOne("projects:repo1"));
+ assertResultEquals(change2, queryOne("projects:repo2"));
+
+ List<ChangeInfo> results;
+ results = query("projects:repo");
+ assertEquals(results.toString(), 2, results.size());
+ assertResultEquals(change2, results.get(0));
+ assertResultEquals(change1, results.get(1));
+ }
+
+ @Test
public void byBranchAndRef() throws Exception {
TestRepository<InMemoryRepository> repo = createProject("repo");
Change change1 = newChange(repo, null, null, null, "master").insert();
@@ -332,14 +355,18 @@
Change change1 = ins1.getChange();
change1.setTopic("feature1");
ins1.insert();
+
ChangeInserter ins2 = newChange(repo, null, null, null, null);
Change change2 = ins2.getChange();
change2.setTopic("feature2");
ins2.insert();
+ Change change3 = newChange(repo, null, null, null, null).insert();
+
assertTrue(query("topic:foo").isEmpty());
assertResultEquals(change1, queryOne("topic:feature1"));
assertResultEquals(change2, queryOne("topic:feature2"));
+ assertResultEquals(change3, queryOne("topic:\"\""));
}
@Test
@@ -785,6 +812,51 @@
assertResultEquals(change1, results.get(1));
}
+ @Test
+ public void byDefault() throws Exception {
+ TestRepository<InMemoryRepository> repo = createProject("repo");
+
+ Change change1 = newChange(repo, null, null, null, null).insert();
+
+ RevCommit commit2 = repo.parseBody(
+ repo.commit().message("foosubject").create());
+ Change change2 = newChange(repo, commit2, null, null, null).insert();
+
+ RevCommit commit3 = repo.parseBody(
+ repo.commit()
+ .add("Foo.java", "foo contents")
+ .create());
+ Change change3 = newChange(repo, commit3, null, null, null).insert();
+
+ ChangeInserter ins4 = newChange(repo, null, null, null, null);
+ Change change4 = ins4.insert();
+ ReviewInput ri4 = new ReviewInput();
+ ri4.message = "toplevel";
+ ri4.labels = ImmutableMap.<String, Short> of("Code-Review", (short) 1);
+ postReview.apply(new RevisionResource(
+ changes.parse(change4.getId()), ins4.getPatchSet()), ri4);
+
+ ChangeInserter ins5 = newChange(repo, null, null, null, null);
+ Change change5 = ins5.getChange();
+ change5.setTopic("feature5");
+ ins5.insert();
+
+ Change change6 = newChange(repo, null, null, null, "branch6").insert();
+
+ assertResultEquals(change1,
+ queryOne(Integer.toString(change1.getId().get())));
+ assertResultEquals(change2, queryOne("foosubject"));
+ assertResultEquals(change3, queryOne("Foo.java"));
+ assertResultEquals(change4, queryOne("Code-Review+1"));
+ assertResultEquals(change4, queryOne("toplevel"));
+ assertResultEquals(change5, queryOne("feature5"));
+ assertResultEquals(change6, queryOne("branch6"));
+ assertResultEquals(change6, queryOne("refs/heads/branch6"));
+
+ assertEquals(6, query("user@example.com").size());
+ assertEquals(6, query("repo").size());
+ }
+
protected ChangeInserter newChange(
TestRepository<InMemoryRepository> repo,
@Nullable RevCommit commit, @Nullable String key, @Nullable Integer owner,
@@ -833,7 +905,7 @@
protected TestRepository<InMemoryRepository> createProject(String name)
throws Exception {
CreateProject create = projectFactory.create(name);
- create.apply(TLR, new CreateProject.Input());
+ create.apply(TLR, new ProjectInput());
return new TestRepository<InMemoryRepository>(
repoManager.openRepository(new Project.NameKey(name)));
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesV7Test.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesV7Test.java
index 948626e..cf60297 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesV7Test.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/LuceneQueryChangesV7Test.java
@@ -32,6 +32,7 @@
import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.Config;
+import org.junit.Ignore;
import org.junit.Test;
import java.util.List;
@@ -43,6 +44,18 @@
return Guice.createInjector(new InMemoryModule(cfg));
}
+ // Tests for features not supported in V7.
+ @Ignore
+ @Override
+ @Test
+ public void byProjectPrefix() {}
+
+ @Ignore
+ @Override
+ @Test
+ public void byDefault() {}
+ // End tests for features not supported in V7.
+
@Test
public void pagination() throws Exception {
TestRepository<InMemoryRepository> repo = createProject("repo");
@@ -142,4 +155,26 @@
assertResultEquals(change2, results.get(0));
assertResultEquals(change1, results.get(1));
}
+
+ @Override
+ @Test
+ public void byTopic() throws Exception {
+ TestRepository<InMemoryRepository> repo = createProject("repo");
+ ChangeInserter ins1 = newChange(repo, null, null, null, null);
+ Change change1 = ins1.getChange();
+ change1.setTopic("feature1");
+ ins1.insert();
+
+ ChangeInserter ins2 = newChange(repo, null, null, null, null);
+ Change change2 = ins2.getChange();
+ change2.setTopic("feature2");
+ ins2.insert();
+
+ newChange(repo, null, null, null, null).insert();
+
+ assertTrue(query("topic:\"\"").isEmpty());
+ assertTrue(query("topic:foo").isEmpty());
+ assertResultEquals(change1, queryOne("topic:feature1"));
+ assertResultEquals(change2, queryOne("topic:feature2"));
+ }
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexPathPredicateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexPathPredicateTest.java
index dd7ac56..a799228 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexPathPredicateTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexPathPredicateTest.java
@@ -82,7 +82,7 @@
return new RegexPathPredicate(ChangeQueryBuilder.FIELD_PATH, pattern);
}
- private static ChangeData change(String... files) {
+ private static ChangeData change(String... files) throws OrmException {
Arrays.sort(files);
ChangeData cd = ChangeData.createForTest(new Change.Id(1));
cd.setCurrentFilePaths(Arrays.asList(files));
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java
index 4756390..15a66ab 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaCreatorTest.java
@@ -129,6 +129,7 @@
assertNotNull(codeReview);
assertEquals("Code-Review", codeReview.getName());
assertEquals("CR", codeReview.getAbbreviation());
+ assertEquals(0, codeReview.getDefaultValue());
assertEquals("MaxWithBlock", codeReview.getFunctionName());
assertTrue(codeReview.isCopyMinScore());
assertValueRange(codeReview, 2, 1, 0, -1, -2);
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java
index e6b7a3f..d8b6048 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/schema/SchemaUpdaterTest.java
@@ -19,6 +19,7 @@
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.GerritPersonIdentProvider;
import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
import com.google.gerrit.server.config.AnonymousCowardName;
import com.google.gerrit.server.config.AnonymousCowardNameProvider;
import com.google.gerrit.server.config.FactoryModule;
@@ -89,6 +90,8 @@
bind(AllProjectsName.class)
.toInstance(new AllProjectsName("All-Projects"));
+ bind(AllUsersName.class)
+ .toInstance(new AllUsersName("All-Users"));
bind(GitRepositoryManager.class)
.toInstance(new InMemoryRepositoryManager());
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/IdGeneratorTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/IdGeneratorTest.java
index 5546410..a2228d8 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/util/IdGeneratorTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/util/IdGeneratorTest.java
@@ -24,7 +24,7 @@
public class IdGeneratorTest {
@Test
public void test1234() {
- final HashSet<Integer> seen = new HashSet<Integer>();
+ final HashSet<Integer> seen = new HashSet<>();
for (int i = 0; i < 1 << 16; i++) {
final int e = IdGenerator.mix(i);
assertTrue("no duplicates", seen.add(e));
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/SubmoduleSectionParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/SubmoduleSectionParserTest.java
index edd79241..d87888f 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/util/SubmoduleSectionParserTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/util/SubmoduleSectionParserTest.java
@@ -64,8 +64,7 @@
@Test
public void testSubmodulesParseWithCorrectSections() throws Exception {
- final Map<String, SubmoduleSection> sectionsToReturn =
- new TreeMap<String, SubmoduleSection>();
+ final Map<String, SubmoduleSection> sectionsToReturn = new TreeMap<>();
sectionsToReturn.put("a", new SubmoduleSection("ssh://localhost/a", "a",
"."));
sectionsToReturn.put("b", new SubmoduleSection("ssh://localhost/b", "b",
@@ -77,7 +76,7 @@
sectionsToReturn.put("e", new SubmoduleSection("ssh://localhost/e.git", "e",
"."));
- final Map<String, String> reposToBeFound = new HashMap<String, String>();
+ Map<String, String> reposToBeFound = new HashMap<>();
reposToBeFound.put("a", "a");
reposToBeFound.put("b", "b");
reposToBeFound.put("c", "test/c");
@@ -88,8 +87,7 @@
new Branch.NameKey(new Project.NameKey("super-project"),
"refs/heads/master");
- final List<SubmoduleSubscription> expectedSubscriptions =
- new ArrayList<SubmoduleSubscription>();
+ List<SubmoduleSubscription> expectedSubscriptions = new ArrayList<>();
expectedSubscriptions
.add(new SubmoduleSubscription(superBranchNameKey, new Branch.NameKey(
new Project.NameKey("a"), "refs/heads/master"), "a"));
@@ -112,8 +110,7 @@
@Test
public void testSubmodulesParseWithAnInvalidSection() throws Exception {
- final Map<String, SubmoduleSection> sectionsToReturn =
- new TreeMap<String, SubmoduleSection>();
+ final Map<String, SubmoduleSection> sectionsToReturn = new TreeMap<>();
sectionsToReturn.put("a", new SubmoduleSection("ssh://localhost/a", "a",
"."));
// This one is invalid since "b" is not a recognized project
@@ -127,7 +124,7 @@
"."));
// "b" will not be in this list
- final Map<String, String> reposToBeFound = new HashMap<String, String>();
+ Map<String, String> reposToBeFound = new HashMap<>();
reposToBeFound.put("a", "a");
reposToBeFound.put("c", "test/c");
reposToBeFound.put("d", "d");
@@ -137,8 +134,7 @@
new Branch.NameKey(new Project.NameKey("super-project"),
"refs/heads/master");
- final List<SubmoduleSubscription> expectedSubscriptions =
- new ArrayList<SubmoduleSubscription>();
+ List<SubmoduleSubscription> expectedSubscriptions = new ArrayList<>();
expectedSubscriptions
.add(new SubmoduleSubscription(superBranchNameKey, new Branch.NameKey(
new Project.NameKey("a"), "refs/heads/master"), "a"));
@@ -158,8 +154,7 @@
@Test
public void testSubmoduleSectionToOtherServer() throws Exception {
- Map<String, SubmoduleSection> sectionsToReturn =
- new HashMap<String, SubmoduleSection>();
+ Map<String, SubmoduleSection> sectionsToReturn = new HashMap<>();
// The url is not to this server.
sectionsToReturn.put("a", new SubmoduleSection("ssh://review.source.com/a",
"a", "."));
@@ -171,8 +166,7 @@
@Test
public void testProjectNotFound() throws Exception {
- Map<String, SubmoduleSection> sectionsToReturn =
- new HashMap<String, SubmoduleSection>();
+ Map<String, SubmoduleSection> sectionsToReturn = new HashMap<>();
sectionsToReturn.put("a", new SubmoduleSection("ssh://localhost/a", "a",
"."));
@@ -183,8 +177,7 @@
@Test
public void testProjectWithSlashesNotFound() throws Exception {
- Map<String, SubmoduleSection> sectionsToReturn =
- new HashMap<String, SubmoduleSection>();
+ Map<String, SubmoduleSection> sectionsToReturn = new HashMap<>();
sectionsToReturn.put("project", new SubmoduleSection(
"ssh://localhost/company/tools/project", "project", "."));
@@ -222,12 +215,12 @@
}
if (projectNameCandidate.equals(reposToBeFound.get(id))) {
expect(repoManager.list()).andReturn(
- new TreeSet<Project.NameKey>(Collections
- .singletonList(new Project.NameKey(projectNameCandidate))));
+ new TreeSet<>(Collections.singletonList(
+ new Project.NameKey(projectNameCandidate))));
break;
} else {
expect(repoManager.list()).andReturn(
- new TreeSet<Project.NameKey>(Collections.<Project.NameKey> emptyList()));
+ new TreeSet<>(Collections.<Project.NameKey> emptyList()));
}
}
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/FilesystemLoggingMockingTestCase.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/FilesystemLoggingMockingTestCase.java
new file mode 100644
index 0000000..0ccdae7
--- /dev/null
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/FilesystemLoggingMockingTestCase.java
@@ -0,0 +1,177 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.testutil;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+
+import org.eclipse.jgit.util.FileUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+
+public abstract class FilesystemLoggingMockingTestCase extends LoggingMockingTestCase {
+
+ private Collection<File> toCleanup = Lists.newArrayList();
+
+ /**
+ * Asserts that a given file exists.
+ *
+ * @param file The file to test.
+ */
+ protected void assertExists(File file) {
+ assertTrue("File '" + file.getAbsolutePath() + "' does not exist",
+ file.exists());
+ }
+
+ /**
+ * Asserts that a given file does not exist.
+ *
+ * @param file The file to test.
+ */
+ protected void assertDoesNotExist(File file) {
+ assertFalse("File '" + file.getAbsolutePath() + "' exists", file.exists());
+ }
+
+ /**
+ * Asserts that a given file exists and is a directory.
+ *
+ * @param file The file to test.
+ */
+ protected void assertDirectory(File file) {
+ // Although isDirectory includes checking for existence, we nevertheless
+ // explicitly check for existence, to get more appropriate error messages
+ assertExists(file);
+ assertTrue("File '" + file.getAbsolutePath() + "' is not a directory",
+ file.isDirectory());
+ }
+
+ /**
+ * Asserts that creating a directory from the given file worked
+ *
+ * @param file The directory to create
+ */
+ protected void assertMkdirs(File file) {
+ assertTrue("Could not create directory '" + file.getAbsolutePath() + "'",
+ file.mkdirs());
+ }
+
+ /**
+ * Asserts that creating a directory from the specified file worked
+ *
+ * @param parent The parent of the directory to create
+ * @param name The name of the directoryto create (relative to {@code parent}
+ * @return The created directory
+ */
+ protected File assertMkdirs(File parent, String name) {
+ File file = new File(parent, name);
+ assertMkdirs(file);
+ return file;
+ }
+
+ /**
+ * Asserts that creating a file worked
+ *
+ * @param file The file to create
+ */
+ protected void assertCreateFile(File file) throws IOException {
+ assertTrue("Could not create file '" + file.getAbsolutePath() + "'",
+ file.createNewFile());
+ }
+
+ /**
+ * Asserts that creating a file worked
+ *
+ * @param parent The parent of the file to create
+ * @param name The name of the file to create (relative to {@code parent}
+ * @return The created file
+ */
+ protected File assertCreateFile(File parent, String name) throws IOException {
+ File file = new File(parent, name);
+ assertCreateFile(file);
+ return file;
+ }
+
+ /**
+ * Creates a file in the system's default folder for temporary files.
+ *
+ * The file/directory automatically gets removed during tearDown.
+ *
+ * The name of the created file begins with 'gerrit_test_', and is located
+ * in the system's default folder for temporary files.
+ *
+ * @param suffix Trailing part of the file name.
+ * @return The temporary file.
+ * @throws IOException If a file could not be created.
+ */
+ private File createTempFile(String suffix) throws IOException {
+ String prefix ="gerrit_test_";
+ if (!Strings.isNullOrEmpty(getName())) {
+ prefix += getName() + "_";
+ }
+ File tmp = File.createTempFile(prefix, suffix);
+ toCleanup.add(tmp);
+ return tmp;
+ }
+
+ /**
+ * Creates a file in the system's default folder for temporary files.
+ *
+ * The file/directory automatically gets removed during tearDown.
+ *
+ * The name of the created file begins with 'gerrit_test_', and is located
+ * in the system's default folder for temporary files.
+ *
+ * @return The temporary file.
+ * @throws IOException If a file could not be created.
+ */
+ protected File createTempFile() throws IOException {
+ return createTempFile("");
+ }
+
+ /**
+ * Creates a directory in the system's default folder for temporary files.
+ *
+ * The directory (and all it's contained files/directory) automatically get
+ * removed during tearDown.
+ *
+ * The name of the created directory begins with 'gerrit_test_', and is be
+ * located in the system's default folder for temporary files.
+ *
+ * @return The temporary directory.
+ * @throws IOException If a file could not be created.
+ */
+ protected File createTempDir() throws IOException {
+ File tmp = createTempFile(".dir");
+ if (!tmp.delete()) {
+ throw new IOException("Cannot delete temporary file '" + tmp.getPath()
+ + "'");
+ }
+ tmp.mkdir();
+ return tmp;
+ }
+
+ private void cleanupCreatedFiles() throws IOException {
+ for (File file : toCleanup) {
+ FileUtils.delete(file, FileUtils.RECURSIVE);
+ }
+ }
+
+ public void tearDown() throws Exception {
+ cleanupCreatedFiles();
+ super.tearDown();
+ }
+}
\ No newline at end of file
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java
index bc344fa..6353904 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/InMemoryDatabase.java
@@ -91,7 +91,7 @@
// Build the access layer around the connection factory.
//
- database = new Database<ReviewDb>(dataSource, ReviewDb.class);
+ database = new Database<>(dataSource, ReviewDb.class);
} catch (SQLException e) {
throw new OrmException(e);
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 9e698f7..6b2f7c7 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
@@ -29,6 +29,8 @@
import com.google.gerrit.server.change.MergeabilityChecksExecutorModule;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.AllProjectsNameProvider;
+import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.AllUsersNameProvider;
import com.google.gerrit.server.config.AnonymousCowardName;
import com.google.gerrit.server.config.AnonymousCowardNameProvider;
import com.google.gerrit.server.config.CanonicalWebUrlModule;
@@ -134,6 +136,8 @@
.toProvider(AnonymousCowardNameProvider.class);
bind(AllProjectsName.class)
.toProvider(AllProjectsNameProvider.class);
+ bind(AllUsersName.class)
+ .toProvider(AllUsersNameProvider.class);
bind(GitRepositoryManager.class)
.to(InMemoryRepositoryManager.class);
bind(InMemoryRepositoryManager.class).in(SINGLETON);
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/LoggingMockingTestCase.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/LoggingMockingTestCase.java
new file mode 100644
index 0000000..218fa0a
--- /dev/null
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/LoggingMockingTestCase.java
@@ -0,0 +1,134 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.testutil;
+
+import com.google.common.collect.Lists;
+import com.google.gerrit.testutil.log.LogUtil;
+
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.apache.log4j.spi.LoggingEvent;
+import org.junit.After;
+
+import java.util.Iterator;
+
+/**
+ * Testcase capturing associated logs and allowing to assert on them.
+ *
+ * For a test case SomeNameTest, the log for SomeName gets captured. Assertions
+ * on logs run against the coptured log events from this logger. After the
+ * tests, the logger are set back to their original settings.
+ */
+public abstract class LoggingMockingTestCase extends MockingTestCase {
+ private String loggerName;
+ private LogUtil.LoggerSettings loggerSettings;
+ private java.util.Collection<LoggingEvent> loggedEvents;
+
+ /**
+ * Assert a logged event with a given string.
+ * <p>
+ * If such a event is found, it is removed from the captured logs.
+ *
+ * @param needle The string to look for.
+ */
+ protected final void assertLogMessageContains(String needle) {
+ LoggingEvent hit = null;
+ Iterator<LoggingEvent> iter = loggedEvents.iterator();
+ while (hit == null && iter.hasNext()) {
+ LoggingEvent event = iter.next();
+ if (event.getRenderedMessage().contains(needle)) {
+ hit = event;
+ }
+ }
+ assertNotNull("Could not find log message containing '" + needle + "'",
+ hit);
+ assertTrue("Could not remove log message containing '" + needle + "'",
+ loggedEvents.remove(hit));
+ }
+
+ /**
+ * Assert a logged event whose throwable contains a given string
+ * <p>
+ * If such a event is found, it is removed from the captured logs.
+ *
+ * @param needle The string to look for.
+ */
+ protected final void assertLogThrowableMessageContains(String needle) {
+ LoggingEvent hit = null;
+ Iterator<LoggingEvent> iter = loggedEvents.iterator();
+ while (hit == null && iter.hasNext()) {
+ LoggingEvent event = iter.next();
+ if (event.getThrowableInformation().getThrowable().toString()
+ .contains(needle)) {
+ hit = event;
+ }
+ }
+ assertNotNull("Could not find log message with a Throwable containing '"
+ + needle + "'", hit);
+ assertTrue("Could not remove log message with a Throwable containing '"
+ + needle + "'", loggedEvents.remove(hit));
+ }
+
+ /**
+ * Assert that all logged events have been asserted
+ */
+ // As the PowerMock runner does not pass through runTest, we inject log
+ // verification through @After
+ @After
+ public final void assertNoUnassertedLogEvents() {
+ if (loggedEvents.size() > 0) {
+ LoggingEvent event = loggedEvents.iterator().next();
+ String msg = "Found untreated logged events. First one is:\n";
+ msg += event.getRenderedMessage();
+ if (event.getThrowableInformation() != null) {
+ msg += "\n" + event.getThrowableInformation().getThrowable();
+ }
+ fail(msg);
+ }
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ loggedEvents = Lists.newArrayList();
+
+ // The logger we're interested is class name without the trailing "Test".
+ // While this is not the most general approach it is sufficient for now,
+ // and we can improve later to allow tests to specify which loggers are
+ // to check.
+ loggerName = this.getClass().getCanonicalName();
+ loggerName = loggerName.substring(0, loggerName.length()-4);
+ loggerSettings = LogUtil.logToCollection(loggerName, loggedEvents);
+ }
+
+ @Override
+ protected void runTest() throws Throwable {
+ super.runTest();
+ // Plain JUnit runner does not pick up @After, so we add it here
+ // explicitly. Note, that we cannot put this into tearDown, as failure
+ // to verify mocks would bail out and might leave open resources from
+ // subclasses open.
+ assertNoUnassertedLogEvents();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ if (loggerName != null && loggerSettings != null) {
+ Logger logger = LogManager.getLogger(loggerName);
+ loggerSettings.pushOntoLogger(logger);
+ }
+ super.tearDown();
+ }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/MockingTestCase.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/MockingTestCase.java
new file mode 100644
index 0000000..569a57f
--- /dev/null
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/MockingTestCase.java
@@ -0,0 +1,155 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.testutil;
+
+import junit.framework.TestCase;
+
+import org.easymock.EasyMock;
+import org.easymock.IMocksControl;
+import org.junit.After;
+import org.junit.runner.RunWith;
+import org.powermock.api.easymock.PowerMock;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * Test case with some support for automatically verifying mocks.
+ *
+ * This test case works transparently with EasyMock and PowerMock.
+ */
+public abstract class MockingTestCase extends TestCase {
+ private Collection<Object> mocks;
+ private Collection<IMocksControl> mockControls;
+ private boolean mocksReplayed;
+ private boolean usePowerMock;
+
+ /**
+ * Create and register a mock control.
+ *
+ * @return The mock control instance.
+ */
+ protected final IMocksControl createMockControl() {
+ IMocksControl mockControl = EasyMock.createControl();
+ assertTrue("Adding mock control failed", mockControls.add(mockControl));
+ return mockControl;
+ }
+
+ /**
+ * Create and register a mock.
+ *
+ * Creates a mock and registers it in the list of created mocks, so it gets
+ * treated automatically upon {@code replay} and {@code verify};
+ * @param toMock The class to create a mock for.
+ * @return The mock instance.
+ */
+ protected final <T> T createMock(Class<T> toMock) {
+ return createMock(toMock, null);
+ }
+
+ /**
+ * Create a mock for a mock control and register a mock.
+ *
+ * Creates a mock and registers it in the list of created mocks, so it gets
+ * treated automatically upon {@code replay} and {@code verify};
+ * @param toMock The class to create a mock for.
+ * @param control The mock control to create the mock on. If null, do not use
+ * a specific control.
+ * @return The mock instance.
+ */
+ protected final <T> T createMock(Class<T> toMock, IMocksControl control) {
+ assertFalse("Mocks have already been set to replay", mocksReplayed);
+ final T mock;
+ if (control == null) {
+ if (usePowerMock) {
+ mock = PowerMock.createMock(toMock);
+ } else {
+ mock = EasyMock.createMock(toMock);
+ }
+ assertTrue("Adding " + toMock.getName() + " mock failed",
+ mocks.add(mock));
+ } else {
+ mock = control.createMock(toMock);
+ }
+ return mock;
+ }
+
+ /**
+ * Set all registered mocks to replay
+ */
+ protected final void replayMocks() {
+ assertFalse("Mocks have already been set to replay", mocksReplayed);
+ if (usePowerMock) {
+ PowerMock.replayAll();
+ } else {
+ EasyMock.replay(mocks.toArray());
+ }
+ for (IMocksControl mockControl : mockControls) {
+ mockControl.replay();
+ }
+ mocksReplayed = true;
+ }
+
+ /**
+ * Verify all registered mocks
+ *
+ * This method is called automatically at the end of a test. Nevertheless,
+ * it is safe to also call it beforehand, if this better meets the
+ * verification part of a test.
+ */
+ // As the PowerMock runner does not pass through runTest, we inject mock
+ // verification through @After
+ @After
+ public final void verifyMocks() {
+ if (!mocks.isEmpty() || !mockControls.isEmpty()) {
+ assertTrue("Created mocks have not been set to replay. Call replayMocks "
+ + "within the test", mocksReplayed);
+ if (usePowerMock) {
+ PowerMock.verifyAll();
+ } else {
+ EasyMock.verify(mocks.toArray());
+ }
+ for (IMocksControl mockControl : mockControls) {
+ mockControl.verify();
+ }
+ }
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ usePowerMock = false;
+ RunWith runWith = this.getClass().getAnnotation(RunWith.class);
+ if (runWith != null) {
+ usePowerMock = PowerMockRunner.class.isAssignableFrom(runWith.value());
+ }
+
+ mocks = new ArrayList<>();
+ mockControls = new ArrayList<>();
+ mocksReplayed = false;
+ }
+
+ @Override
+ protected void runTest() throws Throwable {
+ super.runTest();
+ // Plain JUnit runner does not pick up @After, so we add it here
+ // explicitly. Note, that we cannot put this into tearDown, as failure
+ // to verify mocks would bail out and might leave open resources from
+ // subclasses open.
+ verifyMocks();
+ }
+}
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/PassThroughKeyUtilEncoder.java
similarity index 63%
copy from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
copy to gerrit-server/src/test/java/com/google/gerrit/testutil/PassThroughKeyUtilEncoder.java
index 96e2ec8..e008b78 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/Die.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/PassThroughKeyUtilEncoder.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2009 The Android Open Source Project
+// Copyright (C) 2013 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,16 +12,18 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.gerrit.pgm.util;
+package com.google.gerrit.testutil;
-public class Die extends RuntimeException {
- private static final long serialVersionUID = 1L;
+import com.google.gwtorm.client.KeyUtil.Encoder;
- public Die(final String why) {
- super(why);
+public class PassThroughKeyUtilEncoder extends Encoder {
+ @Override
+ public String encode(String e) {
+ return e;
}
- public Die(final String why, final Throwable cause) {
- super(why, cause);
+ @Override
+ public String decode(String e) {
+ return e;
}
}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/SetMatcher.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/SetMatcher.java
new file mode 100644
index 0000000..f1e7b7b
--- /dev/null
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/SetMatcher.java
@@ -0,0 +1,55 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.testutil;
+
+import com.google.common.collect.Sets;
+
+import org.easymock.EasyMock;
+import org.easymock.IArgumentMatcher;
+
+import java.util.Set;
+
+/**
+ * Match for Iterables via set equals
+ *
+ * Converts both expected and actual parameter to a set and compares those two
+ * sets via equals to determine whether or not they match.
+ */
+public class SetMatcher<T> implements IArgumentMatcher {
+ public static <S extends Iterable<T>,T> S setEq(S expected) {
+ EasyMock.reportMatcher(new SetMatcher<>(expected));
+ return null;
+ }
+
+ Set<T> expected;
+
+ public SetMatcher(Iterable<T> expected) {
+ this.expected = Sets.newHashSet(expected);
+ }
+
+ @Override
+ public boolean matches(Object actual) {
+ if (actual instanceof Iterable<?>) {
+ Set<?> actualSet = Sets.newHashSet((Iterable<?>)actual);
+ return expected.equals(actualSet);
+ }
+ return false;
+ }
+
+ @Override
+ public void appendTo(StringBuffer buffer) {
+ buffer.append(expected);
+ }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/log/CollectionAppender.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/log/CollectionAppender.java
new file mode 100644
index 0000000..05f52c0
--- /dev/null
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/log/CollectionAppender.java
@@ -0,0 +1,58 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.testutil.log;
+
+import com.google.common.collect.Lists;
+
+import org.apache.log4j.AppenderSkeleton;
+import org.apache.log4j.spi.LoggingEvent;
+
+import java.util.Collection;
+import java.util.LinkedList;
+
+/**
+ * Log4j appender that logs into a list
+ */
+public class CollectionAppender extends AppenderSkeleton {
+ private Collection<LoggingEvent> events;
+
+ public CollectionAppender() {
+ events = new LinkedList<>();
+ }
+
+ public CollectionAppender(Collection<LoggingEvent> events) {
+ this.events = events;
+ }
+
+ @Override
+ public boolean requiresLayout() {
+ return false;
+ }
+
+ @Override
+ protected void append(LoggingEvent event) {
+ if (! events.add(event)) {
+ throw new RuntimeException("Could not append event " + event);
+ }
+ }
+
+ @Override
+ public void close() {
+ }
+
+ public Collection<LoggingEvent> getLoggedEvents() {
+ return Lists.newLinkedList(events);
+ }
+}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/log/LogUtil.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/log/LogUtil.java
new file mode 100644
index 0000000..e3c83ca
--- /dev/null
+++ b/gerrit-server/src/test/java/com/google/gerrit/testutil/log/LogUtil.java
@@ -0,0 +1,88 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.testutil.log;
+
+import org.apache.log4j.Appender;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.apache.log4j.spi.LoggingEvent;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.List;
+
+public class LogUtil {
+ /**
+ * Change logger's setting so it only logs to a collection.
+ *
+ * @param logName Name of the logger to modify.
+ * @param collection The collection to log into.
+ * @return The logger's original settings.
+ */
+ public static LoggerSettings logToCollection(String logName,
+ Collection<LoggingEvent> collection) {
+ Logger logger = LogManager.getLogger(logName);
+ LoggerSettings loggerSettings = new LoggerSettings(logger);
+ logger.removeAllAppenders();
+ logger.setAdditivity(false);
+ CollectionAppender listAppender = new CollectionAppender(collection);
+ logger.addAppender(listAppender);
+ return loggerSettings;
+ }
+
+ /**
+ * Capsule for a logger's settings that get mangled by rerouting logging to a collection
+ */
+ public static class LoggerSettings {
+ private final boolean additive;
+ private final List<Appender> appenders;
+
+ /**
+ * Read off logger settings from an instance.
+ *
+ * @param logger The logger to read the settings off from.
+ */
+ private LoggerSettings(Logger logger) {
+ this.additive = logger.getAdditivity();
+
+ Enumeration<?> appenders = logger.getAllAppenders();
+ this.appenders = new ArrayList<>();
+ while (appenders.hasMoreElements()) {
+ Object appender = appenders.nextElement();
+ if (appender instanceof Appender) {
+ this.appenders.add((Appender)appender);
+ } else {
+ throw new RuntimeException("getAllAppenders of " + logger
+ + " contained an object that is not an Appender");
+ }
+ }
+ }
+
+ /**
+ * Pushes this settings back onto a logger.
+ *
+ * @param logger the logger on which to push the settings.
+ */
+ public void pushOntoLogger(Logger logger) {
+ logger.setAdditivity(additive);
+
+ logger.removeAllAppenders();
+ for (Appender appender : appenders) {
+ logger.addAppender(appender);
+ }
+ }
+ }
+}
diff --git a/gerrit-sshd/BUCK b/gerrit-sshd/BUCK
index 4728c31..3028968 100644
--- a/gerrit-sshd/BUCK
+++ b/gerrit-sshd/BUCK
@@ -46,6 +46,7 @@
),
deps = [
':sshd',
+ '//gerrit-extension-api:api',
'//gerrit-server:server',
'//lib:guava',
'//lib:junit',
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CachingPublicKeyAuthenticator.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CachingPublicKeyAuthenticator.java
new file mode 100644
index 0000000..f315cff
--- /dev/null
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CachingPublicKeyAuthenticator.java
@@ -0,0 +1,72 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.sshd;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import org.apache.sshd.common.Session;
+import org.apache.sshd.common.SessionListener;
+import org.apache.sshd.server.PublickeyAuthenticator;
+import org.apache.sshd.server.session.ServerSession;
+
+import java.security.PublicKey;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Singleton
+public class CachingPublicKeyAuthenticator implements PublickeyAuthenticator,
+ SessionListener {
+
+ private final PublickeyAuthenticator authenticator;
+ private final Map<ServerSession, Map<PublicKey, Boolean>> sessionCache;
+
+ @Inject
+ public CachingPublicKeyAuthenticator(DatabasePubKeyAuth authenticator) {
+ this.authenticator = authenticator;
+ this.sessionCache = new ConcurrentHashMap<>();
+ }
+
+ @Override
+ public boolean authenticate(String username, PublicKey key,
+ ServerSession session) {
+ Map<PublicKey, Boolean> m = sessionCache.get(session);
+ if (m == null) {
+ m = new HashMap<>();
+ sessionCache.put(session, m);
+ session.addListener(this);
+ }
+ if (m.containsKey(key)) {
+ return m.get(key);
+ }
+ boolean r = authenticator.authenticate(username, key, session);
+ m.put(key, r);
+ return r;
+ }
+
+ @Override
+ public void sessionCreated(Session session) {
+ }
+
+ @Override
+ public void sessionEvent(Session sesssion, Event event) {
+ }
+
+ @Override
+ public void sessionClosed(Session session) {
+ sessionCache.remove(session);
+ }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java
index a2e6542..f394766 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandFactoryProvider.java
@@ -246,7 +246,7 @@
/** Split a command line into a string array. */
static public String[] split(String commandLine) {
- final List<String> list = new ArrayList<String>();
+ final List<String> list = new ArrayList<>();
boolean inquote = false;
boolean inDblQuote = false;
StringBuilder r = new StringBuilder();
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java
index 40e58f2..cc7b637 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DatabasePubKeyAuth.java
@@ -14,13 +14,13 @@
package com.google.gerrit.sshd;
+import com.google.common.base.Preconditions;
import com.google.gerrit.reviewdb.client.AccountSshKey;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.PeerDaemonUser;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
-import com.google.inject.Singleton;
import org.apache.commons.codec.binary.Base64;
import org.apache.sshd.common.KeyPairProvider;
@@ -48,7 +48,6 @@
/**
* Authenticates by public key through {@link AccountSshKey} entities.
*/
-@Singleton
class DatabasePubKeyAuth implements PublickeyAuthenticator {
private static final Logger log =
LoggerFactory.getLogger(DatabasePubKeyAuth.class);
@@ -78,7 +77,7 @@
}
private static Set<PublicKey> myHostKeys(KeyPairProvider p) {
- final Set<PublicKey> keys = new HashSet<PublicKey>(2);
+ final Set<PublicKey> keys = new HashSet<>(2);
addPublicKey(keys, p, KeyPairProvider.SSH_RSA);
addPublicKey(keys, p, KeyPairProvider.SSH_DSS);
return keys;
@@ -92,10 +91,11 @@
}
}
- public boolean authenticate(String username,
- final PublicKey suppliedKey, final ServerSession session) {
- final SshSession sd = session.getAttribute(SshSession.KEY);
-
+ @Override
+ public boolean authenticate(String username, PublicKey suppliedKey,
+ ServerSession session) {
+ SshSession sd = session.getAttribute(SshSession.KEY);
+ Preconditions.checkState(sd.getCurrentUser() == null);
if (PeerDaemonUser.USER_NAME.equals(username)) {
if (myHostKeys.contains(suppliedKey)
|| getPeerKeys().contains(suppliedKey)) {
@@ -112,10 +112,10 @@
username = username.toLowerCase(Locale.US);
}
- final Iterable<SshKeyCacheEntry> keyList = sshKeyCache.get(username);
- final SshKeyCacheEntry key = find(keyList, suppliedKey);
+ Iterable<SshKeyCacheEntry> keyList = sshKeyCache.get(username);
+ SshKeyCacheEntry key = find(keyList, suppliedKey);
if (key == null) {
- final String err;
+ String err;
if (keyList == SshKeyCacheImpl.NO_SUCH_USER) {
err = "user-not-found";
} else if (keyList == SshKeyCacheImpl.NO_KEYS) {
@@ -133,7 +133,7 @@
// security check to ensure there aren't two users sharing the same
// user name on the server.
//
- for (final SshKeyCacheEntry otherKey : keyList) {
+ for (SshKeyCacheEntry otherKey : keyList) {
if (!key.getAccount().equals(otherKey.getAccount())) {
sd.authenticationError(username, "keys-cross-accounts");
return false;
@@ -183,7 +183,7 @@
try {
final BufferedReader br = new BufferedReader(new FileReader(path));
try {
- final Set<PublicKey> keys = new HashSet<PublicKey>();
+ final Set<PublicKey> keys = new HashSet<>();
String line;
while ((line = br.readLine()) != null) {
line = line.trim();
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java
index fa5ab53..a7748ff 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.java
@@ -52,7 +52,7 @@
private String commandName;
@Argument(index = 1, multiValued = true, metaVar = "ARG")
- private List<String> args = new ArrayList<String>();
+ private List<String> args = new ArrayList<>();
@Inject
DispatchCommand(final Provider<CurrentUser> cu,
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java
index f901a77..241f853 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/HostKeyProvider.java
@@ -42,7 +42,7 @@
final File rsaKey = site.ssh_rsa;
final File dsaKey = site.ssh_dsa;
- final List<String> stdKeys = new ArrayList<String>(2);
+ final List<String> stdKeys = new ArrayList<>(2);
if (rsaKey.exists()) {
stdKeys.add(rsaKey.getAbsolutePath());
}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshDaemon.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshDaemon.java
index 92ab653..32c13b4 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshDaemon.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshDaemon.java
@@ -342,7 +342,7 @@
}
final List<PublicKey> keys = myHostKeys();
- final ArrayList<HostKey> r = new ArrayList<HostKey>();
+ final List<HostKey> r = new ArrayList<>();
for (final PublicKey pub : keys) {
final Buffer buf = new Buffer();
buf.putRawPublicKey(pub);
@@ -361,7 +361,7 @@
private List<PublicKey> myHostKeys() {
final KeyPairProvider p = getKeyPairProvider();
- final List<PublicKey> keys = new ArrayList<PublicKey>(2);
+ final List<PublicKey> keys = new ArrayList<>(2);
addPublicKey(keys, p, KeyPairProvider.SSH_RSA);
addPublicKey(keys, p, KeyPairProvider.SSH_DSS);
return keys;
@@ -401,7 +401,7 @@
@SuppressWarnings("unchecked")
private void initCiphers(final Config cfg) {
- final List<NamedFactory<Cipher>> a = new LinkedList<NamedFactory<Cipher>>();
+ final List<NamedFactory<Cipher>> a = new LinkedList<>();
a.add(new AES128CBC.Factory());
a.add(new TripleDESCBC.Factory());
a.add(new BlowfishCBC.Factory());
@@ -444,7 +444,7 @@
@SafeVarargs
private static <T> List<NamedFactory<T>> filter(final Config cfg,
final String key, final NamedFactory<T>... avail) {
- final ArrayList<NamedFactory<T>> def = new ArrayList<NamedFactory<T>>();
+ final ArrayList<NamedFactory<T>> def = new ArrayList<>();
for (final NamedFactory<T> n : avail) {
if (n == null) {
break;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java
index 0a1f708..2ec67a4 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshKeyCacheImpl.java
@@ -135,7 +135,7 @@
return NO_SUCH_USER;
}
- final List<SshKeyCacheEntry> kl = new ArrayList<SshKeyCacheEntry>(4);
+ final List<SshKeyCacheEntry> kl = new ArrayList<>(4);
for (AccountSshKey k : db.accountSshKeys().byAccount(
user.getAccountId())) {
if (k.isValid()) {
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshModule.java
index 50ab639..7dd12b0 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshModule.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshModule.java
@@ -81,7 +81,7 @@
bind(QueueProvider.class).to(CommandExecutorQueueProvider.class).in(SINGLETON);
bind(GSSAuthenticator.class).to(GerritGSSAuthenticator.class);
- bind(PublickeyAuthenticator.class).to(DatabasePubKeyAuth.class);
+ bind(PublickeyAuthenticator.class).to(CachingPublicKeyAuthenticator.class);
bind(ModuleGenerator.class).to(SshAutoRegisterModuleGenerator.class);
bind(SshPluginStarterCallback.class);
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshScope.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshScope.java
index 9067b9b..f8b5ddb 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshScope.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshScope.java
@@ -144,8 +144,7 @@
}
}
- private static final ThreadLocal<Context> current =
- new ThreadLocal<Context>();
+ private static final ThreadLocal<Context> current = new ThreadLocal<>();
private static Context requireContext() {
final Context ctx = current.get();
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshSession.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshSession.java
index 04bf603..2e3d113 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshSession.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshSession.java
@@ -26,8 +26,7 @@
/** Global data related to an active SSH connection. */
public class SshSession {
/** ServerSession attribute key for this object instance. */
- public static final AttributeKey<SshSession> KEY =
- new AttributeKey<SshSession>();
+ public static final AttributeKey<SshSession> KEY = new AttributeKey<>();
private final int sessionId;
private final SocketAddress remoteAddress;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java
index 298a099..77738d0 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SuExec.java
@@ -59,7 +59,7 @@
private SocketAddress peerAddress;
@Argument(index = 0, multiValued = true, metaVar = "COMMAND")
- private List<String> args = new ArrayList<String>();
+ private List<String> args = new ArrayList<>();
private final AtomicReference<Command> atomicCmd;
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 fa48084..d448bd2 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
@@ -20,6 +20,7 @@
import com.google.common.collect.Lists;
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.git.MetaDataUpdate;
@@ -27,7 +28,6 @@
import com.google.gerrit.server.project.ListChildProjects;
import com.google.gerrit.server.project.ProjectCache;
import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.ProjectJson.ProjectInfo;
import com.google.gerrit.server.project.ProjectResource;
import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.sshd.CommandMetaData;
@@ -63,11 +63,11 @@
@Option(name = "--exclude", metaVar = "NAME",
usage = "child project of old parent project which should not be reparented")
- private List<ProjectControl> excludedChildren = new ArrayList<ProjectControl>();
+ private List<ProjectControl> excludedChildren = new ArrayList<>();
@Argument(index = 0, required = false, multiValued = true, metaVar = "NAME",
usage = "projects to modify")
- private List<ProjectControl> children = new ArrayList<ProjectControl>();
+ private List<ProjectControl> children = new ArrayList<>();
@Inject
private ProjectCache projectCache;
@@ -95,7 +95,7 @@
}
final StringBuilder err = new StringBuilder();
- final Set<Project.NameKey> grandParents = new HashSet<Project.NameKey>();
+ final Set<Project.NameKey> grandParents = new HashSet<>();
grandParents.add(allProjectsName);
@@ -187,12 +187,12 @@
private List<Project.NameKey> getChildrenForReparenting(final ProjectControl parent) {
final List<Project.NameKey> childProjects = Lists.newArrayList();
final List<Project.NameKey> excluded =
- new ArrayList<Project.NameKey>(excludedChildren.size());
+ new ArrayList<>(excludedChildren.size());
for (final ProjectControl excludedChild : excludedChildren) {
excluded.add(excludedChild.getProject().getNameKey());
}
final List<Project.NameKey> automaticallyExcluded =
- new ArrayList<Project.NameKey>(excludedChildren.size());
+ new ArrayList<>(excludedChildren.size());
if (newParentKey != null) {
automaticallyExcluded.addAll(getAllParents(newParentKey));
}
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 1d4b900..da850ed 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
@@ -47,7 +47,7 @@
@Argument(index = 1, required = true, multiValued = true, metaVar = "COMMIT",
usage = "commit(s) that should be banned")
- private List<ObjectId> commitsToBan = new ArrayList<ObjectId>();
+ private List<ObjectId> commitsToBan = new ArrayList<>();
@Inject
private BanCommit.Factory banCommitFactory;
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 aef1560..aeb69d0 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
@@ -42,7 +42,7 @@
@CommandMetaData(name = "create-account", description = "Create a new batch/role account")
final class CreateAccountCommand extends SshCommand {
@Option(name = "--group", aliases = {"-g"}, metaVar = "GROUP", usage = "groups to add account to")
- private List<AccountGroup.Id> groups = new ArrayList<AccountGroup.Id>();
+ private List<AccountGroup.Id> groups = new ArrayList<>();
@Option(name = "--full-name", metaVar = "NAME", usage = "display name of the account")
private String fullName;
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 91996b1..75194dc 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
@@ -53,7 +53,7 @@
@Argument(index = 0, required = true, metaVar = "GROUP", usage = "name of group to be created")
private String groupName;
- private final Set<Account.Id> initialMembers = new HashSet<Account.Id>();
+ private final Set<Account.Id> initialMembers = new HashSet<>();
@Option(name = "--member", aliases = {"-m"}, metaVar = "USERNAME", usage = "initial set of users to become members of the group")
void addMember(final Account.Id id) {
@@ -63,7 +63,7 @@
@Option(name = "--visible-to-all", usage = "to make the group visible to all registered users")
private boolean visibleToAll;
- private final Set<AccountGroup.UUID> initialGroups = new HashSet<AccountGroup.UUID>();
+ private final Set<AccountGroup.UUID> initialGroups = new HashSet<>();
@Option(name = "--group", aliases = "-g", metaVar = "GROUP", usage = "initial set of groups to be included in the group")
void addGroup(final AccountGroup.UUID id) {
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 67d2738..14aa3ad 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
@@ -19,29 +19,26 @@
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.gerrit.common.data.GlobalCapability;
-import com.google.gerrit.common.errors.ProjectCreationFailedException;
import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.api.projects.ProjectInput;
+import com.google.gerrit.extensions.api.projects.ProjectInput.ConfigValue;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.extensions.restapi.TopLevelResource;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
-import com.google.gerrit.server.project.CreateProject;
import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.project.ProjectControl;
-import com.google.gerrit.server.project.PutConfig.ConfigValue;
import com.google.gerrit.server.project.SuggestParentCandidates;
import com.google.gerrit.sshd.CommandMetaData;
import com.google.gerrit.sshd.SshCommand;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
-import com.google.inject.Provider;
import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.Option;
-import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -135,7 +132,7 @@
}
@Inject
- private Provider<CreateProject.Factory> createProjectFactory;
+ private GerritApi gApi;
@Inject
private SuggestParentCandidates.Factory suggestParentCandidatesFactory;
@@ -148,7 +145,7 @@
throw new UnloggedFailure(1, "fatal: Project name is required.");
}
- CreateProject.Input input = new CreateProject.Input();
+ ProjectInput input = new ProjectInput();
input.name = projectName;
if (ownerIds != null) {
input.owners = Lists.transform(ownerIds,
@@ -176,8 +173,7 @@
input.pluginConfigValues = parsePluginConfigValues(pluginConfigValues);
}
- createProjectFactory.get().create(projectName)
- .apply(TopLevelResource.INSTANCE, input);
+ gApi.projects().name(projectName).create(input);
} else {
List<Project.NameKey> parentCandidates =
suggestParentCandidatesFactory.create().getNameKeys();
@@ -186,8 +182,7 @@
stdout.print(parent + "\n");
}
}
- } catch (RestApiException | ProjectCreationFailedException | IOException
- | NoSuchProjectException | OrmException err) {
+ } catch (RestApiException | OrmException | NoSuchProjectException err) {
throw new UnloggedFailure(1, "fatal: " + err.getMessage(), err);
}
}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/FlushCaches.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/FlushCaches.java
index 40152b0..1de4636 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/FlushCaches.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/FlushCaches.java
@@ -39,7 +39,7 @@
private static final String WEB_SESSIONS = "web_sessions";
@Option(name = "--cache", usage = "flush named cache", metaVar = "NAME")
- private List<String> caches = new ArrayList<String>();
+ private List<String> caches = new ArrayList<>();
@Option(name = "--all", usage = "flush all caches")
private boolean all;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java
index 821701d..a1099dc 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/GarbageCollectionCommand.java
@@ -51,7 +51,7 @@
@Argument(index = 0, required = false, multiValued = true, metaVar = "NAME",
usage = "projects for which the Git garbage collection should be run")
- private List<ProjectControl> projects = new ArrayList<ProjectControl>();
+ private List<ProjectControl> projects = new ArrayList<>();
@Inject
private ProjectCache projectCache;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/KillCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/KillCommand.java
index 83e88e5..d8c3403 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/KillCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/KillCommand.java
@@ -35,7 +35,7 @@
@Inject
private WorkQueue workQueue;
- private final Set<Integer> taskIds = new HashSet<Integer>();
+ private final Set<Integer> taskIds = new HashSet<>();
@Argument(index = 0, multiValued = true, required = true, metaVar = "ID")
void addTaskId(final String taskId) {
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java
index 77c5df4..39ec81f5 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/QueryShell.java
@@ -306,7 +306,7 @@
try {
ResultSet rs = meta.getIndexInfo(null, null, tableName, false, true);
try {
- Map<String, IndexInfo> indexes = new TreeMap<String, IndexInfo>();
+ Map<String, IndexInfo> indexes = new TreeMap<>();
while (rs.next()) {
final String indexName = rs.getString("INDEX_NAME");
IndexInfo def = indexes.get(indexName);
@@ -550,7 +550,7 @@
widths[c] = columnMap[c].name.length();
}
- final List<String[]> rows = new ArrayList<String[]>();
+ final List<String[]> rows = new ArrayList<>();
while (alreadyOnRow || rs.next()) {
final String[] row = new String[columnMap.length];
for (int c = 0; c < colCnt; c++) {
@@ -759,7 +759,7 @@
private static class IndexInfo {
String name;
boolean unique;
- final Map<Integer, String> columns = new TreeMap<Integer, String>();
+ final Map<Integer, String> columns = new TreeMap<>();
final StringBuilder filter = new StringBuilder();
void addColumn(int pos, String column) {
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java
index a3c2cf5..abb788d 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java
@@ -70,8 +70,8 @@
@Inject
private DynamicSet<PostReceiveHook> postReceiveHooks;
- private final Set<Account.Id> reviewerId = new HashSet<Account.Id>();
- private final Set<Account.Id> ccId = new HashSet<Account.Id>();
+ private final Set<Account.Id> reviewerId = new HashSet<>();
+ private final Set<Account.Id> ccId = new HashSet<>();
@Option(name = "--reviewer", aliases = {"--re"}, metaVar = "EMAIL", usage = "request reviewer for change(s)")
void addReviewer(final Account.Id id) {
@@ -158,7 +158,7 @@
Map<String, Ref> allRefs =
rp.getRepository().getRefDatabase().getRefs(RefDatabase.ALL);
- List<Ref> hidden = new ArrayList<Ref>();
+ List<Ref> hidden = new ArrayList<>();
for (Ref ref : allRefs.values()) {
if (!adv.containsKey(ref.getName())) {
hidden.add(ref);
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java
index e30d41b..107394b 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ReviewCommand.java
@@ -73,7 +73,7 @@
return parser;
}
- private final Set<PatchSet> patchSets = new HashSet<PatchSet>();
+ private final Set<PatchSet> patchSets = new HashSet<>();
@Argument(index = 0, required = true, multiValued = true, metaVar = "{COMMIT | CHANGE,PATCHSET}", usage = "list of commits or patch sets to review")
void addPatchSetId(final String token) {
@@ -282,7 +282,7 @@
patches = db.patchSets().byRevisionRange(id, id.max());
}
- final Set<PatchSet> matches = new HashSet<PatchSet>();
+ final Set<PatchSet> matches = new HashSet<>();
for (final PatchSet ps : patches) {
final Change change = db.changes().get(ps.getId().getParentKey());
if (inProject(change) && inBranch(change)) {
@@ -348,7 +348,7 @@
@Override
protected void parseCommandLine() throws UnloggedFailure {
- optionList = new ArrayList<ApproveOption>();
+ optionList = new ArrayList<>();
customLabels = Maps.newHashMap();
ProjectControl allProjectsControl;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java
index f3f35db..5088424 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetAccountCommand.java
@@ -71,16 +71,16 @@
private boolean inactive;
@Option(name = "--add-email", metaVar = "EMAIL", usage = "email addresses to add to the account")
- private List<String> addEmails = new ArrayList<String>();
+ private List<String> addEmails = new ArrayList<>();
@Option(name = "--delete-email", metaVar = "EMAIL", usage = "email addresses to delete from the account")
- private List<String> deleteEmails = new ArrayList<String>();
+ private List<String> deleteEmails = new ArrayList<>();
@Option(name = "--add-ssh-key", metaVar = "-|KEY", usage = "public keys to add to the account")
- private List<String> addSshKeys = new ArrayList<String>();
+ private List<String> addSshKeys = new ArrayList<>();
@Option(name = "--delete-ssh-key", metaVar = "-|KEY", usage = "public keys to delete from the account")
- private List<String> deleteSshKeys = new ArrayList<String>();
+ private List<String> deleteSshKeys = new ArrayList<>();
@Option(name = "--http-password", metaVar = "PASSWORD", usage = "password for HTTP authentication for the account")
private String httpPassword;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetProjectCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetProjectCommand.java
index e0c2a97..cc72e96 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetProjectCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetProjectCommand.java
@@ -16,10 +16,10 @@
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.extensions.annotations.RequiresCapability;
+import com.google.gerrit.extensions.api.projects.ProjectState;
+import com.google.gerrit.extensions.common.InheritableBoolean;
+import com.google.gerrit.extensions.common.SubmitType;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.InheritableBoolean;
-import com.google.gerrit.reviewdb.client.Project.State;
-import com.google.gerrit.reviewdb.client.Project.SubmitType;
import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gerrit.server.git.ProjectConfig;
import com.google.gerrit.server.project.ProjectCache;
@@ -106,7 +106,7 @@
}
@Option(name = "--project-state", aliases = {"--ps"}, usage = "project's visibility state")
- private State state;
+ private ProjectState state;
@Option(name = "--max-object-size-limit", usage = "max Git object size for this project")
private String maxObjectSizeLimit;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java
index 41d3e97..8ce935c 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/SetReviewersCommand.java
@@ -56,7 +56,7 @@
private ProjectControl projectControl;
@Option(name = "--add", aliases = {"-a"}, metaVar = "REVIEWER", usage = "user or group that should be added as reviewer")
- private List<String> toAdd = new ArrayList<String>();
+ private List<String> toAdd = new ArrayList<>();
@Option(name = "--remove", aliases = {"-r"}, metaVar = "REVIEWER", usage = "user that should be removed from the reviewer list")
void optionRemove(Account.Id who) {
@@ -92,8 +92,8 @@
@Inject
private ChangesCollection changesCollection;
- private Set<Account.Id> toRemove = new HashSet<Account.Id>();
- private Set<Change.Id> changes = new HashSet<Change.Id>();
+ private Set<Account.Id> toRemove = new HashSet<>();
+ private Set<Change.Id> changes = new HashSet<>();
@Override
protected void run() throws UnloggedFailure {
@@ -161,7 +161,7 @@
private Set<Change.Id> parseChangeId(String idstr)
throws UnloggedFailure, OrmException {
- Set<Change.Id> matched = new HashSet<Change.Id>(4);
+ Set<Change.Id> matched = new HashSet<>(4);
boolean isCommit = idstr.matches("^([0-9a-fA-F]{4," + RevId.LEN + "})$");
// By newer style changeKey?
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowConnections.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowConnections.java
index 17bea45..3d1ed3f 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowConnections.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ShowConnections.java
@@ -30,7 +30,9 @@
import org.apache.sshd.common.io.IoAcceptor;
import org.apache.sshd.common.io.IoSession;
+import org.apache.sshd.common.io.mina.MinaAcceptor;
import org.apache.sshd.common.io.mina.MinaSession;
+import org.apache.sshd.common.io.nio2.Nio2Acceptor;
import org.apache.sshd.server.Environment;
import org.apache.sshd.server.session.ServerSession;
import org.kohsuke.args4j.Option;
@@ -84,7 +86,7 @@
}
final List<IoSession> list =
- new ArrayList<IoSession>(acceptor.getManagedSessions().values());
+ new ArrayList<>(acceptor.getManagedSessions().values());
Collections.sort(list, new Comparator<IoSession>() {
@Override
public int compare(IoSession arg0, IoSession arg1) {
@@ -132,6 +134,20 @@
hostname(remoteAddress)));
}
stdout.print("--\n");
+ stdout.print("SSHD Backend: " + getBackend() + "\n");
+ }
+
+ private String getBackend() {
+ IoAcceptor acceptor = daemon.getIoAcceptor();
+ if (acceptor == null) {
+ return "";
+ } else if (acceptor instanceof MinaAcceptor) {
+ return "mina";
+ } else if (acceptor instanceof Nio2Acceptor) {
+ return "nio2";
+ } else {
+ return "unknown";
+ }
}
private static String id(final SshSession sd) {
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/StreamEvents.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/StreamEvents.java
index c55c7ed2..6da858a 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/StreamEvents.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/StreamEvents.java
@@ -59,7 +59,7 @@
/** Queue of events to stream to the connected user. */
private final LinkedBlockingQueue<ChangeEvent> queue =
- new LinkedBlockingQueue<ChangeEvent>(MAX_EVENTS);
+ new LinkedBlockingQueue<>(MAX_EVENTS);
private final Gson gson = new Gson();
diff --git a/gerrit-sshd/src/test/java/com/google/gerrit/sshd/commands/ProjectConfigParamParserTest.java b/gerrit-sshd/src/test/java/com/google/gerrit/sshd/commands/ProjectConfigParamParserTest.java
index a22bae2..4f48eea 100644
--- a/gerrit-sshd/src/test/java/com/google/gerrit/sshd/commands/ProjectConfigParamParserTest.java
+++ b/gerrit-sshd/src/test/java/com/google/gerrit/sshd/commands/ProjectConfigParamParserTest.java
@@ -14,11 +14,11 @@
package com.google.gerrit.sshd.commands;
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
-import com.google.gerrit.server.project.PutConfig.ConfigValue;
+import com.google.gerrit.extensions.api.projects.ProjectInput.ConfigValue;
import org.junit.Before;
import org.junit.Test;
diff --git a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java
index 7fc6d6f..c60c0d2 100644
--- a/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java
+++ b/gerrit-util-cli/src/main/java/com/google/gerrit/util/cli/CmdLineParser.java
@@ -131,7 +131,7 @@
out.write(name);
char next = '?';
- List<NamedOptionDef> booleans = new ArrayList<NamedOptionDef>();
+ List<NamedOptionDef> booleans = new ArrayList<>();
for (@SuppressWarnings("rawtypes") OptionHandler handler : parser.options) {
if (handler.option instanceof NamedOptionDef) {
NamedOptionDef n = (NamedOptionDef) handler.option;
diff --git a/gerrit-war/BUCK b/gerrit-war/BUCK
index cde128e..a96d095 100644
--- a/gerrit-war/BUCK
+++ b/gerrit-war/BUCK
@@ -33,7 +33,7 @@
genrule(
name = 'webapp_assets',
- cmd = 'cd $SRCDIR/src/main/webapp; zip -qr $OUT .',
+ cmd = 'cd src/main/webapp; zip -qr $OUT .',
srcs = glob(['src/main/webapp/**/*']),
deps = [],
out = 'webapp_assets.zip',
@@ -42,7 +42,7 @@
genrule(
name = 'log4j-config__jar',
- cmd = 'jar cf $OUT -C $SRCDIR/src/main/resources .',
+ cmd = 'jar cf $OUT -C src/main/resources .',
srcs = ['src/main/resources/log4j.properties'],
out = 'log4j-config.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 78d5fff..abc5ae3 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
@@ -201,7 +201,7 @@
}
private Injector createDbInjector() {
- final List<Module> modules = new ArrayList<Module>();
+ final List<Module> modules = new ArrayList<>();
if (sitePath != null) {
Module sitePathModule = new AbstractModule() {
@Override
@@ -249,7 +249,7 @@
}
private Injector createCfgInjector() {
- final List<Module> modules = new ArrayList<Module>();
+ final List<Module> modules = new ArrayList<>();
if (sitePath == null) {
// If we didn't get the site path from the system property
// we need to get it from the database, as that's our old
@@ -272,7 +272,7 @@
}
private Injector createSysInjector() {
- final List<Module> modules = new ArrayList<Module>();
+ final List<Module> modules = new ArrayList<>();
modules.add(new WorkQueue.Module());
modules.add(new ChangeHookRunner.Module());
modules.add(new ReceiveCommitsExecutorModule());
@@ -314,7 +314,7 @@
}
private Injector createSshInjector() {
- final List<Module> modules = new ArrayList<Module>();
+ final List<Module> modules = new ArrayList<>();
modules.add(sysInjector.getInstance(SshModule.class));
modules.add(new SshHostKeyModule());
modules.add(new DefaultCommandModule(false));
@@ -322,7 +322,7 @@
}
private Injector createWebInjector() {
- final List<Module> modules = new ArrayList<Module>();
+ final List<Module> modules = new ArrayList<>();
modules.add(RequestContextFilter.module());
modules.add(AllRequestFilter.module());
modules.add(sysInjector.getInstance(GitOverHttpModule.class));
diff --git a/lib/BUCK b/lib/BUCK
index 290ed92..a6a10e7 100644
--- a/lib/BUCK
+++ b/lib/BUCK
@@ -25,9 +25,9 @@
maven_jar(
name = 'gwtorm',
- id = 'gwtorm:gwtorm:1.8',
- bin_sha1 = '0ec006f69f7b8aa48e22d4bdecea820fd53c0b4b',
- src_sha1 = 'b0e347a3053328f029c93ac347a4761a98293073',
+ id = 'gwtorm:gwtorm:1.9',
+ bin_sha1 = 'b03fbe78546788504a326dc6fbf94b93b6d8685e',
+ src_sha1 = '1657bfdb8e9d3d5fa0ae63f38274c3469189ab53',
license = 'Apache2.0',
deps = [':protobuf'],
repository = GERRIT,
@@ -107,15 +107,15 @@
maven_jar(
name = 'jsch',
- id = 'com.jcraft:jsch:0.1.50',
- sha1 = 'fae4a0b1f2a96cb8f58f38da2650814c991cea01',
+ id = 'com.jcraft:jsch:0.1.51',
+ sha1 = '6ceee2696b07cc320d0e1aaea82c7b40768aca0f',
license = 'jsch',
)
maven_jar(
name = 'servlet-api-3_1',
- id = 'org.apache.tomcat:tomcat-servlet-api:8.0.0-RC10',
- sha1 = '975935b6203073938dfeeb28e4effc3b094c4fc4',
+ id = 'org.apache.tomcat:tomcat-servlet-api:8.0.5',
+ sha1 = '9ef01afc25481b82aa8f3615db536869f2dc961e',
license = 'Apache2.0',
exclude = ['META-INF/NOTICE', 'META-INF/LICENSE'],
)
@@ -258,3 +258,80 @@
attach_source = False,
visibility = ['//lib/jgit:jgit-archive'],
)
+
+maven_jar(
+ name = 'powermock-module-junit4',
+ id = 'org.powermock:powermock-module-junit4:1.5',
+ sha1 = '9f6f8d0485249171f9d870e2b269048fa8cad43b',
+ license = 'DO_NOT_DISTRIBUTE',
+ deps = [
+ ':junit',
+ ':powermock-module-junit4-common',
+ ],
+)
+
+maven_jar(
+ name = 'powermock-module-junit4-common',
+ id = 'org.powermock:powermock-module-junit4-common:1.5',
+ sha1 = '43db4720ff57af42a1bd5c73fb5cdfebeebd564c',
+ license = 'DO_NOT_DISTRIBUTE',
+ deps = [
+ ':junit',
+ ':powermock-reflect',
+ ],
+)
+
+maven_jar(
+ name = 'powermock-reflect',
+ id = 'org.powermock:powermock-reflect:1.5',
+ sha1 = '8df1548eeabb8492ba97d4f3eb84ae4d5f69215e',
+ license = 'DO_NOT_DISTRIBUTE',
+ deps = [
+ ':junit',
+ ':objenesis',
+ ],
+)
+
+maven_jar(
+ name = 'powermock-api-easymock',
+ id = 'org.powermock:powermock-api-easymock:1.5',
+ sha1 = 'a485b570b9debb46b53459a8e866a40343b2cfe2',
+ license = 'DO_NOT_DISTRIBUTE',
+ deps = [
+ ':easymock',
+ ':powermock-api-support',
+ ],
+)
+
+maven_jar(
+ name = 'powermock-api-support',
+ id = 'org.powermock:powermock-api-support:1.5',
+ sha1 = '7c1b2e4555cfa333aec201c4612345c092820a38',
+ license = 'DO_NOT_DISTRIBUTE',
+ deps = [
+ ':junit',
+ ':powermock-core',
+ ':powermock-reflect',
+ ],
+)
+
+maven_jar(
+ name = 'powermock-core',
+ id = 'org.powermock:powermock-core:1.5',
+ sha1 = '4415337ff3fdb7ceb484f11fd08e39711e408976',
+ license = 'DO_NOT_DISTRIBUTE',
+ deps = [
+ ':junit',
+ ':powermock-reflect',
+ ':javassist-3.17.1-GA',
+ ],
+)
+
+maven_jar(
+ name = 'javassist-3.17.1-GA',
+ # The GWT version is still at 3.16.1-GA, so those do not match
+ id = 'org.javassist:javassist:3.17.1-GA',
+ sha1 = '30c30512115866b6e0123f1913bc7735b9f76d08',
+ license = 'DO_NOT_DISTRIBUTE',
+)
+
diff --git a/lib/asciidoctor/java/AsciiDoctor.java b/lib/asciidoctor/java/AsciiDoctor.java
index 933b929..9e48641 100644
--- a/lib/asciidoctor/java/AsciiDoctor.java
+++ b/lib/asciidoctor/java/AsciiDoctor.java
@@ -58,10 +58,10 @@
@Option(name = "-a", usage =
"a list of attributes, in the form key or key=value pair")
- private List<String> attributes = new ArrayList<String>();
+ private List<String> attributes = new ArrayList<>();
@Argument(usage = "input files")
- private List<String> inputFiles = new ArrayList<String>();
+ private List<String> inputFiles = new ArrayList<>();
public static String mapInFileToOutFile(
String inFile, String inExt, String outExt) {
@@ -97,7 +97,7 @@
}
private Map<String, Object> getAttributes() {
- Map<String, Object> attributeValues = new HashMap<String, Object>();
+ Map<String, Object> attributeValues = new HashMap<>();
for (String attribute : attributes) {
int equalsIndex = attribute.indexOf('=');
diff --git a/lib/asciidoctor/java/DocIndexer.java b/lib/asciidoctor/java/DocIndexer.java
index 0cb785c..45cad3d 100644
--- a/lib/asciidoctor/java/DocIndexer.java
+++ b/lib/asciidoctor/java/DocIndexer.java
@@ -51,7 +51,7 @@
import java.util.zip.ZipOutputStream;
public class DocIndexer {
- private static final Version LUCENE_VERSION = Version.LUCENE_46;
+ private static final Version LUCENE_VERSION = Version.LUCENE_47;
private static final Pattern SECTION_HEADER = Pattern.compile("^=+ (.*)");
@Option(name = "-o", usage = "output JAR file")
@@ -67,7 +67,7 @@
private String outExt = ".html";
@Argument(usage = "input files")
- private List<String> inputFiles = new ArrayList<String>();
+ private List<String> inputFiles = new ArrayList<>();
private void invoke(String... parameters) throws IOException {
CmdLineParser parser = new CmdLineParser(this);
@@ -104,6 +104,9 @@
IndexWriter iwriter = new IndexWriter(directory, config);
for (String inputFile : inputFiles) {
File file = new File(inputFile);
+ if (file.length() == 0) {
+ continue;
+ }
BufferedReader titleReader = new BufferedReader(
new InputStreamReader(new FileInputStream(file), "UTF-8"));
diff --git a/lib/codemirror/BUCK b/lib/codemirror/BUCK
index 1ba2d92..ea6e2a1 100644
--- a/lib/codemirror/BUCK
+++ b/lib/codemirror/BUCK
@@ -13,10 +13,10 @@
cmd = ';'.join([
':>$OUT',
"echo '/** @license' >>$OUT",
- 'unzip -p $SRCDIR/%s %s/LICENSE >>$OUT' % (ZIP, TOP),
+ 'unzip -p %s %s/LICENSE >>$OUT' % (ZIP, TOP),
"echo '*/' >>$OUT",
] +
- ['unzip -p $SRCDIR/%s %s/%s >>$OUT' % (ZIP, TOP, n)
+ ['unzip -p %s %s/%s >>$OUT' % (ZIP, TOP, n)
for n in CM3_CSS + CM3_THEMES]
),
srcs = [genfile(ZIP)],
@@ -30,10 +30,10 @@
cmd = ';'.join([
':>$OUT',
"echo '/** @license' >>$OUT",
- 'unzip -p $SRCDIR/%s %s/LICENSE >>$OUT' % (ZIP, TOP),
+ 'unzip -p %s %s/LICENSE >>$OUT' % (ZIP, TOP),
"echo '*/' >>$OUT",
] +
- ['unzip -p $SRCDIR/%s %s/%s >>$OUT' % (ZIP, TOP, n)
+ ['unzip -p %s %s/%s >>$OUT' % (ZIP, TOP, n)
for n in CM3_JS]
),
srcs = [genfile(ZIP)],
diff --git a/lib/codemirror/cm3.defs b/lib/codemirror/cm3.defs
index 9679b1b..84f09c3 100644
--- a/lib/codemirror/cm3.defs
+++ b/lib/codemirror/cm3.defs
@@ -25,18 +25,36 @@
CM3_MODES = [
'clike/clike.js',
'clojure/clojure.js',
+ 'coffeescript/coffeescript.js',
'commonlisp/commonlisp.js',
'css/css.js',
+ 'd/d.js',
+ 'diff/diff.js',
+ 'dtd/dtd.js',
+ 'erlang/erlang.js',
+ 'gas/gas.js',
+ 'gfm/gfm.js',
'go/go.js',
'groovy/groovy.js',
+ 'haskell/haskell.js',
'htmlmixed/htmlmixed.js',
'javascript/javascript.js',
+ 'lua/lua.js',
+ 'markdown/markdown.js',
'perl/perl.js',
+ 'php/php.js',
+ 'pig/pig.js',
'properties/properties.js',
'python/python.js',
+ 'r/r.js',
'ruby/ruby.js',
+ 'scheme/scheme.js',
'shell/shell.js',
+ 'smalltalk/smalltalk.js',
'sql/sql.js',
+ 'tcl/tcl.js',
'velocity/velocity.js',
+ 'verilog/verilog.js',
'xml/xml.js',
+ 'yaml/yaml.js',
]
diff --git a/lib/jetty/BUCK b/lib/jetty/BUCK
index 9637598..a6fc4a7 100644
--- a/lib/jetty/BUCK
+++ b/lib/jetty/BUCK
@@ -60,6 +60,18 @@
)
maven_jar(
+ name = 'jmx',
+ id = 'org.eclipse.jetty:jetty-jmx:' + VERSION,
+ sha1 = 'eb1492a8c6362410f84c97907b2ffb94c4dfcc2f',
+ license = 'Apache2.0',
+ exported_deps = [
+ ':continuation',
+ ':http',
+ ],
+ exclude = EXCLUDE,
+)
+
+maven_jar(
name = 'continuation',
id = 'org.eclipse.jetty:jetty-continuation:' + VERSION,
sha1 = '5751f7ea38488dd32180bd3273f7f8591928aee3',
diff --git a/lib/jgit/BUCK b/lib/jgit/BUCK
index 80924d9..85d6d77 100644
--- a/lib/jgit/BUCK
+++ b/lib/jgit/BUCK
@@ -1,13 +1,13 @@
include_defs('//lib/maven.defs')
-REPO = MAVEN_CENTRAL
-VERS = '3.3.0.201403021825-r'
+REPO = GERRIT
+VERS = '3.3.1.201403241930-r.80-gd5110c3'
maven_jar(
name = 'jgit',
id = 'org.eclipse.jgit:org.eclipse.jgit:' + VERS,
- bin_sha1 = '01aa346a5040bd541502dfb40e83edb1d1981c67',
- src_sha1 = 'c27cc089751cc90dbe085ef09dd0c4a2acdb69cf',
+ bin_sha1 = 'fe38387f8a5079d660aad075cc80cfa39d269c38',
+ src_sha1 = '37196e15fa8e348c5073f7469da294e5285f05d9',
license = 'jgit',
repository = REPO,
unsign = True,
@@ -22,7 +22,7 @@
maven_jar(
name = 'jgit-servlet',
id = 'org.eclipse.jgit:org.eclipse.jgit.http.server:' + VERS,
- sha1 = 'e141488647b80ef25d8d3febffd434a5e2a0a817',
+ sha1 = 'f0d8a1e8abca55a5723fbd595dd63992f16dea5a',
license = 'jgit',
repository = REPO,
deps = [':jgit'],
@@ -36,7 +36,7 @@
maven_jar(
name = 'jgit-archive',
id = 'org.eclipse.jgit:org.eclipse.jgit.archive:' + VERS,
- sha1 = '87b2b50eb6e7a18a70fd684cc173f3bd2d8e24e8',
+ sha1 = 'e2938053672294e05ee540dcdb7fe57b4b7d6303',
license = 'jgit',
repository = REPO,
deps = [':jgit',
@@ -53,7 +53,7 @@
maven_jar(
name = 'junit',
id = 'org.eclipse.jgit:org.eclipse.jgit.junit:' + VERS,
- sha1 = '13d0303a669bc2c44db69f8581e3634412b70eed',
+ sha1 = 'd9806c9bc9dac5c8f12f5c5b2b48f390c992ce32',
license = 'DO_NOT_DISTRIBUTE',
repository = REPO,
unsign = True,
diff --git a/lib/log/BUCK b/lib/log/BUCK
index 2659fcd..e02d909 100644
--- a/lib/log/BUCK
+++ b/lib/log/BUCK
@@ -1,31 +1,33 @@
include_defs('//lib/maven.defs')
+VER = '1.7.6'
+
maven_jar(
name = 'api',
- id = 'org.slf4j:slf4j-api:1.6.1',
- sha1 = '6f3b8a24bf970f17289b234284c94f43eb42f0e4',
+ id = 'org.slf4j:slf4j-api:' + VER,
+ sha1 = '562424e36df3d2327e8e9301a76027fca17d54ea',
license = 'slf4j',
)
maven_jar(
name = 'impl_log4j',
- id = 'org.slf4j:slf4j-log4j12:1.6.1',
- sha1 = 'bd245d6746cdd4e6203e976e21d597a46f115802',
+ id = 'org.slf4j:slf4j-log4j12:' + VER,
+ sha1 = '6953717b9850aeb26d1b8375ca07dbd9c50eca4e',
license = 'slf4j',
deps = [':log4j'],
)
maven_jar(
- name = 'log4j',
- id = 'log4j:log4j:1.2.16',
- sha1 = '7999a63bfccbc7c247a9aea10d83d4272bd492c6',
- license = 'Apache2.0',
- exclude = ['META-INF/LICENSE', 'META-INF/NOTICE'],
+ name = 'jcl-over-slf4j',
+ id = 'org.slf4j:jcl-over-slf4j:' + VER,
+ sha1 = 'ab1648fe1dd6f1e5c2ec6d12f394672bb8c1036a',
+ license = 'slf4j',
)
maven_jar(
- name = 'jcl-over-slf4j',
- id = 'org.slf4j:jcl-over-slf4j:1.6.1',
- sha1 = '99c61095a14dfc9e47a086068033c286bf236475',
- license = 'slf4j',
+ name = 'log4j',
+ id = 'log4j:log4j:1.2.17',
+ sha1 = '5af35056b4d257e4b64b9e8069c0746e8b08629f',
+ license = 'Apache2.0',
+ exclude = ['META-INF/LICENSE', 'META-INF/NOTICE'],
)
diff --git a/lib/lucene/BUCK b/lib/lucene/BUCK
index 450a88a..a56b5ab 100644
--- a/lib/lucene/BUCK
+++ b/lib/lucene/BUCK
@@ -1,12 +1,11 @@
include_defs('//lib/maven.defs')
-VERSION = '4.6.0'
+VERSION = '4.7.0'
maven_jar(
name = 'core',
id = 'org.apache.lucene:lucene-core:' + VERSION,
- bin_sha1 = 'f1d974facaea30a3a0c1752a24097af5a7d40e60',
- src_sha1 = '19d4eb5def4bc2517a00b50f7a875b7ce33988a7',
+ sha1 = '12d2b92d15158ac0d7b2864f537403acb4d7f69e',
license = 'Apache2.0',
exclude = [
'META-INF/LICENSE.txt',
@@ -17,8 +16,7 @@
maven_jar(
name = 'analyzers-common',
id = 'org.apache.lucene:lucene-analyzers-common:' + VERSION,
- bin_sha1 = '25dda6706bcb7a741f25f57cdbec6c2f36adc557',
- src_sha1 = '04866d0e36e3ef708d099014752ad4fef61d4243',
+ sha1 = '399fa6b0d750c8e5c9e4ae73e6407c8b3ed4e8c1',
license = 'Apache2.0',
exclude = [
'META-INF/LICENSE.txt',
@@ -29,7 +27,6 @@
maven_jar(
name = 'query-parser',
id = 'org.apache.lucene:lucene-queryparser:' + VERSION,
- bin_sha1 = 'ef35f1eb55e50725777162e376e7b5222f45f7fa',
- src_sha1 = 'e99e3b298e83461c03ef6eb66ab9798a4b712dc6',
+ sha1 = 'f78a804de1582c511224d214c2d9c82ce48379e7',
license = 'Apache2.0',
)
diff --git a/lib/maven.defs b/lib/maven.defs
index b874d8e..0ac5005 100644
--- a/lib/maven.defs
+++ b/lib/maven.defs
@@ -48,11 +48,17 @@
raise NameError('expected id="groupId:artifactId:version"')
group, artifact, version = parts
- jar = path.join(name, artifact.lower() + '-' + version)
+ if 'SNAPSHOT' in version and repository.startswith(GERRIT):
+ file_version = version.replace('-SNAPSHOT', '')
+ version = version.split('-SNAPSHOT')[0] + '-SNAPSHOT'
+ else:
+ file_version = version
+
+ jar = path.join(name, artifact.lower() + '-' + file_version)
url = '/'.join([
repository,
group.replace('.', '/'), artifact, version,
- artifact + '-' + version])
+ artifact + '-' + file_version])
binjar = jar + '.jar'
binurl = url + '.jar'
@@ -104,10 +110,11 @@
out = '__' + name + '__no_src',
)
+ srcdep = [':' + name + '__download_src'] if srcjar else []
if exported_deps:
prebuilt_jar(
name = name + '__jar',
- deps = deps + license + [':' + name + '__download_bin'],
+ deps = deps + srcdep + license + [':' + name + '__download_bin'],
binary_jar = genfile(binjar),
source_jar = genfile(srcjar) if srcjar else None,
)
@@ -119,7 +126,7 @@
else:
prebuilt_jar(
name = name,
- deps = deps + license + [':' + name + '__download_bin'],
+ deps = deps + srcdep + license + [':' + name + '__download_bin'],
binary_jar = genfile(binjar),
source_jar = genfile(srcjar) if srcjar else None,
visibility = visibility,
diff --git a/lib/prolog/prolog.defs b/lib/prolog/prolog.defs
index b91e2de..62e4c6d 100644
--- a/lib/prolog/prolog.defs
+++ b/lib/prolog/prolog.defs
@@ -19,7 +19,7 @@
visibility = []):
genrule(
name = name + '__pl2j',
- cmd = 'cd $SRCDIR;$(exe //lib/prolog:compiler)' +
+ cmd = '$(exe //lib/prolog:compiler)' +
' $TMP $OUT ' +
' '.join(srcs),
srcs = srcs,
diff --git a/plugins/cookbook-plugin b/plugins/cookbook-plugin
index dda1b78..f95eb05 160000
--- a/plugins/cookbook-plugin
+++ b/plugins/cookbook-plugin
@@ -1 +1 @@
-Subproject commit dda1b787dba031597b83db1eb3c1b57565059b68
+Subproject commit f95eb05f758fc62726b2938b26f0e6b3f023d02b
diff --git a/plugins/reviewnotes b/plugins/reviewnotes
index b544447..6170241 160000
--- a/plugins/reviewnotes
+++ b/plugins/reviewnotes
@@ -1 +1 @@
-Subproject commit b544447649d9ee3b3f78a6a1a7f839cb6a361292
+Subproject commit 61702414c046dd6b811c9137b765f9db422f83db
diff --git a/tools/buck.defs b/tools/buck.defs
deleted file mode 100644
index 8bcacc3..0000000
--- a/tools/buck.defs
+++ /dev/null
@@ -1,65 +0,0 @@
-# Copyright (C) 2013 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-original_java_library = java_library
-def java_library(
- name,
- srcs=[],
- resources=[],
- source='7',
- target='7',
- proguard_config=None,
- deps=[],
- exported_deps=[],
- visibility=[],
- ):
- original_java_library(
- name=name,
- srcs=srcs,
- resources=resources,
- source=source,
- target=target,
- proguard_config=proguard_config,
- deps=deps,
- exported_deps=exported_deps,
- visibility=visibility,
- )
-
-original_java_test = java_test
-def java_test(
- name,
- srcs=[],
- labels=[],
- resources=[],
- source='7',
- target='7',
- vm_args=[],
- source_under_test=[],
- contacts=[],
- deps=[],
- visibility=[],
- ):
- original_java_test(
- name=name,
- srcs=srcs,
- labels=labels,
- resources=resources,
- source=source,
- target=target,
- vm_args=vm_args,
- source_under_test=source_under_test,
- contacts=contacts,
- deps=deps,
- visibility=visibility,
- )
diff --git a/tools/default.defs b/tools/default.defs
index be31b85..fcc8d99 100644
--- a/tools/default.defs
+++ b/tools/default.defs
@@ -14,7 +14,6 @@
# Rule definitions loaded by default into every BUCK file.
-include_defs('//tools/buck.defs')
include_defs('//tools/gwt-constants.defs')
def genantlr(
@@ -225,11 +224,17 @@
paths,
srcs = [],
deps = [],
- visibility = []
+ visibility = [],
+ do_it_wrong = False,
):
+ if do_it_wrong:
+ sourcepath = paths
+ else:
+ sourcepath = ['$SRCDIR/' + n for n in paths]
genrule(
name = name,
cmd = ' '.join([
+ 'while ! test -f .buckconfig; do cd ..; done;',
'javadoc',
'-quiet',
'-protected',
@@ -240,7 +245,7 @@
'-link http://docs.oracle.com/javase/7/docs/api',
'-subpackages ' + pkg,
'-sourcepath ',
- ':'.join([n for n in paths]),
+ ':'.join(sourcepath),
' -classpath ',
':'.join(['$(location %s)' % n for n in deps]),
'-d $TMP',
diff --git a/tools/download_file.py b/tools/download_file.py
index 3e6fca9..d4ddf1c 100755
--- a/tools/download_file.py
+++ b/tools/download_file.py
@@ -77,7 +77,7 @@
if args.v:
h = args.v
else:
- h = sha1(args.u).hexdigest()
+ h = sha1(args.u.encode('utf-8')).hexdigest()
name = '%s-%s' % (path.basename(args.o), h)
return path.join(CACHE_DIR, name)
diff --git a/tools/eclipse/BUCK b/tools/eclipse/BUCK
index 81889f2..ca92f50 100644
--- a/tools/eclipse/BUCK
+++ b/tools/eclipse/BUCK
@@ -12,6 +12,7 @@
'//gerrit-patch-jgit:jgit_patch_tests',
'//gerrit-plugin-gwtui:gwtui-api',
'//gerrit-server:server__compile',
+ '//gerrit-server:server_tests',
'//lib/asciidoctor:asciidoc_lib',
'//lib/asciidoctor:doc_indexer_lib',
'//lib/jetty:webapp',
diff --git a/tools/pack_war.py b/tools/pack_war.py
index 6c71d81..09ff054 100755
--- a/tools/pack_war.py
+++ b/tools/pack_war.py
@@ -15,7 +15,7 @@
from __future__ import print_function
from optparse import OptionParser
-from os import makedirs, path, symlink
+from os import getcwd, chdir, makedirs, path, symlink
from subprocess import check_call
import sys
from util import check_output
@@ -33,6 +33,8 @@
def link_jars(libs, directory):
makedirs(directory)
+ while not path.isfile('.buckconfig'):
+ chdir('..')
cp = check_output(['buck', 'audit', 'classpath'] + libs)
for j in cp.strip().splitlines():
if j not in jars:
diff --git a/tools/version.py b/tools/version.py
index 60489c8..cb7274d 100755
--- a/tools/version.py
+++ b/tools/version.py
@@ -30,8 +30,9 @@
new_version = args[0]
pattern = re.compile(r'(\s*)<version>[-.\w]+</version>')
-for project in ['gerrit-plugin-archetype', 'gerrit-plugin-gwt-archetype',
- 'gerrit-plugin-gwtui', 'gerrit-plugin-js-archetype']:
+for project in ['gerrit-plugin-archetype',
+ 'gerrit-plugin-gwt-archetype',
+ 'gerrit-plugin-js-archetype']:
pom = os.path.join(project, 'pom.xml')
try:
outxml = ""