Merge branch 'stable-2.8' * stable-2.8: SideBySide2: Revise SkipBar and disable horizontal scroll on LineWidgets Update CodeMirror3
diff --git a/.gitmodules b/.gitmodules index 6476c4c..d75c98c 100644 --- a/.gitmodules +++ b/.gitmodules
@@ -18,3 +18,6 @@ path = plugins/reviewnotes url = ../plugins/reviewnotes +[submodule "plugins/singleusergroup"] + path = plugins/singleusergroup + url = ../plugins/singleusergroup
diff --git a/BUCK b/BUCK index 616a0fe..c78bc2c 100644 --- a/BUCK +++ b/BUCK
@@ -3,14 +3,16 @@ gerrit_war(name = 'gerrit') gerrit_war(name = 'chrome', ui = 'ui_chrome') gerrit_war(name = 'firefox', ui = 'ui_firefox') -gerrit_war(name = 'withdocs', context = DOCS) -gerrit_war(name = 'release', context = DOCS + ['//plugins:core.zip']) +gerrit_war(name = 'withdocs', docs = True) +gerrit_war(name = 'release', docs = True, context = ['//plugins:core.zip']) API_DEPS = [ ':extension-api', ':extension-api-src', ':plugin-api', ':plugin-api-src', + ':plugin-gwtui', + ':plugin-gwtui-src', ] genrule( @@ -76,3 +78,19 @@ ] + [d + '-src' for d in PLUGIN_API], visibility = ['//tools/maven:'], ) + +genrule( + name = 'plugin-gwtui', + cmd = 'ln -s $(location //gerrit-plugin-gwtui:client) $OUT', + deps = ['//gerrit-plugin-gwtui:client'], + out = 'plugin-gwtui.jar', + visibility = ['//tools/maven:'], +) + +genrule( + name = 'plugin-gwtui-src', + cmd = 'ln -s $(location //gerrit-plugin-gwtui:src) $OUT', + deps = ['//gerrit-plugin-gwtui:src'], + out = 'plugin-gwtui-src.jar', + visibility = ['//tools/maven:'], +)
diff --git a/Documentation/BUCK b/Documentation/BUCK index 71d8664..b2b7d2a 100644 --- a/Documentation/BUCK +++ b/Documentation/BUCK
@@ -3,7 +3,6 @@ include_defs('//tools/git.defs') DOC_DIR = 'Documentation' -INDEX_DIR = DOC_DIR + '/.index' MAIN = ['//gerrit-pgm:pgm', '//gerrit-gwtui:ui_module'] SRCS = glob(['*.txt'], excludes = ['licenses.txt']) @@ -11,12 +10,10 @@ name = 'html', cmd = 'cd $TMP;' + 'mkdir -p %s/images;' % DOC_DIR + - 'unzip -q $SRCDIR/index.zip -d %s/;' % INDEX_DIR + 'unzip -q $SRCDIR/only_html.zip -d %s/;' % DOC_DIR + 'for s in $SRCS;do ln -s $s %s;done;' % DOC_DIR + 'mv %s/*.{jpg,png} %s/images;' % (DOC_DIR, DOC_DIR) + 'rm %s/only_html.zip;' % DOC_DIR + - 'rm %s/index.zip;' % DOC_DIR + 'rm %s/licenses.txt;' % DOC_DIR + 'cp $SRCDIR/licenses.txt LICENSES.txt;' + 'zip -qr $OUT *', @@ -27,11 +24,9 @@ 'doc.css', genfile('licenses.txt'), genfile('only_html.zip'), - genfile('index.zip'), ], deps = [ ':generate_html', - ':index', ':licenses.txt', ], out = 'html.zip', @@ -79,3 +74,18 @@ ], out = 'index.zip', ) + +genrule( + name = 'index_jar', + cmd = 'jar cf $OUT -C $SRCDIR index.zip', + srcs = [genfile('index.zip')], + deps = [':index'], + out = 'index.jar', +) + +prebuilt_jar( + name = 'index_lib', + binary_jar = genfile('index.jar'), + deps = [':index_jar'], + visibility = ['PUBLIC'], +)
diff --git a/Documentation/access-control.txt b/Documentation/access-control.txt index 189316c..f8d4308 100644 --- a/Documentation/access-control.txt +++ b/Documentation/access-control.txt
@@ -425,7 +425,7 @@ [[category_create]] -Create reference +Create Reference ~~~~~~~~~~~~~~~~ The create reference category controls whether it is possible to @@ -1340,3 +1340,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-apropos.txt b/Documentation/cmd-apropos.txt new file mode 100644 index 0000000..29ce9fa --- /dev/null +++ b/Documentation/cmd-apropos.txt
@@ -0,0 +1,66 @@ +gerrit apropos +============== + +NAME +---- +gerrit apropos - Search Gerrit documentation index + +SYNOPSIS +-------- +[verse] +'ssh' -p <port> <host> 'gerrit apropos' + <query> + +DESCRIPTION +----------- +Queries the documentation index and returns results with the title and URL +from the matched documents. + +ACCESS +------ +Any user who has configured an SSH key. + +SCRIPTING +--------- +This command is intended to be used in scripts. + +Note: this feature is only available if documentation index was built. + +EXAMPLES +-------- + +===== +$ ssh -p 29418 review.example.com gerrit apropos capabilities + Gerrit Code Review - /config/ REST API: + http://localhost:8080/Documentation/rest-api-config.html + + Gerrit Code Review - /accounts/ REST API: + http://localhost:8080/Documentation/rest-api-accounts.html + + Gerrit Code Review - Project Configuration File Format: + http://localhost:8080/Documentation/config-project-config.html + + Gerrit Code Review - Access Controls: + http://localhost:8080/Documentation/access-control.html + + Gerrit Code Review - Plugin Development: + http://localhost:8080/Documentation/dev-plugins.html + + Gerrit Code Review - REST API: + http://localhost:8080/Documentation/rest-api.html + + Gerrit Code Review - /access/ REST API: + http://localhost:8080/Documentation/rest-api-access.html +===== + +SEE ALSO +-------- + +* link:access-control.html[Access Controls] + +GERRIT +------ +Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-ban-commit.txt b/Documentation/cmd-ban-commit.txt index fb4a2ac9..fcdad5c 100644 --- a/Documentation/cmd-ban-commit.txt +++ b/Documentation/cmd-ban-commit.txt
@@ -58,3 +58,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-cherry-pick.txt b/Documentation/cmd-cherry-pick.txt index 15a8524..1275d20ea 100644 --- a/Documentation/cmd-cherry-pick.txt +++ b/Documentation/cmd-cherry-pick.txt
@@ -45,3 +45,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-create-account.txt b/Documentation/cmd-create-account.txt index 3ecb764..f22b4df 100644 --- a/Documentation/cmd-create-account.txt +++ b/Documentation/cmd-create-account.txt
@@ -81,3 +81,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-create-group.txt b/Documentation/cmd-create-group.txt index 8dc6dcc..1102a6d 100644 --- a/Documentation/cmd-create-group.txt +++ b/Documentation/cmd-create-group.txt
@@ -92,3 +92,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-create-project.txt b/Documentation/cmd-create-project.txt index e3ad834..da7820f 100644 --- a/Documentation/cmd-create-project.txt +++ b/Documentation/cmd-create-project.txt
@@ -201,3 +201,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-flush-caches.txt b/Documentation/cmd-flush-caches.txt index bc6fac5..050b433 100644 --- a/Documentation/cmd-flush-caches.txt +++ b/Documentation/cmd-flush-caches.txt
@@ -104,3 +104,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-gc.txt b/Documentation/cmd-gc.txt index 07b899a..3066ca0 100644 --- a/Documentation/cmd-gc.txt +++ b/Documentation/cmd-gc.txt
@@ -10,6 +10,7 @@ [verse] 'ssh' -p <port> <host> 'gerrit gc' [--all] + [--show-progress] <NAME> ... DESCRIPTION @@ -46,6 +47,9 @@ If specified the Git garbage collection is run for all projects sequentially. +--show-progress:: + If specified progress information is shown. + EXAMPLES -------- @@ -70,3 +74,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-gsql.txt b/Documentation/cmd-gsql.txt index 3c1fd31..4efbb2a 100644 --- a/Documentation/cmd-gsql.txt +++ b/Documentation/cmd-gsql.txt
@@ -65,3 +65,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-hook-commit-msg.txt b/Documentation/cmd-hook-commit-msg.txt index c0c1e6c..c3ad1ac 100644 --- a/Documentation/cmd-hook-commit-msg.txt +++ b/Documentation/cmd-hook-commit-msg.txt
@@ -117,6 +117,7 @@ GERRIT ------ - - Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-index.txt b/Documentation/cmd-index.txt index 3ba66a8..a274dec 100644 --- a/Documentation/cmd-index.txt +++ b/Documentation/cmd-index.txt
@@ -51,6 +51,9 @@ [[user_commands]]User Commands ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +link:cmd-apropos.html[gerrit apropos]:: + Search Gerrit documentation index. + 'gerrit approve':: 'Deprecated alias for `gerrit review`.' @@ -180,3 +183,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-kill.txt b/Documentation/cmd-kill.txt index f09053e..94371f0 100644 --- a/Documentation/cmd-kill.txt +++ b/Documentation/cmd-kill.txt
@@ -28,3 +28,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-ls-groups.txt b/Documentation/cmd-ls-groups.txt index 17ebba1..0713947 100644 --- a/Documentation/cmd-ls-groups.txt +++ b/Documentation/cmd-ls-groups.txt
@@ -156,3 +156,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-ls-members.txt b/Documentation/cmd-ls-members.txt index 9814ff2..d5f127f 100644 --- a/Documentation/cmd-ls-members.txt +++ b/Documentation/cmd-ls-members.txt
@@ -62,3 +62,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-ls-projects.txt b/Documentation/cmd-ls-projects.txt index 26530bd..5cd416d1 100644 --- a/Documentation/cmd-ls-projects.txt +++ b/Documentation/cmd-ls-projects.txt
@@ -154,3 +154,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-ls-user-refs.txt b/Documentation/cmd-ls-user-refs.txt index 25a99d1..26a083c 100644 --- a/Documentation/cmd-ls-user-refs.txt +++ b/Documentation/cmd-ls-user-refs.txt
@@ -53,3 +53,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-plugin-enable.txt b/Documentation/cmd-plugin-enable.txt index da651ca..ad1736d 100644 --- a/Documentation/cmd-plugin-enable.txt +++ b/Documentation/cmd-plugin-enable.txt
@@ -42,3 +42,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-plugin-install.txt b/Documentation/cmd-plugin-install.txt index 719c2bc..61663a6 100644 --- a/Documentation/cmd-plugin-install.txt +++ b/Documentation/cmd-plugin-install.txt
@@ -71,3 +71,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-plugin-ls.txt b/Documentation/cmd-plugin-ls.txt index 6cce83c..5e651b7 100644 --- a/Documentation/cmd-plugin-ls.txt +++ b/Documentation/cmd-plugin-ls.txt
@@ -42,3 +42,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-plugin-reload.txt b/Documentation/cmd-plugin-reload.txt index 3932e30..a4490a8 100644 --- a/Documentation/cmd-plugin-reload.txt +++ b/Documentation/cmd-plugin-reload.txt
@@ -46,3 +46,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-plugin-remove.txt b/Documentation/cmd-plugin-remove.txt index ab8f95b..f9c0eea 100644 --- a/Documentation/cmd-plugin-remove.txt +++ b/Documentation/cmd-plugin-remove.txt
@@ -43,3 +43,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-query.txt b/Documentation/cmd-query.txt index 66bd845..249b7f9 100644 --- a/Documentation/cmd-query.txt +++ b/Documentation/cmd-query.txt
@@ -17,6 +17,7 @@ [--commit-message] [--dependencies] [--submit-records] + [--all-reviewers] [--] <query> [limit:<n>] @@ -89,6 +90,10 @@ Show information about patch sets which depend on, or are needed by, each patch set. +--all-reviewers:: + Show the name and email of all reviewers which are added to a change + (irrespective of whether they have been voting on that change or not). + --submit-records:: Show submit record information about the change, which includes whether the change meets the criteria for submission @@ -155,3 +160,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-receive-pack.txt b/Documentation/cmd-receive-pack.txt index 92bb65e..239d2f5 100644 --- a/Documentation/cmd-receive-pack.txt +++ b/Documentation/cmd-receive-pack.txt
@@ -88,3 +88,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-rename-group.txt b/Documentation/cmd-rename-group.txt index e810727..624ac9b 100644 --- a/Documentation/cmd-rename-group.txt +++ b/Documentation/cmd-rename-group.txt
@@ -44,3 +44,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-review.txt b/Documentation/cmd-review.txt index 70213da..3038ead 100644 --- a/Documentation/cmd-review.txt +++ b/Documentation/cmd-review.txt
@@ -134,3 +134,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-set-account.txt b/Documentation/cmd-set-account.txt index f9855cd..19eb468 100644 --- a/Documentation/cmd-set-account.txt +++ b/Documentation/cmd-set-account.txt
@@ -94,3 +94,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-set-members.txt b/Documentation/cmd-set-members.txt index 7524893..d7da2eb 100644 --- a/Documentation/cmd-set-members.txt +++ b/Documentation/cmd-set-members.txt
@@ -80,3 +80,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-set-project-parent.txt b/Documentation/cmd-set-project-parent.txt index 1e7e6c5..5664890 100644 --- a/Documentation/cmd-set-project-parent.txt +++ b/Documentation/cmd-set-project-parent.txt
@@ -71,3 +71,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-set-project.txt b/Documentation/cmd-set-project.txt index af20006..df694a0 100644 --- a/Documentation/cmd-set-project.txt +++ b/Documentation/cmd-set-project.txt
@@ -117,3 +117,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-set-reviewers.txt b/Documentation/cmd-set-reviewers.txt index 32fd35e..81b493d 100644 --- a/Documentation/cmd-set-reviewers.txt +++ b/Documentation/cmd-set-reviewers.txt
@@ -87,3 +87,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-show-caches.txt b/Documentation/cmd-show-caches.txt index d426508..8c64b05 100644 --- a/Documentation/cmd-show-caches.txt +++ b/Documentation/cmd-show-caches.txt
@@ -83,3 +83,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-show-connections.txt b/Documentation/cmd-show-connections.txt index ab9fadf..154e1c2 100644 --- a/Documentation/cmd-show-connections.txt +++ b/Documentation/cmd-show-connections.txt
@@ -88,3 +88,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-show-queue.txt b/Documentation/cmd-show-queue.txt index 4ab3097..7364d2d 100644 --- a/Documentation/cmd-show-queue.txt +++ b/Documentation/cmd-show-queue.txt
@@ -90,3 +90,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-stream-events.txt b/Documentation/cmd-stream-events.txt index 2a3265e..746b3ea 100644 --- a/Documentation/cmd-stream-events.txt +++ b/Documentation/cmd-stream-events.txt
@@ -172,3 +172,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-suexec.txt b/Documentation/cmd-suexec.txt index 78fc361..7b128fa 100644 --- a/Documentation/cmd-suexec.txt +++ b/Documentation/cmd-suexec.txt
@@ -67,3 +67,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-test-submit-rule.txt b/Documentation/cmd-test-submit-rule.txt index ae68b80..466182c 100644 --- a/Documentation/cmd-test-submit-rule.txt +++ b/Documentation/cmd-test-submit-rule.txt
@@ -66,3 +66,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-test-submit-type.txt b/Documentation/cmd-test-submit-type.txt index f6d5fba..2b8790c 100644 --- a/Documentation/cmd-test-submit-type.txt +++ b/Documentation/cmd-test-submit-type.txt
@@ -51,3 +51,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/cmd-version.txt b/Documentation/cmd-version.txt index aa08848..806e28a 100644 --- a/Documentation/cmd-version.txt +++ b/Documentation/cmd-version.txt
@@ -46,3 +46,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-auto-site-initialization.txt b/Documentation/config-auto-site-initialization.txt index 4c204fd..6111d5d 100644 --- a/Documentation/config-auto-site-initialization.txt +++ b/Documentation/config-auto-site-initialization.txt
@@ -80,3 +80,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-cla.txt b/Documentation/config-cla.txt index 6404d4e..fa28e7b 100644 --- a/Documentation/config-cla.txt +++ b/Documentation/config-cla.txt
@@ -80,3 +80,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-contact.txt b/Documentation/config-contact.txt index 4d8851f..6c59d2a 100644 --- a/Documentation/config-contact.txt +++ b/Documentation/config-contact.txt
@@ -213,3 +213,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt index 6d00dfa..1ceb3dc 100644 --- a/Documentation/config-gerrit.txt +++ b/Documentation/config-gerrit.txt
@@ -1372,7 +1372,7 @@ [[gerrit.changeScreen]]gerrit.changeScreen:: + Default change screen UI to direct users to. Valid values are -`OLD_UI` and `CHANGE_SCREEN2`. Default is `OLD_UI`. +`OLD_UI` and `CHANGE_SCREEN2`. Default is `CHANGE_SCREEN2`. [[gitweb]]Section gitweb ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -3031,3 +3031,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-gitweb.txt b/Documentation/config-gitweb.txt index 7ba15b8..3e9cb96 100644 --- a/Documentation/config-gitweb.txt +++ b/Documentation/config-gitweb.txt
@@ -245,6 +245,10 @@ After updating `'$site_path'/etc/gerrit.config`, the Gerrit server must be restarted and clients must reload the host page to see the change. +Note that when using a custom gitweb configuration, values must be +specified for all of the `project`, `revision`, `branch` and `filehistory` +settings, otherwise the configuration will not be used. + Access Control ++++++++++++++ @@ -278,3 +282,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-hooks.txt b/Documentation/config-hooks.txt index 5875837..f9a498b 100644 --- a/Documentation/config-hooks.txt +++ b/Documentation/config-hooks.txt
@@ -169,3 +169,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-labels.txt b/Documentation/config-labels.txt index c08d484..ba3d482 100644 --- a/Documentation/config-labels.txt +++ b/Documentation/config-labels.txt
@@ -315,3 +315,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-login-register.txt b/Documentation/config-login-register.txt index 867f0d4..d3911d7 100644 --- a/Documentation/config-login-register.txt +++ b/Documentation/config-login-register.txt
@@ -141,3 +141,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-mail.txt b/Documentation/config-mail.txt index 3b8bffa..ca9253ee 100644 --- a/Documentation/config-mail.txt +++ b/Documentation/config-mail.txt
@@ -211,3 +211,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-project-config.txt b/Documentation/config-project-config.txt index 8529b67..3267c45 100644 --- a/Documentation/config-project-config.txt +++ b/Documentation/config-project-config.txt
@@ -223,3 +223,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-reverseproxy.txt b/Documentation/config-reverseproxy.txt index 064fe2e..563b322 100644 --- a/Documentation/config-reverseproxy.txt +++ b/Documentation/config-reverseproxy.txt
@@ -147,3 +147,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-sso.txt b/Documentation/config-sso.txt index e915ffb..1d8d2d6 100644 --- a/Documentation/config-sso.txt +++ b/Documentation/config-sso.txt
@@ -179,3 +179,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-themes.txt b/Documentation/config-themes.txt index c102381..5eb8094 100644 --- a/Documentation/config-themes.txt +++ b/Documentation/config-themes.txt
@@ -140,3 +140,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/config-validation.txt b/Documentation/config-validation.txt index 1b09d19..7ef646b 100644 --- a/Documentation/config-validation.txt +++ b/Documentation/config-validation.txt
@@ -40,3 +40,6 @@ ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/database-setup.txt b/Documentation/database-setup.txt index 3800473..1f48f53 100644 --- a/Documentation/database-setup.txt +++ b/Documentation/database-setup.txt
@@ -113,3 +113,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/dev-buck.txt b/Documentation/dev-buck.txt index 15c145a..c2a4584 100644 --- a/Documentation/dev-buck.txt +++ b/Documentation/dev-buck.txt
@@ -175,7 +175,7 @@ To build a specific plugin: ---- - buck build plugins/<name> + buck build plugins/<name>:<name> ---- The output JAR file will be be placed in: @@ -187,6 +187,22 @@ Note that when building an individual plugin, the `core.zip` package is not regenerated. +Additional plugins with BUCK files can be added to the build +environment by cloning the source repository into the plugins +subdirectory: + +---- + git clone https://gerrit.googlesource.com/plugins/<name> plugins/<name> + echo /plugins/<name> >>.git/info/exclude +---- + +Additional plugin sources will be automatically added to Eclipse the +next time project.py is run: + +---- + tools/eclipse/project.py +---- + [[documentation]] Documentation @@ -374,3 +390,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/dev-contributing.txt b/Documentation/dev-contributing.txt index edc072d..24fc266 100644 --- a/Documentation/dev-contributing.txt +++ b/Documentation/dev-contributing.txt
@@ -288,3 +288,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/dev-design.txt b/Documentation/dev-design.txt index 3cb58b1..06dd95d 100644 --- a/Documentation/dev-design.txt +++ b/Documentation/dev-design.txt
@@ -739,3 +739,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/dev-eclipse.txt b/Documentation/dev-eclipse.txt index d2fc8f0..eeee5a3 100644 --- a/Documentation/dev-eclipse.txt +++ b/Documentation/dev-eclipse.txt
@@ -102,3 +102,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/dev-inspector.txt b/Documentation/dev-inspector.txt new file mode 100644 index 0000000..14177f8 --- /dev/null +++ b/Documentation/dev-inspector.txt
@@ -0,0 +1,302 @@ +Gerrit Inspector +================ + +NAME +---- +Gerrit Inspector - Interactive Jython environment for Gerrit + +SYNOPSIS +-------- +[verse] +'java' -jar gerrit.war 'daemon' + -d <SITE_PATH> + [\--enable-httpd | \--disable-httpd] + [\--enable-sshd | \--disable-sshd] + [\--console-log] + [\--slave] + -s + +DESCRIPTION +----------- +Runs the Gerrit network daemon on the local system as described +in the link:pgm-daemon.html[Daemon documentation], additionally +starting an interactive Jython shell for inspection +and troubleshooting of live data of the Gerrit instance. + +CAUTION: Gerrit Inspector works directly on instances of Java Virtual +Machine objects and it is possible to read and write instance +members as well as invoke Java functions. Access is granted +also to 'private' and 'protected' members. Therefore it is possible +to introduce changes to the internal state of the system in +an inconsistent way. Care must be taken not to break the running system +and/or destroy the data. + +INSTALLATION +------------ + +Gerrit Inspector requires Jython library ('jython.jar') to be installed +in the '$site_path/lib' directory. Jython, a Python interpreter for +the Java Virtual Machine, can be obtained from the http://www.jython.org/ +website. Only 'jython.jar' file is needed, installation of Jython libraries +is optional. Gerrit Inspector has been tested with Jython 2.5.2 but +might work an earlier version. + +STARTUP +------- + +During startup Jython examines Java libraries found on the classpath. +While libraries are inspected a large amount of messages is displayed on the console: + +---- +*sys-package-mgr*: processing new jar, '/home/user/.gerritcodereview/tmp/gerrit_4890671371398741854_app/sshd-core-0.5.1-r1095809.jar' +---- + +After this a system-wide embedded initialization script is started. This script +is contained in the gerrit's WAR archive. This script produces output similar to +the following on the console: + +---- +"Shell" is "com.google.gerrit.pgm.shell.JythonShell@61644f2d" +"m" is "com.google.gerrit.lifecycle.LifecycleManager@6f03b248" +"ds" is "com.google.gerrit.server.schema.DataSourceProvider@6b3592c" +"schk" is "com.google.gerrit.server.schema.SchemaVersionCheck@5e8cb9bd" + +Welcome to the Gerrit Inspector +Enter help() to see the above again, EOF to quit and stop Gerrit +---- + +Then an optional user startup script is processed. It should be +located in the gerrit user home directory as '.gerritcodereview/Startup.py'. + +This script can access all variables defined in the system (such +as the ones displayed by the initialization script as shown above). +Variables and functions defined by the startup scripts are available for +the interactive interpreter. + +When interactive interpreter exits (by issuing EOF on the command line), +a whole Gerrit instance is shut down gracefully. + +USING THE INTERPRETER +--------------------- + +Gerrit Inspector launches Jython interpreter in the context of the Gerrit +Java Virtual Machine. All core facilities of the Jython (and Python) +language are available to the user. + +Additional facilities can be provided, for example a 'Lib' directory from the +Jython distribution can be installed under '$site_path/lib/Lib' to provide +access to many standard Python modules. Jython can also use additional Java +classes and libraries and most of the Python modules and scripts. + +The Inspector has by default access to classes and object instances available +in the Java Virtual Machine. Objects are introspected and *private* and *protected* +members are also available. + +For more information on using Jython, especially with regards to its limitations +in interfacing to the Java Virtual Machine, please refer to the +http://www.jython.org/[Jython documentation]. + +After sucessful initialization it is possible to examine components of +Java packages, classes and live instances. + +---- +>>> import com.google.inject +>>> dir(com.google.inject) +['AbstractModule', 'Binder', 'Binding', 'BindingAnnotation', 'ConfigurationException', 'CreationException', 'Exposed', 'Guice', 'ImplementedBy', 'Inject', 'Injector', 'Key', 'MembersInjector', 'Module', 'OutOfScopeException', 'PrivateBinder', 'PrivateModule', 'ProvidedBy', 'Provider', 'Provides', 'ProvisionException', 'Scope', 'ScopeAnnotation', 'Scopes', 'Singleton', 'Stage', 'TypeLiteral', '__name__', 'assistedinject', 'binder', 'internal', 'matcher', 'name', 'servlet', 'spi', 'util'] +>>> type(com.google.inject) +<type 'javapackage'> +>>> dir(com.google.inject.Guice) +['__class__', '__copy__', '__deepcopy__', '__delattr__', '__doc__', +'__eq__', '__getattribute__', '__hash__', '__init__', '__ne__', +'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', +'__str__', '__unicode__', 'class', 'clone', 'createInjector', +'equals', 'finalize', 'getClass', 'hashCode', 'notify', 'notifyAll', +'registerNatives', 'toString', 'wait'] +---- + +Startup script provides some convenient variables to access some global Gerrit components, +for example a connection to the review database is kept open: + +---- +>>> ds +org.apache.commons.dbcp.BasicDataSource@61db2215 +>>> ds.driverClassName +u'org.postgresql.Driver' +>>> ds.dataSource +org.apache.commons.dbcp.PoolingDataSource@23226fe1 +>>> ds.dataSource.connection +jdbc:postgresql://localhost/reviewdb, UserName=rv, PostgreSQL Native Driver +---- + +It is also possible to interact with the ORM layer: + +---- +>>> db = schk.schema.open() +>>> db +com.google.gerrit.reviewdb.server.ReviewDb_Schema_GwtOrm$$28@24cbbdf3 +>>> db.getDialect() +com.google.gwtorm.schema.sql.DialectPostgreSQL@4de07d3e +>>> for x in db.patchSets().iterateAllEntities(): +... print x +... +[PatchSet 1,1] +[PatchSet 2,1] +[PatchSet 3,1] +[PatchSet 4,1] +[PatchSet 5,1] +[PatchSet 6,1] +[PatchSet 7,1] +[PatchSet 8,1] +[PatchSet 6,2] +>>> for x in db.patchComments().iterateAllEntities(): +... print x +com.google.gerrit.reviewdb.client.PatchLineComment@5381298a +com.google.gerrit.reviewdb.client.PatchLineComment@44ce4dda +com.google.gerrit.reviewdb.client.PatchLineComment@44594680 +>>> dir(com.google.gerrit.reviewdb.client.PatchLineComment) +['Key', 'STATUS_DRAFT', 'STATUS_PUBLISHED', 'Status', '__class__', +'__copy__', '__deepcopy__', '__delattr__', '__doc__', '__eq__', +'__getattribute__', '__hash__', '__init__', '__ne__', '__new__', +'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', +'__unicode__', 'author', 'class', 'clone', 'equals', 'finalize', +'getAuthor', 'getClass', 'getKey', 'getLine', 'getMessage', +'getParentUuid', 'getSide', 'getStatus', 'getWrittenOn', 'hashCode', +'key', 'line', 'lineNbr', 'message', 'notify', 'notifyAll', +'parentUuid', 'registerNatives', 'setMessage', 'setSide', 'setStatus', +'side', 'status', 'toString', 'updated', 'wait', 'writtenOn'] +>>> for x in db.patchComments().iterateAllEntities(): +... print x.status, x.line, x.message +... +P 2 I like it! +P 2 more +P 1 better +---- + +A built-in *help()* function provides values of global variables +defined in the interpreter: + +---- +>>> help() +"schk" is "com.google.gerrit.server.schema.SchemaVersionCheck@5e8cb9bd" +"ds" is "com.google.gerrit.server.schema.DataSourceProvider@6b3592c" +"m" is "com.google.gerrit.lifecycle.LifecycleManager@6f03b248" +"Shell" is "com.google.gerrit.pgm.shell.JythonShell@61644f2d" +"d" is "com.google.gerrit.pgm.Daemon@28a3f689" + +Welcome to the Gerrit Inspector +Enter help() to see the above again, EOF to quit and stop Gerrit +---- + +Java and Python exceptions are intercepted by the Inspector: +---- +>>> import java.lang.RuntimeException +>>> raise java.lang.RuntimeException("Exiting") +Traceback (most recent call last): + File "<stdin>", line 1, in <module> + at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) + at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.lang.reflect.Constructor.newInstance(Constructor.java:532) + at org.python.core.PyReflectedConstructor.constructProxy(PyReflectedConstructor.java:210) + +java.lang.RuntimeException: java.lang.RuntimeException: Exiting +>>> +---- + +To exit the interpreter, use EOF character (Ctrl-D on Unix systems, Ctrl-Z on Windows). + +It is also possible to shut down the JVM by using *System.exit()* + +---- +>>> import java.lang.System +>>> java.lang.System.exit(1) +---- + +And Gerrit should shut down all its subsystems and exit: + +---- +[2012-04-17 15:31:08,458] INFO com.google.gerrit.pgm.Daemon : caught shutdown, cleaning up +---- + +TROUBLESHOOTING +--------------- + +Gerrit Inspector is logging to the Gerrit error log. + +A successful startup is indicated in the logfile: + +---- + [2012-04-17 13:43:44,888] INFO com.google.gerrit.pgm.shell.JythonShell : Jython shell instance created. +---- + +If 'jython.jar' library is not available, Gerrit refuses to start when given *-s* option: + +---- +[2012-04-17 13:57:29,611] ERROR com.google.gerrit.pgm.Daemon : Unable to start daemon +com.google.inject.ProvisionException: Guice provision errors: + +1) Error injecting constructor, java.lang.UnsupportedOperationException: Cannot create Jython shell: Class org.python.util.InteractiveConsole not found + (You might need to install jython.jar in the lib directory) + at com.google.gerrit.pgm.shell.JythonShell.<init>(JythonShell.java:47) + while locating com.google.gerrit.pgm.shell.JythonShell + while locating com.google.gerrit.pgm.shell.InteractiveShell +---- + +Errors during processing of the startup script, 'Startup.py', are logged +to the error log: + +---- +[2012-04-17 14:20:30,558] INFO com.google.gerrit.pgm.shell.JythonShell : Jython shell instance created. +[2012-04-17 14:20:38,005] ERROR com.google.gerrit.pgm.shell.JythonShell : Exception occured while loading file Startup.py : +java.lang.reflect.InvocationTargetException + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:616) + at com.google.gerrit.pgm.shell.JythonShell.runMethod0(JythonShell.java:112) + at com.google.gerrit.pgm.shell.JythonShell.execFile(JythonShell.java:194) + at com.google.gerrit.pgm.shell.JythonShell.reload(JythonShell.java:178) + at com.google.gerrit.pgm.shell.JythonShell.run(JythonShell.java:152) + at com.google.gerrit.pgm.Daemon.run(Daemon.java:190) + at com.google.gerrit.pgm.util.AbstractProgram.main(AbstractProgram.java:67) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:616) + at com.google.gerrit.launcher.GerritLauncher.invokeProgram(GerritLauncher.java:167) + at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:91) + at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:49) + at Main.main(Main.java:25) +Caused by: Traceback (most recent call last): + File "/home/user/.gerritcodereview/Startup.py", line 1, in <module> + Test +NameError: name 'Test' is not defined +---- + +Those errors are non-fatal. System and user scripts can be loaded again +by issuing the following command in the Gerrit Inspector console: + +---- +Shell.reload() +---- + +LOGGING +------- +Error and warning messages from the server are automatically written +to the log file under '$site_path/logs/error_log'. + +Output and error messages (including Java and Python exceptions) +resulting from interactive work are logged to the console. + +KNOWN ISSUES +------------ +The Inspector does not yet recognize Google Guice bindings. + +IMPORTANT: Using the Inspector may void your warranty. + +GERRIT +------ +Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/dev-plugins.txt b/Documentation/dev-plugins.txt index 717547b..d1c79ac 100644 --- a/Documentation/dev-plugins.txt +++ b/Documentation/dev-plugins.txt
@@ -38,7 +38,7 @@ ---- mvn archetype:generate -DarchetypeGroupId=com.google.gerrit \ -DarchetypeArtifactId=gerrit-plugin-archetype \ - -DarchetypeVersion=2.8-SNAPSHOT \ + -DarchetypeVersion=2.9-SNAPSHOT \ -DgroupId=com.google.gerrit \ -DartifactId=testPlugin ---- @@ -191,6 +191,29 @@ } ---- +A plugin can get its canonical web URL injected at runtime: + +[source,java] +---- +public class MyClass { + + private final String url; + + @Inject + public MyClass(@PluginCanonicalWebUrl String url) { + this.url = url; + } + + [...] +} +---- + +The URL is composed of the server's canonical web URL and the plugin's +name, i.e. `http://review.example.com:8080/plugin-name`. + +The canonical web URL may be injected into any .jar plugin regardless of +whether or not the plugin provides an HTTP servlet. + [[reload_method]] Reload Method ~~~~~~~~~~~~~ @@ -364,7 +387,9 @@ [source,java] ---- import com.google.gerrit.sshd.SshCommand; +import com.google.gerrit.sshd.CommandMetaData; +@CommandMetaData(name="print", descr="Print hello command") class PrintHello extends SshCommand { protected abstract void run() { stdout.print("Hello\n"); @@ -398,7 +423,7 @@ class MyCommands extends PluginCommandModule { protected void configureCommands() { - command("print").to(PrintHello.class); + command(PrintHello.class); } } ---- @@ -448,9 +473,33 @@ $ ssh -p 29418 review.example.com shell ps ---- -[[configuration]] -Configuration -------------- +Single command plugins are also supported. In this scenario plugin binds +SSH command to its own name. `SshModule` must inherit from +`SingleCommandPluginModule` class: + +[source,java] +---- +public class SshModule extends SingleCommandPluginModule { + @Override + protected void configure(LinkedBindingBuilder<Command> b) { + b.to(ShellCommand.class); + } +} +---- + +If the plugin above is deployed under sh.jar file in `$site/plugins` +directory, generic commands can be called without specifing the +actual SSH command. Note in the example below, that the called commands +`ls` and `ps` was not explicitly bound: + +---- +$ ssh -p 29418 review.example.com sh ls +$ ssh -p 29418 review.example.com sh ps +---- + +[[simple-configuration]] +Simple Configuration in `gerrit.config` +--------------------------------------- In Gerrit, global configuration is stored in the `gerrit.config` file. If a plugin needs global configuration, this configuration should be @@ -460,12 +509,12 @@ plugins that have a simple configuration that only consists of key-value pairs. With this approach it is not possible to have subsections in the plugin configuration. Plugins that require a complex -configuration need to store their configuration in their own -configuration file where they can make use of subsections. On the other -hand storing the plugin configuration in a 'plugin' subsection in the -`gerrit.config` file has the advantage that administrators have all -configuration parameters in one file, instead of having one -configuration file per plugin. +configuration need to store their configuration in their +link:#configuration[own configuration file] where they can make use of +subsections. On the other hand storing the plugin configuration in a +'plugin' subsection in the `gerrit.config` file has the advantage that +administrators have all configuration parameters in one file, instead +of having one configuration file per plugin. To avoid conflicts with other plugins, it is recommended that plugins only use the `plugin` subsection with their own name. For example the @@ -492,9 +541,52 @@ .getString("language", "English"); ---- -[[project-specific-configuration]] -Project Specific Configuration ------------------------------- +[[configuration]] +Configuration in own config file +-------------------------------- + +Plugins can store their configuration in an own configuration file. +This makes sense if the plugin configuration is rather complex and +requires the usage of subsections. Plugins that have a simple +key-value pair configuration can store their configuration in a +link:#simple-configuration[`plugin` subsection of the `gerrit.config` +file]. + +The plugin configuration file must be named after the plugin and must +be located in the `etc` folder of the review site. For example a +configuration file for a `default-reviewer` plugin could look like +this: + +.$site_path/etc/default-reviewer.config +---- +[branch "refs/heads/master"] + reviewer = Project Owners + reviewer = john.doe@example.com +[match "file:^.*\.txt"] + reviewer = My Info Developers +---- + +Via the `com.google.gerrit.server.config.PluginConfigFactory` class a +plugin can easily access its configuration: + +[source,java] +---- +@Inject +private com.google.gerrit.server.config.PluginConfigFactory cfg; + +[...] + +String[] reviewers = cfg.getGlobalPluginConfig("default-reviewer") + .getStringList("branch", "refs/heads/master", "reviewer"); +---- + +The plugin configuration is loaded only once and is then cached. +Similar to changes in 'gerrit.config', changes to the plugin +configuration file will only become effective after a Gerrit restart. + +[[simple-project-specific-configuration]] +Simple Project Specific Configuration in `project.config` +--------------------------------------------------------- In Gerrit, project specific configuration is stored in the project's `project.config` file on the `refs/meta/config` branch. If a plugin @@ -506,12 +598,12 @@ plugins that have a simple configuration that only consists of key-value pairs. With this approach it is not possible to have subsections in the plugin configuration. Plugins that require a complex -configuration need to store their configuration in their own -configuration file where they can make use of subsections. On the other -hand storing the plugin configuration in a 'plugin' subsection in the -`project.config` file has the advantage that project owners have all -configuration parameters in one file, instead of having one -configuration file per plugin. +configuration need to store their configuration in their +link:#project-specific-configuration[own configuration file] where they +can make use of subsections. On the other hand storing the plugin +configuration in a 'plugin' subsection in the `project.config` file has +the advantage that project owners have all configuration parameters in +one file, instead of having one configuration file per plugin. To avoid conflicts with other plugins, it is recommended that plugins only use the `plugin` subsection with their own name. For example the @@ -556,6 +648,63 @@ `refs/meta/config` branch, editing the `project.config` file and pushing the commit back. +[[project-specific-configuration]] +Project Specific Configuration in own config file +------------------------------------------------- + +Plugins can store their project specific configuration in an own +configuration file in the projects `refs/meta/config` branch. +This makes sense if the plugins project specific configuration is +rather complex and requires the usage of subsections. Plugins that +have a simple key-value pair configuration can store their project +specific configuration in a link:#simple-project-specific-configuration[ +`plugin` subsection of the `project.config` file]. + +The plugin configuration file in the `refs/meta/config` branch must be +named after the plugin. For example a configuration file for a +`default-reviewer` plugin could look like this: + +.default-reviewer.config +---- +[branch "refs/heads/master"] + reviewer = Project Owners + reviewer = john.doe@example.com +[match "file:^.*\.txt"] + reviewer = My Info Developers +---- + +Via the `com.google.gerrit.server.config.PluginConfigFactory` class a +plugin can easily access its project specific configuration: + +[source,java] +---- +@Inject +private com.google.gerrit.server.config.PluginConfigFactory cfg; + +[...] + +String[] reviewers = cfg.getProjectPluginConfig(project, "default-reviewer") + .getStringList("branch", "refs/heads/master", "reviewer"); +---- + +It is also possible to get missing configuration parameters inherited +from the parent projects: + +[source,java] +---- +@Inject +private com.google.gerrit.server.config.PluginConfigFactory cfg; + +[...] + +String[] reviewers = cfg.getFromPluginConfigWithInheritance(project, "default-reviewer") + .getStringList("branch", "refs/heads/master", "reviewer"); +---- + +Project owners can edit the project configuration by fetching the +`refs/meta/config` branch, editing the `<plugin-name>.config` file and +pushing the commit back. + [[capabilities]] Plugin Owned Capabilities ------------------------- @@ -988,6 +1137,303 @@ Gerrit-Module: com.googlesource.gerrit.plugins.helloworld.HelloWorldModule ---- +It is also possible to show some menu entries only if the user has a +certain capability: + +[source,java] +---- +public class MyTopMenuExtension implements TopMenu { + private final String pluginName; + private final Provider<CurrentUser> userProvider; + private final List<MenuEntry> menuEntries; + + @Inject + public MyTopMenuExtension(@PluginName String pluginName, + Provider<CurrentUser> userProvider) { + this.pluginName = pluginName; + this.userProvider = userProvider; + menuEntries = new ArrayList<TopMenu.MenuEntry>(); + + // add menu entry that is only visible to users with a certain capability + if (canSeeMenuEntry()) { + menuEntries.add(new MenuEntry("Top Menu Entry", Collections + .singletonList(new MenuItem("Gerrit", "http://gerrit.googlecode.com/")))); + } + + // add menu entry that is visible to all users (even anonymous users) + menuEntries.add(new MenuEntry("Top Menu Entry", Collections + .singletonList(new MenuItem("Documentation", "/plugins/myplugin/")))); + } + + private boolean canSeeMenuEntry() { + if (userProvider.get().isIdentifiedUser()) { + CapabilityControl ctl = userProvider.get().getCapabilities(); + return ctl.canPerform(pluginName + "-" + MyCapability.ID) + || ctl.canAdministrateServer(); + } else { + return false; + } + } + + @Override + public List<MenuEntry> getEntries() { + return menuEntries; + } +} +---- + +[[gwt_ui_extension]] +GWT UI Extension +---------------- +Plugins can extend the Gerrit UI with own GWT code. + +The Maven archetype 'gerrit-plugin-gwt-archetype' can be used to +generate a GWT plugin skeleton. How to use the Maven plugin archetypes +is described in the link:#getting-started[Getting started] section. + +The generated GWT plugin has a link:#top-menu-extensions[top menu] that +opens a GWT dialog box when the user clicks on it. + +In addition to the Gerrit-Plugin API a GWT plugin depends on +`gerrit-plugin-gwtui`. This dependency must be specified in the +`pom.xml`: + +[source,xml] +---- +<dependency> + <groupId>com.google.gerrit</groupId> + <artifactId>gerrit-plugin-gwtui</artifactId> + <version>${Gerrit-ApiVersion}</version> +</dependency> +---- + +A GWT plugin must contain a GWT module file, e.g. `HelloPlugin.gwt.xml`, +that bundles together all the configuration settings of the GWT plugin: + +[source,xml] +---- +<?xml version="1.0" encoding="UTF-8"?> +<module rename-to="hello_gwt_plugin"> + <!-- Inherit the core Web Toolkit stuff. --> + <inherits name="com.google.gwt.user.User"/> + <!-- Other module inherits --> + <inherits name="com.google.gerrit.Plugin"/> + <inherits name="com.google.gwt.http.HTTP"/> + <!-- Using GWT built-in themes adds a number of static --> + <!-- resources to the plugin. No theme inherits lines were --> + <!-- added in order to make this plugin as simple as possible --> + <!-- Specify the app entry point class. --> + <entry-point class="${package}.client.HelloPlugin"/> + <stylesheet src="hello.css"/> +</module> +---- + +The GWT module must inherit `com.google.gerrit.Plugin` and +`com.google.gwt.http.HTTP`. + +To register the GWT module a `GwtPlugin` needs to be bound. + +If no Guice modules are declared in the manifest, the GWT plugin may +use auto-registration by using the `@Listen` annotation: + +[source,java] +---- +@Listen +public class MyExtension extends GwtPlugin { + public MyExtension() { + super("hello_gwt_plugin"); + } +} +---- + +Otherwise the binding must be done in an `HttpModule`: + +[source,java] +---- +public class HttpModule extends HttpPluginModule { + + @Override + protected void configureServlets() { + DynamicSet.bind(binder(), WebUiPlugin.class) + .toInstance(new GwtPlugin("hello_gwt_plugin")); + } +} +---- + +The HTTP module above must be declared in the `pom.xml` for Maven +driven plugins: + +[source,xml] +---- +<manifestEntries> + <Gerrit-HttpModule>com.googlesource.gerrit.plugins.myplugin.HttpModule</Gerrit-HttpModule> +</manifestEntries> +---- + +It is important that the module name that is provided to the +`GwtPlugin` matches the GWT module contained in the plugin. The name +of the GWT module can be explicitly set in the GWT module file by +specifying the `rename-to` attribute on the module. + +[source,xml] +---- +<module rename-to="hello_gwt_plugin"> +---- + +The actual GWT code must be implemented in a class that extends +`com.google.gerrit.plugin.client.Plugin`: + +[source,java] +---- +public class HelloPlugin extends Plugin { + + @Override + public void onModuleLoad() { + // Create the dialog box + final DialogBox dialogBox = new DialogBox(); + + // The content of the dialog comes from a User specified Preference + dialogBox.setText("Hello from GWT Gerrit UI plugin"); + dialogBox.setAnimationEnabled(true); + Button closeButton = new Button("Close"); + VerticalPanel dialogVPanel = new VerticalPanel(); + dialogVPanel.setWidth("100%"); + dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER); + dialogVPanel.add(closeButton); + + closeButton.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent event) { + dialogBox.hide(); + } + }); + + // Set the contents of the Widget + dialogBox.setWidget(dialogVPanel); + + RootPanel rootPanel = RootPanel.get(HelloMenu.MENU_ID); + rootPanel.getElement().removeAttribute("href"); + rootPanel.addDomHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + dialogBox.center(); + dialogBox.show(); + } + }, ClickEvent.getType()); + } +} +---- + +This class must be set as entry point in the GWT module: + +[source,xml] +---- +<entry-point class="${package}.client.HelloPlugin"/> +---- + +In addition this class must be defined as module in the `pom.xml` for the +`gwt-maven-plugin` and the `webappDirectory` option of `gwt-maven-plugin` +must be set to `${project.build.directory}/classes/static`: + +[source,xml] +---- +<plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>gwt-maven-plugin</artifactId> + <version>2.5.1</version> + <configuration> + <module>com.googlesource.gerrit.plugins.myplugin.HelloPlugin</module> + <disableClassMetadata>true</disableClassMetadata> + <disableCastChecking>true</disableCastChecking> + <webappDirectory>${project.build.directory}/classes/static</webappDirectory> + </configuration> + <executions> + <execution> + <goals> + <goal>compile</goal> + </goals> + </execution> + </executions> +</plugin> +---- + +To attach a GWT widget defined by the plugin to the Gerrit core UI +`com.google.gwt.user.client.ui.RootPanel` can be used to manipulate the +Gerrit core widgets: + +[source,java] +---- +RootPanel rootPanel = RootPanel.get(HelloMenu.MENU_ID); +rootPanel.getElement().removeAttribute("href"); +rootPanel.addDomHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + dialogBox.center(); + dialogBox.show(); + } +}, ClickEvent.getType()); +---- + +GWT plugins can come with their own css file. This css file must have a +unique name and must be registered in the GWT module: + +[source,xml] +---- +<stylesheet src="hello.css"/> +---- + +If a GWT plugin wants to invoke the Gerrit REST API it can use +`com.google.gerrit.plugin.client.rpc.RestApi` to contruct the URL +path and to trigger the REST calls. + +Example for invoking a Gerrit core REST endpoint: + +[source,java] +---- +new RestApi("projects").id(projectName).view("description") + .put("new description", new AsyncCallback<JavaScriptObject>() { + + @Override + public void onSuccess(JavaScriptObject result) { + // TODO + } + + @Override + public void onFailure(Throwable caught) { + // never invoked + } +}); +---- + +Example for invoking a REST endpoint defined by a plugin: + +[source,java] +---- +new RestApi("projects").id(projectName).view("myplugin", "myview") + .get(new AsyncCallback<JavaScriptObject>() { + + @Override + public void onSuccess(JavaScriptObject result) { + // TODO + } + + @Override + public void onFailure(Throwable caught) { + // never invoked + } +}); +---- + +The `onFailure(Throwable)` of the provided callback is never invoked. +If an error occurs, it is shown in an error dialog. + +In order to be able to do REST calls the GWT module must inherit +`com.google.gwt.json.JSON`: + +[source,xml] +---- +<inherits name="com.google.gwt.json.JSON"/> +---- + [[http]] HTTP Servlets ------------- @@ -1197,3 +1643,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/dev-readme.txt b/Documentation/dev-readme.txt index ced8648..d961f70 100644 --- a/Documentation/dev-readme.txt +++ b/Documentation/dev-readme.txt
@@ -106,6 +106,43 @@ java -jar buck-out/gen/gerrit.war daemon -d ../test_site ---- +Running the Daemon with Gerrit Inspector +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +link:dev-inspector.html[Gerrit Inspector] is an interactive scriptable +environment to inspect and modify internal state of the system. + +This environment is available on the system console after +the system starts. Leaving the Inspector will shutdown the Gerrit +instance. + +The environment allows interactive work as well as running of +Python scripts for troubleshooting. + +Gerrit Inspect can be started by adding '-s' option to the +command used to launch the daemon: + +---- + java -jar buck-out/gen/gerrit.war daemon -d ../test_site -s +---- + +Gerrit Inspector examines Java libraries first, then loads +its initialization scripts and then starts a command line +prompt on the console: + +---- + Welcome to the Gerrit Inspector + Enter help() to see the above again, EOF to quit and stop Gerrit + Jython 2.5.2 (Release_2_5_2:7206, Mar 2 2011, 23:12:06) + [OpenJDK 64-Bit Server VM (Sun Microsystems Inc.)] on java1.6.0 running for Gerrit 2.3-rc0-163-g01967ef + >>> +---- + +With the Inspector enabled Gerrit can be used normally and all +interfaces (HTTP, SSH etc.) are available. + +Care must be taken not to modify internal state of the system +when using the Inspector. Querying the Database ~~~~~~~~~~~~~~~~~~~~~ @@ -209,3 +246,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/dev-release-deploy-config.txt b/Documentation/dev-release-deploy-config.txt index 9c98fff..6ea32b7 100644 --- a/Documentation/dev-release-deploy-config.txt +++ b/Documentation/dev-release-deploy-config.txt
@@ -132,3 +132,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/dev-release-subproject.txt b/Documentation/dev-release-subproject.txt index 956bd29..b9a39be 100644 --- a/Documentation/dev-release-subproject.txt +++ b/Documentation/dev-release-subproject.txt
@@ -107,3 +107,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/dev-release.txt b/Documentation/dev-release.txt index f9d0d0e..b9b9ff0 100644 --- a/Documentation/dev-release.txt +++ b/Documentation/dev-release.txt
@@ -359,3 +359,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/dev-rest-api.txt b/Documentation/dev-rest-api.txt index 0175a62..24b60f0 100644 --- a/Documentation/dev-rest-api.txt +++ b/Documentation/dev-rest-api.txt
@@ -87,3 +87,5 @@ ------ Part of link:index.html[Gerrit Code Review] +SEARCHBOX +---------
diff --git a/Documentation/error-branch-not-found.txt b/Documentation/error-branch-not-found.txt index bd8d090..a8b1741 100644 --- a/Documentation/error-branch-not-found.txt +++ b/Documentation/error-branch-not-found.txt
@@ -32,3 +32,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-change-closed.txt b/Documentation/error-change-closed.txt index 3244fb3..e466c2e 100644 --- a/Documentation/error-change-closed.txt +++ b/Documentation/error-change-closed.txt
@@ -39,3 +39,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-change-does-not-belong-to-project.txt b/Documentation/error-change-does-not-belong-to-project.txt index e747881..db16261 100644 --- a/Documentation/error-change-does-not-belong-to-project.txt +++ b/Documentation/error-change-does-not-belong-to-project.txt
@@ -14,3 +14,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-change-not-found.txt b/Documentation/error-change-not-found.txt index b6df13b..e578ef5 100644 --- a/Documentation/error-change-not-found.txt +++ b/Documentation/error-change-not-found.txt
@@ -13,3 +13,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-change-upload-blocked.txt b/Documentation/error-change-upload-blocked.txt index 6bad02e..3b413bd2 100644 --- a/Documentation/error-change-upload-blocked.txt +++ b/Documentation/error-change-upload-blocked.txt
@@ -39,3 +39,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-commit-already-exists.txt b/Documentation/error-commit-already-exists.txt index dc32c4c1..6a2170a 100644 --- a/Documentation/error-commit-already-exists.txt +++ b/Documentation/error-commit-already-exists.txt
@@ -12,3 +12,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-contains-banned-commit.txt b/Documentation/error-contains-banned-commit.txt index 8a30c44..f6ac30d 100644 --- a/Documentation/error-contains-banned-commit.txt +++ b/Documentation/error-contains-banned-commit.txt
@@ -19,3 +19,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-has-duplicates.txt b/Documentation/error-has-duplicates.txt index b5175c0..4eac779 100644 --- a/Documentation/error-has-duplicates.txt +++ b/Documentation/error-has-duplicates.txt
@@ -22,3 +22,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-invalid-author.txt b/Documentation/error-invalid-author.txt index c484776..7067cde 100644 --- a/Documentation/error-invalid-author.txt +++ b/Documentation/error-invalid-author.txt
@@ -143,3 +143,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-invalid-changeid-line.txt b/Documentation/error-invalid-changeid-line.txt index 9235266..a1d7f15 100644 --- a/Documentation/error-invalid-changeid-line.txt +++ b/Documentation/error-invalid-changeid-line.txt
@@ -29,3 +29,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-invalid-committer.txt b/Documentation/error-invalid-committer.txt index 447064e..e27961f 100644 --- a/Documentation/error-invalid-committer.txt +++ b/Documentation/error-invalid-committer.txt
@@ -108,3 +108,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-messages.txt b/Documentation/error-messages.txt index 58e9e02..18aa12a 100644 --- a/Documentation/error-messages.txt +++ b/Documentation/error-messages.txt
@@ -47,3 +47,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/error-missing-changeid.txt b/Documentation/error-missing-changeid.txt index edbc63b..833e6ac 100644 --- a/Documentation/error-missing-changeid.txt +++ b/Documentation/error-missing-changeid.txt
@@ -70,3 +70,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-multiple-changeid-lines.txt b/Documentation/error-multiple-changeid-lines.txt index 9fa2b91..9b094d4 100644 --- a/Documentation/error-multiple-changeid-lines.txt +++ b/Documentation/error-multiple-changeid-lines.txt
@@ -29,3 +29,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-no-changes-made.txt b/Documentation/error-no-changes-made.txt index d0e1d4f..4987b16 100644 --- a/Documentation/error-no-changes-made.txt +++ b/Documentation/error-no-changes-made.txt
@@ -19,3 +19,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-no-common-ancestry.txt b/Documentation/error-no-common-ancestry.txt index 615da71..174e52b 100644 --- a/Documentation/error-no-common-ancestry.txt +++ b/Documentation/error-no-common-ancestry.txt
@@ -18,3 +18,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-no-new-changes.txt b/Documentation/error-no-new-changes.txt index 8e409ef..20357a4 100644 --- a/Documentation/error-no-new-changes.txt +++ b/Documentation/error-no-new-changes.txt
@@ -49,3 +49,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-non-fast-forward.txt b/Documentation/error-non-fast-forward.txt index 6604e10..f9b2caa 100644 --- a/Documentation/error-non-fast-forward.txt +++ b/Documentation/error-non-fast-forward.txt
@@ -57,3 +57,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-not-a-gerrit-administrator.txt b/Documentation/error-not-a-gerrit-administrator.txt index b771af6..98dd64c 100644 --- a/Documentation/error-not-a-gerrit-administrator.txt +++ b/Documentation/error-not-a-gerrit-administrator.txt
@@ -12,3 +12,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-not-allowed-to-upload-merges.txt b/Documentation/error-not-allowed-to-upload-merges.txt index 515eef5..fd2f10c 100644 --- a/Documentation/error-not-allowed-to-upload-merges.txt +++ b/Documentation/error-not-allowed-to-upload-merges.txt
@@ -19,3 +19,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-not-permitted-to-create.txt b/Documentation/error-not-permitted-to-create.txt index 9c07fd1..f41b645 100644 --- a/Documentation/error-not-permitted-to-create.txt +++ b/Documentation/error-not-permitted-to-create.txt
@@ -14,3 +14,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-not-signed-off-by.txt b/Documentation/error-not-signed-off-by.txt index bd1f40d..a3d6bbd 100644 --- a/Documentation/error-not-signed-off-by.txt +++ b/Documentation/error-not-signed-off-by.txt
@@ -29,3 +29,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-not-valid-ref.txt b/Documentation/error-not-valid-ref.txt index 128e796..5bba8e6 100644 --- a/Documentation/error-not-valid-ref.txt +++ b/Documentation/error-not-valid-ref.txt
@@ -44,3 +44,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-permission-denied.txt b/Documentation/error-permission-denied.txt index 2ec0a3f..a97161f 100644 --- a/Documentation/error-permission-denied.txt +++ b/Documentation/error-permission-denied.txt
@@ -60,3 +60,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-prohibited-by-gerrit.txt b/Documentation/error-prohibited-by-gerrit.txt index bad2b3c..2a65ea2 100644 --- a/Documentation/error-prohibited-by-gerrit.txt +++ b/Documentation/error-prohibited-by-gerrit.txt
@@ -39,3 +39,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-project-not-found.txt b/Documentation/error-project-not-found.txt index 3fc0141..29af5f8 100644 --- a/Documentation/error-project-not-found.txt +++ b/Documentation/error-project-not-found.txt
@@ -32,3 +32,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-push-fails-due-to-commit-message.txt b/Documentation/error-push-fails-due-to-commit-message.txt index 172d64f..046789e 100644 --- a/Documentation/error-push-fails-due-to-commit-message.txt +++ b/Documentation/error-push-fails-due-to-commit-message.txt
@@ -39,3 +39,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-squash-commits-first.txt b/Documentation/error-squash-commits-first.txt index 2181c52..9434363 100644 --- a/Documentation/error-squash-commits-first.txt +++ b/Documentation/error-squash-commits-first.txt
@@ -106,3 +106,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/error-upload-denied.txt b/Documentation/error-upload-denied.txt index 5dec8ab..6de94b4 100644 --- a/Documentation/error-upload-denied.txt +++ b/Documentation/error-upload-denied.txt
@@ -17,3 +17,6 @@ GERRIT ------ Part of link:error-messages.html[Gerrit Error Messages] + +SEARCHBOX +---------
diff --git a/Documentation/i18n-readme.txt b/Documentation/i18n-readme.txt index 2135598..46abaad 100644 --- a/Documentation/i18n-readme.txt +++ b/Documentation/i18n-readme.txt
@@ -22,3 +22,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/images/intro-quick-central-gerrit.png b/Documentation/images/intro-quick-central-gerrit.png index 61b9638..8717176 100644 --- a/Documentation/images/intro-quick-central-gerrit.png +++ b/Documentation/images/intro-quick-central-gerrit.png Binary files differ
diff --git a/Documentation/images/intro-quick-central-repo.png b/Documentation/images/intro-quick-central-repo.png index 84ffeb0..8400b5e 100644 --- a/Documentation/images/intro-quick-central-repo.png +++ b/Documentation/images/intro-quick-central-repo.png Binary files differ
diff --git a/Documentation/index.txt b/Documentation/index.txt index 58dae6e..e696bfb 100644 --- a/Documentation/index.txt +++ b/Documentation/index.txt
@@ -91,3 +91,6 @@ * link:http://code.google.com/p/gerrit/issues/list[Issue Tracking] * link:http://code.google.com/p/gerrit/source/checkout[Source Code] * link:http://code.google.com/p/gerrit/wiki/Background[A History of Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/install-j2ee.txt b/Documentation/install-j2ee.txt index 5ba8cb1..dd9657c 100644 --- a/Documentation/install-j2ee.txt +++ b/Documentation/install-j2ee.txt
@@ -117,3 +117,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/install-quick.txt b/Documentation/install-quick.txt index f1bd25c..741de35 100644 --- a/Documentation/install-quick.txt +++ b/Documentation/install-quick.txt
@@ -232,3 +232,6 @@ ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/install.txt b/Documentation/install.txt index 1d6d1bd..8e836f8 100644 --- a/Documentation/install.txt +++ b/Documentation/install.txt
@@ -194,3 +194,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/intro-change-screen.txt b/Documentation/intro-change-screen.txt index 2913336..80ac974 100644 --- a/Documentation/intro-change-screen.txt +++ b/Documentation/intro-change-screen.txt
@@ -28,10 +28,10 @@ Configuration ------------- -The new change screen is deactivated by default. It can be activated system-wide -by changing the link:config-gerrit.html[gerrit.changeScreen] setting to -`CHANGE_SCREEN2`. Users can deactivate it by setting `OLD_UI` on their user -preferences page. +The new change screen is activated by default. It can be deactivated +system-wide by changing the link:config-gerrit.html[gerrit.changeScreen] +setting to `OLD_UI`. Users can deactivate it by setting `OLD_UI` on their +user preferences page. [[switching-between-patch-sets]] Switching between patch sets @@ -214,3 +214,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/intro-quick.txt b/Documentation/intro-quick.txt index ae2e7e7..cd3374b 100644 --- a/Documentation/intro-quick.txt +++ b/Documentation/intro-quick.txt
@@ -390,3 +390,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/js-api.txt b/Documentation/js-api.txt index 2e97ac4..7411026 100644 --- a/Documentation/js-api.txt +++ b/Documentation/js-api.txt
@@ -425,6 +425,13 @@ comes with an onkeypress handler installed to play nicely with Gerrit's keyboard binding system. +* `select(a,i)`: a new `<select>` element containing one `<option>` + element for each entry in the provided array `a`. The option with + the index `i` will be pre-selected in the drop-down-list. + +* `selected(s)`: returns the text of the `<option>` element that is + currently selected in the provided `<select>` element `s`. + * `span(...)`: a new `<span>` wrapping the (optional) arguments. * `msg(label)`: a new label. @@ -636,3 +643,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/json.txt b/Documentation/json.txt index 2836e5b..73dbd92 100644 --- a/Documentation/json.txt +++ b/Documentation/json.txt
@@ -72,6 +72,9 @@ submitRecords:: The <<submitRecord,submitRecord attribute>> contains information about whether this change has been or can be submitted. +allReviewers:: List of all reviewers in <<account,account attribute>> +which are added to a change. + [[trackingid]] trackingid ---------- @@ -273,3 +276,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/pgm-LocalUsernamesToLowerCase.txt b/Documentation/pgm-LocalUsernamesToLowerCase.txt index 9189fee..f1d21f89 100644 --- a/Documentation/pgm-LocalUsernamesToLowerCase.txt +++ b/Documentation/pgm-LocalUsernamesToLowerCase.txt
@@ -66,3 +66,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/pgm-ScanTrackingIds.txt b/Documentation/pgm-ScanTrackingIds.txt index f9494d4..9e38032 100644 --- a/Documentation/pgm-ScanTrackingIds.txt +++ b/Documentation/pgm-ScanTrackingIds.txt
@@ -57,3 +57,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/pgm-daemon.txt b/Documentation/pgm-daemon.txt index ce88ab7..18bd293 100644 --- a/Documentation/pgm-daemon.txt +++ b/Documentation/pgm-daemon.txt
@@ -16,6 +16,7 @@ [\--slave] [\--headless] [\--init] + [-s] DESCRIPTION ----------- @@ -68,6 +69,14 @@ Run init before starting the daemon. This will create a new site or upgrade an existing site. +\--s:: + Start link:dev-inspector.html[Gerrit Inspector] on the console, a + built-in interactive inspection environment to assist debugging and + troubleshooting of Gerrit code. ++ +This options requires 'jython.jar' from the http://www.jython.org[Jython distribution] +to be present in '$site_path/lib' directory. + CONTEXT ------- This command can only be run on a server which has direct @@ -117,3 +126,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/pgm-gsql.txt b/Documentation/pgm-gsql.txt index 37fbb74..a805036 100644 --- a/Documentation/pgm-gsql.txt +++ b/Documentation/pgm-gsql.txt
@@ -54,3 +54,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/pgm-index.txt b/Documentation/pgm-index.txt index 987b4ac..a25a1ab 100644 --- a/Documentation/pgm-index.txt +++ b/Documentation/pgm-index.txt
@@ -44,3 +44,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/pgm-init.txt b/Documentation/pgm-init.txt index 3d6cb73..8e48b30 100644 --- a/Documentation/pgm-init.txt +++ b/Documentation/pgm-init.txt
@@ -62,3 +62,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/pgm-prolog-shell.txt b/Documentation/pgm-prolog-shell.txt index 3189e90..7b273f5 100644 --- a/Documentation/pgm-prolog-shell.txt +++ b/Documentation/pgm-prolog-shell.txt
@@ -55,3 +55,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/pgm-reindex.txt b/Documentation/pgm-reindex.txt index 2b44f6b..f55c093 100644 --- a/Documentation/pgm-reindex.txt +++ b/Documentation/pgm-reindex.txt
@@ -39,3 +39,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/pgm-rulec.txt b/Documentation/pgm-rulec.txt index 6d0a632..356f555 100644 --- a/Documentation/pgm-rulec.txt +++ b/Documentation/pgm-rulec.txt
@@ -52,3 +52,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/project-setup.txt b/Documentation/project-setup.txt index 36d3c60..9b6f6d9 100644 --- a/Documentation/project-setup.txt +++ b/Documentation/project-setup.txt
@@ -134,3 +134,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/prolog-change-facts.txt b/Documentation/prolog-change-facts.txt index e21da02..071984b 100644 --- a/Documentation/prolog-change-facts.txt +++ b/Documentation/prolog-change-facts.txt
@@ -101,3 +101,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/prolog-cookbook.txt b/Documentation/prolog-cookbook.txt index b1710a2..54f6910 100644 --- a/Documentation/prolog-cookbook.txt +++ b/Documentation/prolog-cookbook.txt
@@ -1062,3 +1062,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/replace_macros.py b/Documentation/replace_macros.py index 1680a47..1f23cbe 100755 --- a/Documentation/replace_macros.py +++ b/Documentation/replace_macros.py
@@ -22,6 +22,7 @@ PAT_GET = re.compile(r'^get::([^ \t\n]*)') PAT_TITLE = re.compile(r'^\.(.*)') PAT_STARS = re.compile(r'^\*\*\*\*') +PAT_SEARCHBOX = re.compile(r'^SEARCHBOX') GERRIT_UPLINK = """ @@ -56,6 +57,29 @@ """ +SEARCH_BOX = """ + +++++ +<div style="position:absolute; right:20px; top:20px;"> +<input type="text" id="docSearch" size="70" /> +<button type="button" id="searchBox">Search</button> +<script type="text/javascript"> +var f = function() { + window.location = '../#/Documentation/' + + encodeURIComponent(document.getElementById("docSearch").value); +} +document.getElementById("searchBox").onclick = f; +document.getElementById("docSearch").onkeypress = function(e) { + if (13 == (e.keyCode ? e.keyCode : e.which)) { + f(); + } +} +</script> +</div> +++++ + +""" + opts = OptionParser() opts.add_option('-o', '--out', help='output file') opts.add_option('-s', '--src', help='source file') @@ -73,6 +97,10 @@ # Case of "GERRIT\n------" at the footer out_file.write(GERRIT_UPLINK) last_line = '' + elif PAT_SEARCHBOX.match(line): + # Case of 'SEARCHBOX\n---------' + out_file.write(SEARCH_BOX) + last_line = '' elif PAT_INCLUDE.match(line): # Case of 'include::<filename>' match = PAT_INCLUDE.match(line)
diff --git a/Documentation/rest-api-access.txt b/Documentation/rest-api-access.txt index 6c786e4..b49f787 100644 --- a/Documentation/rest-api-access.txt +++ b/Documentation/rest-api-access.txt
@@ -378,3 +378,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/rest-api-accounts.txt b/Documentation/rest-api-accounts.txt index 70431c6..f72c154 100644 --- a/Documentation/rest-api-accounts.txt +++ b/Documentation/rest-api-accounts.txt
@@ -200,14 +200,17 @@ GET /accounts/john.doe@example.com/active HTTP/1.0 ---- -As response `200 OK` is returned for an active account and -`404 Not Found` is returned for an inactive account. +If the account is active the string `ok` is returned. .Response ---- HTTP/1.1 200 OK + + ok ---- +If the account is inactive the response is `204 No Content`. + [[set-active]] Set Active ~~~~~~~~~~ @@ -1331,3 +1334,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/rest-api-changes.txt b/Documentation/rest-api-changes.txt index 9404d00..9ed8be0 100644 --- a/Documentation/rest-api-changes.txt +++ b/Documentation/rest-api-changes.txt
@@ -3371,3 +3371,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/rest-api-config.txt b/Documentation/rest-api-config.txt index 5bd5e0c..9a512b8 100644 --- a/Documentation/rest-api-config.txt +++ b/Documentation/rest-api-config.txt
@@ -220,3 +220,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/rest-api-documentation.txt b/Documentation/rest-api-documentation.txt new file mode 100644 index 0000000..9030fac --- /dev/null +++ b/Documentation/rest-api-documentation.txt
@@ -0,0 +1,154 @@ +Gerrit Code Review - /Documentation/ REST API +============================================= + +This page describes the documentation search related REST endpoints. +Please also take note of the general information on the +link:rest-api.html[REST API]. + +Please note that this feature is only usable with documentation built-in. +You'll need to +`buck build :withdocs` +or +`buck build :release` +to test this feature. + +[[documentation-endpoints]] +Documentation Search Endpoints +------------------------------ + +[[search-documentation]] +Search Documentation +~~~~~~~~~~~~~~~~~~~~ +[verse] +'GET /Documentation/' + +With `q` parameter, search our documentation index for the terms. + +A list of link:#doc-result[DocResult] entities is returned describing the +results. + +.Request +---- + GET /Documentation/?q=test HTTP/1.0 +---- + +.Response +---- + HTTP/1.1 200 OK + Content-Disposition: attachment + Content-Type: application/json; charset=UTF-8 + + )]}' + [ + { + "title": "Gerrit Code Review - REST API Developers\u0027 Notes", + "url": "Documentation/dev-rest-api.html" + }, + { + "title": "Gerrit Code Review - REST API", + "url": "Documentation/rest-api.html" + }, + { + "title": "Gerrit Code Review - JavaScript API", + "url": "Documentation/js-api.html" + }, + { + "title": "Gerrit Code Review - /plugins/ REST API", + "url": "Documentation/rest-api-plugins.html" + }, + { + "title": "Gerrit Code Review - /config/ REST API", + "url": "Documentation/rest-api-config.html" + }, + { + "title": "Gerrit Code Review for Git", + "url": "Documentation/index.html" + }, + { + "title": "Gerrit Code Review - /access/ REST API", + "url": "Documentation/rest-api-access.html" + }, + { + "title": "Gerrit Code Review - Plugin Development", + "url": "Documentation/dev-plugins.html" + }, + { + "title": "Gerrit Code Review - Developer Setup", + "url": "Documentation/dev-readme.html" + }, + { + "title": "Gerrit Code Review - Hooks", + "url": "Documentation/config-hooks.html" + }, + { + "title": "Change Screen - Introduction", + "url": "Documentation/intro-change-screen.html" + }, + { + "title": "Gerrit Code Review - /groups/ REST API", + "url": "Documentation/rest-api-groups.html" + }, + { + "title": "Gerrit Code Review - /accounts/ REST API", + "url": "Documentation/rest-api-accounts.html" + }, + { + "title": "Gerrit Code Review - /projects/ REST API", + "url": "Documentation/rest-api-documentation.html" + }, + { + "title": "Gerrit Code Review - /projects/ REST API", + "url": "Documentation/rest-api-projects.html" + }, + { + "title": "Gerrit Code Review - Prolog Submit Rules Cookbook", + "url": "Documentation/prolog-cookbook.html" + }, + { + "title": "Gerrit Code Review - /changes/ REST API", + "url": "Documentation/rest-api-changes.html" + }, + { + "title": "Gerrit Code Review - Configuration", + "url": "Documentation/config-gerrit.html" + }, + { + "title": "Gerrit Code Review - Access Controls", + "url": "Documentation/access-control.html" + }, + { + "title": "Gerrit Code Review - Licenses", + "url": "Documentation/licenses.html" + } + ] +---- + +.Query documentation +**** +get::/Documentation/?q=keyword +**** + + +[[json-entities]] +JSON Entities +------------- + +[[doc-result]] +DocResult +~~~~~~~~~ +The `DocResult` entity contains information about a document. + +[options="header",width="50%",cols="1,^2,4"] +|========================= +|Field Name ||Description +|`title` ||The title of the document. +|`url` ||The URL of the document. +|========================= + + +GERRIT +------ +Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/rest-api-groups.txt b/Documentation/rest-api-groups.txt index 6289e5a..e96607c 100644 --- a/Documentation/rest-api-groups.txt +++ b/Documentation/rest-api-groups.txt
@@ -1239,3 +1239,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/rest-api-plugins.txt b/Documentation/rest-api-plugins.txt index 2cc80f0..f5b6809 100644 --- a/Documentation/rest-api-plugins.txt +++ b/Documentation/rest-api-plugins.txt
@@ -45,12 +45,12 @@ "delete-project": { "kind": "gerritcodereview#plugin", "id": "delete-project", - "version": "2.8-SNAPSHOT" + "version": "2.9-SNAPSHOT" }, "reviewers-by-blame": { "kind": "gerritcodereview#plugin", "id": "reviewers-by-blame", - "version": "2.8-SNAPSHOT", + "version": "2.9-SNAPSHOT", "disabled": true } } @@ -277,3 +277,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/rest-api-projects.txt b/Documentation/rest-api-projects.txt index 35db183..c2e937a 100644 --- a/Documentation/rest-api-projects.txt +++ b/Documentation/rest-api-projects.txt
@@ -552,9 +552,17 @@ Run the Git garbage collection for the repository of a project. +Options for the Git garbage collection can be specified in the +request body as a link:#gc-input[GCInput] entity. + .Request ---- POST /projects/plugins%2Freplication/gc HTTP/1.0 + Content-Type: application/json;charset=UTF-8 + + { + "show_progress": true + } ---- The response is the streamed output of the garbage collection. @@ -1317,6 +1325,19 @@ Tokens such as `${project}` are not resolved. |=========================== +[[gc-input]] +GCInput +~~~~~~~ +The `GCInput` entity contains information to run the Git garbage +collection. + +[options="header",width="50%",cols="1,^2,4"] +|============================= +|Field Name ||Description +|`show_progress` |`false` if not set| +Whether progress information should be shown. +|============================= + [[head-input]] HeadInput ~~~~~~~~~ @@ -1515,3 +1536,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/rest-api.txt b/Documentation/rest-api.txt index 7eed6ef..bedf218 100644 --- a/Documentation/rest-api.txt +++ b/Documentation/rest-api.txt
@@ -23,6 +23,8 @@ Plugin related REST endpoints link:rest-api-projects.html[/projects/]:: Project related REST endpoints +link:rest-api-documentation.html[/Documentation/]:: + Documentation related REST endpoints Protocol Details ---------------- @@ -169,3 +171,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/user-changeid.txt b/Documentation/user-changeid.txt index c13faa6..ca60819 100644 --- a/Documentation/user-changeid.txt +++ b/Documentation/user-changeid.txt
@@ -169,3 +169,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/user-dashboards.txt b/Documentation/user-dashboards.txt index 0945153..1c5162a 100644 --- a/Documentation/user-dashboards.txt +++ b/Documentation/user-dashboards.txt
@@ -169,3 +169,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/user-notify.txt b/Documentation/user-notify.txt index 558dcb5..dd7d4bd 100644 --- a/Documentation/user-notify.txt +++ b/Documentation/user-notify.txt
@@ -145,3 +145,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/user-search.txt b/Documentation/user-search.txt index 7c4ca52..85c0711 100644 --- a/Documentation/user-search.txt +++ b/Documentation/user-search.txt
@@ -74,6 +74,13 @@ Either a legacy numerical 'ID' such as 15183, or a newer style Change-Id that was scraped out of the commit message. +[[conflicts]] +conflicts:'ID':: ++ +Changes that conflict with change 'ID'. Change 'ID' can be specified +as a legacy numerical 'ID' such as 15183, or a newer style Change-Id +that was scraped out of the commit message. + [[owner]] owner:'USER':: + @@ -110,6 +117,12 @@ link:http://www.brics.dk/automaton/[dk.brics.automaton library] is used for evaluation of such patterns. +[[parentproject]] +parentproject:'PROJECT':: ++ +Changes occurring in 'PROJECT' or in one of the child projects of +'PROJECT'. + [[branch]] branch:'BRANCH':: + @@ -454,3 +467,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/user-signedoffby.txt b/Documentation/user-signedoffby.txt index 56858bf..c5ae135 100644 --- a/Documentation/user-signedoffby.txt +++ b/Documentation/user-signedoffby.txt
@@ -175,3 +175,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/user-submodules.txt b/Documentation/user-submodules.txt index 6aab43f..fbf45d7 100644 --- a/Documentation/user-submodules.txt +++ b/Documentation/user-submodules.txt
@@ -187,3 +187,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/Documentation/user-upload.txt b/Documentation/user-upload.txt index cbb152c3..17c4acf 100644 --- a/Documentation/user-upload.txt +++ b/Documentation/user-upload.txt
@@ -366,6 +366,15 @@ git push ssh://john.doe@git.example.com:29418/kernel/common HEAD:refs/for/master%base=$(git rev-parse origin/master) ==== +It is also possible to specify more than one '%base' argument. +This may be useful when pushing a merge commit. Note that the '%' +character has only to be provided once, for the first '%base' +argument: + +==== + git push ssh://john.doe@git.example.com:29418/kernel/common HEAD:refs/for/master%base=commit-id1,base=commit-id2 +==== + repo upload ----------- @@ -445,3 +454,6 @@ GERRIT ------ Part of link:index.html[Gerrit Code Review] + +SEARCHBOX +---------
diff --git a/ReleaseNotes/ReleaseNotes-2.9.txt b/ReleaseNotes/ReleaseNotes-2.9.txt new file mode 100644 index 0000000..e4aa124 --- /dev/null +++ b/ReleaseNotes/ReleaseNotes-2.9.txt
@@ -0,0 +1,79 @@ +Release notes for Gerrit 2.9 +============================ + + +Gerrit 2.9 is now available: + +link:https://gerrit-releases.storage.googleapis.com/gerrit-2.9.war[ +https://gerrit-releases.storage.googleapis.com/gerrit-2.9.war] + + +Schema Change +------------- + + +*WARNING:* This release contains schema changes. To upgrade: +---- + java -jar gerrit.war init -d site_path +---- + +*WARNING:* Upgrading to 2.9.x requires the server be first upgraded to 2.1.7 (or +a later 2.1.x version), and then to 2.9.x. If you are upgrading from 2.2.x.x or +later, you may ignore this warning and upgrade directly to 2.9.x. + + +Release Highlights +------------------ + + +* 'Gerrit Inspector' for interactive inspection and troubleshooting of a running +Gerrit instance. + + +New Features +------------ + + +ssh +~~~ + + +* New `--all-reviewers` option on the `query` command allowing query results +to include information about all reviewers added on the change. + +* New link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/cmd-apropos.html[ +`apropos` command] to search the Gerrit documentation. + + +REST API +~~~~~~~~ + + +Documentation +^^^^^^^^^^^^^ + + +* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/rest-api-documentation#search-documentation.html[ +Search documentation]. + +Daemon +~~~~~~ + + +* link:https://gerrit-documentation.storage.googleapis.com/Documentation/2.9/dev-inspector.html[ +Gerrit Inspector]: interactive Jython shell. ++ +New `-s` option is added to the Daemon to start an interactive Jython shell for inspection and +troubleshooting of live data of the Gerrit instance. + + +Bug Fixes +--------- + + +Configuration +~~~~~~~~~~~~~ + + +* The number of accounts shown on the 'Become Any Account' login +screen is increased from 5 to 100.
diff --git a/ReleaseNotes/index.txt b/ReleaseNotes/index.txt index 28b9f65..effb0d4 100644 --- a/ReleaseNotes/index.txt +++ b/ReleaseNotes/index.txt
@@ -1,6 +1,11 @@ Gerrit Code Review - Release Notes ================================== +[[2_9]] +Version 2.9.x +------------- +* link:ReleaseNotes-2.9.html[2.9] + [[2_8]] Version 2.8.x -------------
diff --git a/VERSION b/VERSION index 23c7033..6a132bb 100644 --- a/VERSION +++ b/VERSION
@@ -2,4 +2,4 @@ # Used by :api_install and :api_deploy targets # when talking to the destination repository. # -GERRIT_VERSION = '2.8-SNAPSHOT' +GERRIT_VERSION = '2.9-SNAPSHOT'
diff --git a/contrib/themes/spotify/static/background-gradient.png b/contrib/themes/spotify/static/background-gradient.png index b40f35b..3b9422e 100644 --- a/contrib/themes/spotify/static/background-gradient.png +++ b/contrib/themes/spotify/static/background-gradient.png Binary files differ
diff --git a/contrib/themes/spotify/static/logo.png b/contrib/themes/spotify/static/logo.png index bfe1fce..c231031 100644 --- a/contrib/themes/spotify/static/logo.png +++ b/contrib/themes/spotify/static/logo.png Binary files differ
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java index 784b461..b24ec47 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java
@@ -55,10 +55,14 @@ } private void beforeTest(Config cfg, boolean memory) throws Exception { - server = GerritServer.start(cfg, memory); + server = startServer(cfg, memory); server.getTestInjector().injectMembers(this); } + protected GerritServer startServer(Config cfg, boolean memory) throws Exception { + return GerritServer.start(cfg, memory); + } + private void afterTest() throws Exception { server.stop(); }
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTestWithSecondaryIndex.java similarity index 64% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTestWithSecondaryIndex.java index a5371d2..7ab5911 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTestWithSecondaryIndex.java
@@ -12,19 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.acceptance; -import com.google.common.collect.Maps; +import org.eclipse.jgit.lib.Config; -import java.util.Map; +public class AbstractDaemonTestWithSecondaryIndex extends AbstractDaemonTest { -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; + @Override + protected GerritServer startServer(Config cfg, boolean memory) + throws Exception { + return GerritServer.start(cfg, memory, true); } }
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 new file mode 100644 index 0000000..63bdfd2 --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/AcceptanceTestRequestScope.java
@@ -0,0 +1,186 @@ +// 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.acceptance; + +import com.google.common.collect.Maps; +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.CurrentUser; +import com.google.gerrit.server.RequestCleanup; +import com.google.gerrit.server.config.RequestScopedReviewDbProvider; +import com.google.gerrit.server.util.RequestContext; +import com.google.gerrit.server.util.ThreadLocalRequestContext; +import com.google.gerrit.server.util.ThreadLocalRequestScopePropagator; +import com.google.gerrit.server.util.TimeUtil; +import com.google.gwtorm.server.SchemaFactory; +import com.google.inject.Inject; +import com.google.inject.Key; +import com.google.inject.OutOfScopeException; +import com.google.inject.Provider; +import com.google.inject.Scope; +import com.google.inject.util.Providers; + +import java.util.Map; + +/** Guice scopes for state during an Acceptance Test connection. */ +public class AcceptanceTestRequestScope { + private static final Key<RequestCleanup> RC_KEY = + Key.get(RequestCleanup.class); + + private static final Key<RequestScopedReviewDbProvider> DB_KEY = + Key.get(RequestScopedReviewDbProvider.class); + + public class Context implements RequestContext { + private final RequestCleanup cleanup = new RequestCleanup(); + private final Map<Key<?>, Object> map = Maps.newHashMap(); + private final SchemaFactory<ReviewDb> schemaFactory; + private final SshSession session; + private final CurrentUser user; + + final long created; + volatile long started; + volatile long finished; + + private Context(SchemaFactory<ReviewDb> sf, SshSession s, + CurrentUser u, long at) { + schemaFactory = sf; + session = s; + user = u; + created = started = finished = at; + map.put(RC_KEY, cleanup); + map.put(DB_KEY, new RequestScopedReviewDbProvider( + schemaFactory, + Providers.of(cleanup))); + } + + private Context(Context p, SshSession s, CurrentUser c) { + this(p.schemaFactory, s, c, p.created); + started = p.started; + finished = p.finished; + } + + SshSession getSession() { + return session; + } + + @Override + public CurrentUser getCurrentUser() { + if (user == null) { + throw new IllegalStateException("user == null, forgot to set it?"); + } + return user; + } + + @Override + public Provider<ReviewDb> getReviewDbProvider() { + return (RequestScopedReviewDbProvider) map.get(DB_KEY); + } + + synchronized <T> T get(Key<T> key, Provider<T> creator) { + @SuppressWarnings("unchecked") + T t = (T) map.get(key); + if (t == null) { + t = creator.get(); + map.put(key, t); + } + return t; + } + } + + static class ContextProvider implements Provider<Context> { + @Override + public Context get() { + return requireContext(); + } + } + + static class SshSessionProvider implements Provider<SshSession> { + @Override + public SshSession get() { + return requireContext().getSession(); + } + } + + static class Propagator extends ThreadLocalRequestScopePropagator<Context> { + private final AcceptanceTestRequestScope atrScope; + + @Inject + Propagator(AcceptanceTestRequestScope atrScope, ThreadLocalRequestContext local, + Provider<RequestScopedReviewDbProvider> dbProviderProvider) { + super(REQUEST, current, local, dbProviderProvider); + this.atrScope = atrScope; + } + + @Override + protected Context continuingContext(Context ctx) { + // The cleanup is not chained, since the RequestScopePropagator executors + // the Context's cleanup when finished executing. + return atrScope.newContinuingContext(ctx); + } + } + + private static final ThreadLocal<Context> current = + new ThreadLocal<Context>(); + + private static Context requireContext() { + final Context ctx = current.get(); + if (ctx == null) { + throw new OutOfScopeException("Not in command/request"); + } + return ctx; + } + + private final ThreadLocalRequestContext local; + + @Inject + AcceptanceTestRequestScope(ThreadLocalRequestContext local) { + this.local = local; + } + + public Context newContext(SchemaFactory<ReviewDb> sf, SshSession s, CurrentUser user) { + return new Context(sf, s, user, TimeUtil.nowMs()); + } + + private Context newContinuingContext(Context ctx) { + return new Context(ctx, ctx.getSession(), ctx.getCurrentUser()); + } + + public Context set(Context ctx) { + Context old = current.get(); + current.set(ctx); + local.setContext(ctx); + return old; + } + + /** Returns exactly one instance per command executed. */ + static final Scope REQUEST = new Scope() { + public <T> Provider<T> scope(final Key<T> key, final Provider<T> creator) { + return new Provider<T>() { + public T get() { + return requireContext().get(key, creator); + } + + @Override + public String toString() { + return String.format("%s[%s]", creator, REQUEST); + } + }; + } + + @Override + public String toString() { + return "Acceptance Test Scope.REQUEST"; + } + }; +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GerritServer.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GerritServer.java index daf9d38..30eb93c 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GerritServer.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/GerritServer.java
@@ -15,10 +15,13 @@ package com.google.gerrit.acceptance; import com.google.common.collect.ImmutableList; +import com.google.gerrit.lucene.LuceneIndexModule; import com.google.gerrit.pgm.Daemon; import com.google.gerrit.pgm.Init; +import com.google.gerrit.pgm.Reindex; import com.google.gerrit.server.config.FactoryModule; import com.google.gerrit.server.config.GerritServerConfig; +import com.google.gerrit.server.index.ChangeSchemas; import com.google.gerrit.server.util.SocketUtil; import com.google.inject.Injector; import com.google.inject.Key; @@ -48,6 +51,12 @@ /** Returns fully started Gerrit server */ static GerritServer start(Config base, boolean memory) throws Exception { + return start(base, memory, false); + } + + /** Returns fully started Gerrit server */ + static GerritServer start(Config base, boolean memory, boolean index) + throws Exception { final CyclicBarrier serverStarted = new CyclicBarrier(2); final Daemon daemon = new Daemon(new Runnable() { public void run() { @@ -69,11 +78,25 @@ mergeTestConfig(cfg); cfg.setBoolean("httpd", null, "requestLog", false); cfg.setBoolean("sshd", null, "requestLog", false); + if (index) { + cfg.setString("index", null, "type", "lucene"); + cfg.setBoolean("index", "lucene", "testInmemory", true); + daemon.setLuceneModule(new LuceneIndexModule( + ChangeSchemas.getLatest().getVersion(), + Runtime.getRuntime().availableProcessors(), null)); + } daemon.setDatabaseForTesting(ImmutableList.<Module>of( new InMemoryTestingDatabaseModule(cfg))); daemon.start(); } else { - site = initSite(base); + Config cfg = base != null ? base : new Config(); + if (index) { + cfg.setString("index", null, "type", "lucene"); + } + site = initSite(cfg); + if (index) { + reindex(site); + } daemonService = Executors.newSingleThreadExecutor(); daemonService.submit(new Callable<Void>() { public Void call() throws Exception { @@ -84,7 +107,7 @@ serverStarted.reset(); } return null; - }; + } }); serverStarted.await(); System.out.println("Gerrit Server Started"); @@ -114,6 +137,15 @@ return tmp; } + /** Runs the reindex command. Works only if the site is not currently running. */ + private static void reindex(File site) throws Exception { + Reindex reindex = new Reindex(); + int rc = reindex.main(new String[] {"-d", site.getPath()}); + if (rc != 0) { + throw new RuntimeException("Reindex failed"); + } + } + private static void mergeTestConfig(Config cfg) throws IOException { InetSocketAddress http = newPort();
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java index 5576c4f..8548b5c 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/InMemoryTestingDatabaseModule.java
@@ -34,7 +34,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmRuntimeException; import com.google.gwtorm.server.SchemaFactory; -import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Provides; import com.google.inject.Singleton; @@ -46,7 +45,7 @@ import java.io.File; -class InMemoryTestingDatabaseModule extends AbstractModule { +class InMemoryTestingDatabaseModule extends LifecycleModule { private final Config cfg; InMemoryTestingDatabaseModule(Config cfg) { @@ -71,12 +70,7 @@ bind(new TypeLiteral<SchemaFactory<ReviewDb>>() {}) .to(InMemoryDatabase.class); - install(new LifecycleModule() { - @Override - protected void configure() { - listener().to(CreateDatabase.class); - } - }); + listener().to(CreateDatabase.class); bind(SitePaths.class); bind(TrackingFooters.class) @@ -126,4 +120,4 @@ mem.drop(); } } -} \ No newline at end of file +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/TestAccount.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/TestAccount.java index b85ffea..31ed136 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/TestAccount.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/TestAccount.java
@@ -58,4 +58,8 @@ server.getHttpAddress().getAddress().getHostAddress(), server.getHttpAddress().getPort()); } + + public Account.Id getId() { + return id; + } }
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/UseGerritConfigAnnotationTest.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/UseGerritConfigAnnotationTest.java index 0931e12..88d46a4 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/UseGerritConfigAnnotationTest.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/UseGerritConfigAnnotationTest.java
@@ -37,7 +37,7 @@ @Test @GerritConfigs({ @GerritConfig(name="x.y", value="z"), - @GerritConfig(name="a.b", value="c"), + @GerritConfig(name="a.b", value="c") }) public void testMultiple() { assertEquals("z", serverConfig.getString("x", null, "y"));
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 new file mode 100644 index 0000000..94e6f6a --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/BUCK
@@ -0,0 +1,6 @@ +include_defs('//gerrit-acceptance-tests/tests.defs') + +acceptance_tests( + srcs = glob(['*IT.java']), + deps = ['//gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git:util'], +)
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 new file mode 100644 index 0000000..dc65470 --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
@@ -0,0 +1,145 @@ +// 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.acceptance.api.change; + +import static com.google.gerrit.acceptance.git.GitUtil.cloneProject; +import static com.google.gerrit.acceptance.git.GitUtil.createProject; +import static com.google.gerrit.acceptance.git.GitUtil.initSsh; + +import com.google.gerrit.acceptance.AbstractDaemonTest; +import com.google.gerrit.acceptance.AcceptanceTestRequestScope; +import com.google.gerrit.acceptance.AccountCreator; +import com.google.gerrit.acceptance.SshSession; +import com.google.gerrit.acceptance.TestAccount; +import com.google.gerrit.acceptance.git.PushOneCommit; +import com.google.gerrit.extensions.api.GerritApi; +import com.google.gerrit.extensions.api.changes.ReviewInput; +import com.google.gerrit.extensions.restapi.ResourceConflictException; +import com.google.gerrit.extensions.restapi.RestApiException; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.IdentifiedUser; +import com.google.gwtorm.server.SchemaFactory; +import com.google.inject.Inject; +import com.google.inject.util.Providers; + +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +public class ChangeIT extends AbstractDaemonTest { + + @Inject + private AccountCreator accounts; + + @Inject + private SchemaFactory<ReviewDb> reviewDbProvider; + + @Inject + private GerritApi gApi; + + @Inject + private AcceptanceTestRequestScope atrScope; + + @Inject + private IdentifiedUser.GenericFactory identifiedUserFactory; + + private TestAccount admin; + private Git git; + private ReviewDb db; + + @Before + public void setUp() throws Exception { + admin = accounts.admin(); + initSsh(admin); + Project.NameKey project = new Project.NameKey("p"); + SshSession sshSession = new SshSession(server, admin); + createProject(sshSession, project.get()); + git = cloneProject(sshSession.getUrl() + "/" + project.get()); + db = reviewDbProvider.open(); + atrScope.set(atrScope.newContext(reviewDbProvider, sshSession, + identifiedUserFactory.create(Providers.of(db), admin.getId()))); + } + + @After + public void cleanup() { + db.close(); + } + + @Test + public void abandon() throws GitAPIException, + IOException, RestApiException { + PushOneCommit.Result r = createChange(); + gApi.changes() + .id("p~master~" + r.getChangeId()) + .abandon(); + } + + @Test + public void restore() throws GitAPIException, + IOException, RestApiException { + PushOneCommit.Result r = createChange(); + gApi.changes() + .id("p~master~" + r.getChangeId()) + .abandon(); + gApi.changes() + .id("p~master~" + r.getChangeId()) + .restore(); + } + + @Test + public void revert() throws GitAPIException, + IOException, RestApiException { + PushOneCommit.Result r = createChange(); + gApi.changes() + .id("p~master~" + r.getChangeId()) + .revision(r.getCommit().name()) + .review(approve()); + gApi.changes() + .id("p~master~" + r.getChangeId()) + .revision(r.getCommit().name()) + .submit(); + gApi.changes() + .id("p~master~" + r.getChangeId()) + .revert(); + } + + // Change is already up to date + @Test(expected = ResourceConflictException.class) + public void rebase() throws GitAPIException, + IOException, RestApiException { + PushOneCommit.Result r = createChange(); + gApi.changes() + .id("p~master~" + r.getChangeId()) + .revision(r.getCommit().name()) + .rebase(); + } + + private PushOneCommit.Result createChange() throws GitAPIException, + IOException { + PushOneCommit push = new PushOneCommit(db, admin.getIdent()); + return push.to(git, "refs/for/master"); + } + + private static ReviewInput approve() { + return new ReviewInput() + .message("Looks good!") + .label("Code-Review", 2); + } +}
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 new file mode 100644 index 0000000..94e6f6a --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/BUCK
@@ -0,0 +1,6 @@ +include_defs('//gerrit-acceptance-tests/tests.defs') + +acceptance_tests( + srcs = glob(['*IT.java']), + deps = ['//gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git:util'], +)
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 new file mode 100644 index 0000000..d60a904 --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
@@ -0,0 +1,143 @@ +// 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.acceptance.api.revision; + +import static com.google.gerrit.acceptance.git.GitUtil.cloneProject; +import static com.google.gerrit.acceptance.git.GitUtil.createProject; +import static com.google.gerrit.acceptance.git.GitUtil.initSsh; + +import com.google.gerrit.acceptance.AbstractDaemonTest; +import com.google.gerrit.acceptance.AcceptanceTestRequestScope; +import com.google.gerrit.acceptance.AccountCreator; +import com.google.gerrit.acceptance.SshSession; +import com.google.gerrit.acceptance.TestAccount; +import com.google.gerrit.acceptance.git.PushOneCommit; +import com.google.gerrit.extensions.api.GerritApi; +import com.google.gerrit.extensions.api.changes.ReviewInput; +import com.google.gerrit.extensions.api.changes.RevisionApi; +import com.google.gerrit.extensions.restapi.RestApiException; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.IdentifiedUser; +import com.google.gwtorm.server.SchemaFactory; +import com.google.inject.Inject; +import com.google.inject.util.Providers; + +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +public class RevisionIT extends AbstractDaemonTest { + + @Inject + private AccountCreator accounts; + + @Inject + private SchemaFactory<ReviewDb> reviewDbProvider; + + @Inject + private GerritApi gApi; + + @Inject + private AcceptanceTestRequestScope atrScope; + + @Inject + private IdentifiedUser.GenericFactory identifiedUserFactory; + + private TestAccount admin; + private Git git; + private ReviewDb db; + + @Before + public void setUp() throws Exception { + admin = accounts.admin(); + initSsh(admin); + Project.NameKey project = new Project.NameKey("p"); + SshSession sshSession = new SshSession(server, admin); + createProject(sshSession, project.get()); + git = cloneProject(sshSession.getUrl() + "/" + project.get()); + db = reviewDbProvider.open(); + atrScope.set(atrScope.newContext(reviewDbProvider, sshSession, + identifiedUserFactory.create(Providers.of(db), admin.getId()))); + } + + @After + public void cleanup() { + db.close(); + } + + @Test + public void reviewTriplet() throws GitAPIException, + IOException, RestApiException { + PushOneCommit.Result r = createChange(); + gApi.changes() + .id("p~master~" + r.getChangeId()) + .revision(r.getCommit().name()) + .review(approve()); + } + + @Test + public void reviewId() throws GitAPIException, + IOException, RestApiException { + PushOneCommit.Result r = createChange(); + gApi.changes() + .id(r.getChangeId()) + .current() + .review(approve()); + } + + @Test + public void submit() throws GitAPIException, + IOException, RestApiException { + PushOneCommit.Result r = createChange(); + RevisionApi rApi = gApi.changes() + .id("p~master~" + r.getChangeId()) + .current(); + rApi.review(approve()); + rApi.submit(); + } + + @Test + public void deleteDraft() throws GitAPIException, + IOException, RestApiException { + PushOneCommit.Result r = createDraft(); + gApi.changes() + .id(r.getChangeId()) + .revision(r.getCommit().name()) + .delete(); + } + + private PushOneCommit.Result createChange() throws GitAPIException, + IOException { + PushOneCommit push = new PushOneCommit(db, admin.getIdent()); + return push.to(git, "refs/for/master"); + } + + private PushOneCommit.Result createDraft() throws GitAPIException, + IOException { + PushOneCommit push = new PushOneCommit(db, admin.getIdent()); + return push.to(git, "refs/drafts/master"); + } + + private static ReviewInput approve() { + return new ReviewInput() + .message("Looks good!") + .label("Code-Review", 2); + } +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/GitUtil.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/GitUtil.java index c17598f..3d1b009 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/GitUtil.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/GitUtil.java
@@ -28,6 +28,7 @@ import org.eclipse.jgit.api.CheckoutCommand; import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.CommitCommand; +import org.eclipse.jgit.api.FetchCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.PushCommand; import org.eclipse.jgit.api.errors.GitAPIException; @@ -105,10 +106,15 @@ } public static Git cloneProject(String url) throws GitAPIException, IOException { + return cloneProject(url, true); + } + + public static Git cloneProject(String url, boolean checkout) throws GitAPIException, IOException { final File gitDir = TempFileUtil.createTempDirectory(); final CloneCommand cloneCmd = Git.cloneRepository(); cloneCmd.setURI(url); cloneCmd.setDirectory(gitDir); + cloneCmd.setNoCheckout(!checkout); return cloneCmd.call(); } @@ -178,6 +184,12 @@ } } + public static void fetch(Git git, String spec) throws GitAPIException { + FetchCommand fetch = git.fetch(); + fetch.setRefSpecs(new RefSpec(spec)); + fetch.call(); + } + public static void checkout(Git git, String name) throws GitAPIException { CheckoutCommand checkout = git.checkout(); checkout.setName(name);
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 1fca451..8b7d091 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
@@ -11,7 +11,11 @@ java_library( name = 'util', - srcs = ['AccountAssert.java', 'AccountInfo.java'], + srcs = [ + 'AccountAssert.java', + 'AccountInfo.java', + 'CapabilityInfo.java', + ], deps = [ '//gerrit-acceptance-tests:lib', '//gerrit-reviewdb:server',
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilitiesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilitiesIT.java new file mode 100644 index 0000000..e22220a --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilitiesIT.java
@@ -0,0 +1,150 @@ +// 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.acceptance.rest.account; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import com.google.gerrit.acceptance.AbstractDaemonTest; +import com.google.gerrit.acceptance.AccountCreator; +import com.google.gerrit.acceptance.RestResponse; +import com.google.gerrit.acceptance.RestSession; +import com.google.gerrit.acceptance.TestAccount; +import com.google.gerrit.common.data.AccessSection; +import com.google.gerrit.common.data.GlobalCapability; +import com.google.gerrit.common.data.Permission; +import com.google.gerrit.common.data.PermissionRule; +import com.google.gerrit.reviewdb.client.AccountGroup; +import com.google.gerrit.server.account.GroupCache; +import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.git.MetaDataUpdate; +import com.google.gerrit.server.git.ProjectConfig; +import com.google.gerrit.server.project.ProjectCache; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.google.inject.Inject; + +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +public class CapabilitiesIT extends AbstractDaemonTest { + + @Inject + private AccountCreator accounts; + + @Inject + private AllProjectsName allProjects; + + @Inject + private MetaDataUpdate.Server metaDataUpdateFactory; + + @Inject + private GroupCache groupCache; + + @Inject + private ProjectCache projectCache; + + private RestSession userSession; + private RestSession adminSession; + + @Before + public void setUp() throws Exception { + TestAccount user = accounts.create("user", "user@example.com", "User"); + TestAccount admin = accounts.admin(); + userSession = new RestSession(server, user); + adminSession = new RestSession(server, admin); + } + + @Test + public void testCapabilitiesUser() throws IOException, + ConfigInvalidException, IllegalArgumentException, + IllegalAccessException, NoSuchFieldException, + SecurityException { + grantAllCapabilities(); + RestResponse r = + userSession.get("/accounts/self/capabilities"); + int code = r.getStatusCode(); + assertEquals(code, 200); + CapabilityInfo info = (new Gson()).fromJson(r.getReader(), + new TypeToken<CapabilityInfo>() {}.getType()); + for (String c: GlobalCapability.getAllNames()) { + if (GlobalCapability.ADMINISTRATE_SERVER.equals(c)) { + assertFalse(info.administrateServer); + } else if (GlobalCapability.PRIORITY.equals(c)) { + assertFalse(info.priority); + } else if (GlobalCapability.QUERY_LIMIT.equals(c)) { + assertEquals(0, info.queryLimit.min); + assertEquals(0, info.queryLimit.max); + } else { + assertTrue(String.format("capability %s was not granted", c), + (Boolean)CapabilityInfo.class.getField(c).get(info)); + } + } + } + + @Test + public void testCapabilitiesAdmin() throws IOException, + ConfigInvalidException, IllegalArgumentException, + IllegalAccessException, NoSuchFieldException, + SecurityException { + RestResponse r = + adminSession.get("/accounts/self/capabilities"); + int code = r.getStatusCode(); + assertEquals(code, 200); + CapabilityInfo info = (new Gson()).fromJson(r.getReader(), + new TypeToken<CapabilityInfo>() {}.getType()); + for (String c: GlobalCapability.getAllNames()) { + if (GlobalCapability.PRIORITY.equals(c)) { + assertFalse(info.priority); + } else if (GlobalCapability.QUERY_LIMIT.equals(c)) { + assertEquals(0, info.queryLimit.min); + assertEquals(500, info.queryLimit.max); + } else if (GlobalCapability.ACCESS_DATABASE.equals(c)) { + assertFalse(info.accessDatabase); + } else if (GlobalCapability.RUN_AS.equals(c)) { + assertFalse(info.runAs); + } else { + assertTrue(String.format("capability %s was not granted", c), + (Boolean)CapabilityInfo.class.getField(c).get(info)); + } + } + } + + private void grantAllCapabilities() throws IOException, + ConfigInvalidException { + MetaDataUpdate md = metaDataUpdateFactory.create(allProjects); + md.setMessage("Make super user"); + ProjectConfig config = ProjectConfig.read(md); + AccessSection s = config.getAccessSection( + AccessSection.GLOBAL_CAPABILITIES); + for (String c: GlobalCapability.getAllNames()) { + if (GlobalCapability.ADMINISTRATE_SERVER.equals(c)) { + continue; + } + Permission p = s.getPermission(c, true); + AccountGroup projectOwnersGroup = groupCache.get( + new AccountGroup.NameKey("Registered Users")); + PermissionRule rule = new PermissionRule( + config.resolve(projectOwnersGroup)); + p.add(rule); + } + config.commit(md); + projectCache.evict(config.getProject()); + } +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilityInfo.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilityInfo.java new file mode 100644 index 0000000..0586fe4 --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/account/CapabilityInfo.java
@@ -0,0 +1,40 @@ +// 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.acceptance.rest.account; + +class CapabilityInfo { + public boolean accessDatabase; + public boolean administrateServer; + public boolean createAccount; + public boolean createGroup; + public boolean createProject; + public boolean emailReviewers; + public boolean flushCaches; + public boolean generateHttpPassword; + public boolean killTask; + public boolean priority; + public QueryLimit queryLimit; + public boolean runAs; + public boolean runGC; + public boolean streamEvents; + public boolean viewCaches; + public boolean viewConnections; + public boolean viewQueue; + + static class QueryLimit { + short min; + short max; + } +}
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 fc2fccd..5e2c0d8 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
@@ -28,6 +28,7 @@ import com.google.gerrit.acceptance.TestAccount; import com.google.gerrit.acceptance.git.GitUtil; import com.google.gerrit.acceptance.git.PushOneCommit; +import com.google.gerrit.extensions.api.changes.ReviewInput; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.client.Project.InheritableBoolean; @@ -171,9 +172,9 @@ } private void approve(String changeId) throws IOException { - RestResponse r = - session.post("/changes/" + changeId + "/revisions/current/review", - ReviewInput.approve()); + RestResponse r = session.post( + "/changes/" + changeId + "/revisions/current/review", + new ReviewInput().label("Code-Review", 2)); assertEquals(HttpStatus.SC_OK, r.getStatusCode()); r.consume(); }
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 20b1033..5172fa9 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
@@ -1,8 +1,26 @@ include_defs('//gerrit-acceptance-tests/tests.defs') +UTIL_SRCS = [ + 'AccountInfo.java', + 'ChangeInfo.java', + 'ChangeMessageInfo.java', + 'GroupInfo.java', + 'ProjectConfigInput.java', + 'SubmitInput.java', + 'SuggestReviewerInfo.java', +] + +SUBMIT_UTIL_SRCS = [ + 'AbstractSubmit.java', + 'AbstractSubmitByMerge.java', +] + +NON_TEST = UTIL_SRCS + SUBMIT_UTIL_SRCS +SUBMIT_TESTS = glob(['Submit*IT.java'], excludes = NON_TEST) +OTHER_TESTS = glob(['*IT.java'], excludes = SUBMIT_TESTS + NON_TEST) + acceptance_tests( - srcs = ['ChangeMessagesIT.java', 'DeleteDraftChangeIT.java', - 'DeleteDraftPatchSetIT.java'], + srcs = OTHER_TESTS, deps = [ ':util', '//gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git:util', @@ -10,18 +28,16 @@ ) acceptance_tests( - srcs = ['SubmitByCherryPickIT.java', 'SubmitByFastForwardIT.java', - 'SubmitByMergeAlwaysIT.java', 'SubmitByMergeIfNecessaryIT.java', - 'SubmitByRebaseIfNecessaryIT.java'], + srcs = SUBMIT_TESTS, deps = [ - ':submit', + ':submit_util', '//gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git:util', ], ) java_library( - name = 'submit', - srcs = ['AbstractSubmit.java', 'AbstractSubmitByMerge.java'], + name = 'submit_util', + srcs = SUBMIT_UTIL_SRCS, deps = [ ':util', '//gerrit-acceptance-tests:lib', @@ -31,9 +47,7 @@ java_library( name = 'util', - srcs = ['AccountInfo.java', 'ChangeInfo.java', 'ChangeMessageInfo.java', - 'GroupInfo.java', 'ProjectConfigInput.java', 'ReviewInput.java', - 'SubmitInput.java', 'SuggestReviewerInfo.java'], + srcs = UTIL_SRCS, deps = [ '//lib:guava', '//gerrit-reviewdb:server',
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConflictsOperatorIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConflictsOperatorIT.java new file mode 100644 index 0000000..1472f38 --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ConflictsOperatorIT.java
@@ -0,0 +1,152 @@ +// 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.acceptance.rest.change; + +import static com.google.gerrit.acceptance.git.GitUtil.checkout; +import static com.google.gerrit.acceptance.git.GitUtil.cloneProject; +import static com.google.gerrit.acceptance.git.GitUtil.initSsh; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.gerrit.acceptance.AbstractDaemonTestWithSecondaryIndex; +import com.google.gerrit.acceptance.AccountCreator; +import com.google.gerrit.acceptance.RestResponse; +import com.google.gerrit.acceptance.RestSession; +import com.google.gerrit.acceptance.SshSession; +import com.google.gerrit.acceptance.TestAccount; +import com.google.gerrit.acceptance.git.GitUtil; +import com.google.gerrit.acceptance.git.PushOneCommit; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.google.gwtorm.server.SchemaFactory; +import com.google.inject.Inject; + +import com.jcraft.jsch.JSchException; + +import org.apache.http.HttpStatus; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.util.Set; + +public class ConflictsOperatorIT extends AbstractDaemonTestWithSecondaryIndex { + + @Inject + private AccountCreator accounts; + + @Inject + private SchemaFactory<ReviewDb> reviewDbProvider; + + private TestAccount admin; + private RestSession session; + private Project.NameKey project; + private ReviewDb db; + private int count; + + @Before + public void setUp() throws Exception { + admin = accounts.admin(); + session = new RestSession(server, admin); + initSsh(admin); + + project = new Project.NameKey("p"); + + db = reviewDbProvider.open(); + } + + @Test + public void noConflictingChanges() throws JSchException, IOException, + GitAPIException { + Git git = createProject(); + PushOneCommit.Result change = createChange(git, true); + createChange(git, false); + + Set<String> changes = queryConflictingChanges(change); + assertEquals(0, changes.size()); + } + + @Test + public void conflictingChanges() throws JSchException, IOException, + GitAPIException { + Git git = createProject(); + PushOneCommit.Result change = createChange(git, true); + PushOneCommit.Result conflictingChange1 = createChange(git, true); + PushOneCommit.Result conflictingChange2 = createChange(git, true); + createChange(git, false); + + Set<String> changes = queryConflictingChanges(change); + assertChanges(changes, conflictingChange1, conflictingChange2); + } + + private Git createProject() throws JSchException, IOException, + GitAPIException { + SshSession sshSession = new SshSession(server, admin); + try { + GitUtil.createProject(sshSession, project.get(), null, true); + return cloneProject(sshSession.getUrl() + "/" + project.get()); + } finally { + sshSession.close(); + } + } + + private PushOneCommit.Result createChange(Git git, boolean conflicting) + throws GitAPIException, IOException { + checkout(git, "origin/master"); + String file = conflicting ? "test.txt" : "test-" + count + ".txt"; + PushOneCommit push = + new PushOneCommit(db, admin.getIdent(), "Change " + count, file, + "content " + count); + count++; + return push.to(git, "refs/for/master"); + } + + private Set<String> queryConflictingChanges(PushOneCommit.Result change) + throws IOException { + RestResponse r = + session.get("/changes/?q=conflicts:" + change.getChangeId()); + assertEquals(HttpStatus.SC_OK, r.getStatusCode()); + Set<ChangeInfo> changes = + (new Gson()).fromJson(r.getReader(), + new TypeToken<Set<ChangeInfo>>() {}.getType()); + r.consume(); + return ImmutableSet.copyOf(Iterables.transform(changes, + new Function<ChangeInfo, String>() { + @Override + public String apply(ChangeInfo input) { + return input.id; + } + })); + } + + private void assertChanges(Set<String> actualChanges, + PushOneCommit.Result... expectedChanges) { + assertEquals(expectedChanges.length, actualChanges.size()); + for (PushOneCommit.Result c : expectedChanges) { + assertTrue(actualChanges.contains(id(c))); + } + } + + private String id(PushOneCommit.Result change) { + return project.get() + "~master~" + change.getChangeId(); + } +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java index 1ed4d61..8655b30 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/SuggestReviewersIT.java
@@ -97,7 +97,7 @@ @GerritConfigs( {@GerritConfig(name = "suggest.accounts", value = "true"), @GerritConfig(name = "suggest.from", value = "1"), - @GerritConfig(name = "accounts.visibility", value = "NONE"), + @GerritConfig(name = "accounts.visibility", value = "NONE") }) public void suggestReviewersNoResult2() throws GitAPIException, IOException, Exception {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java index 7057a4f..69adedd 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/GarbageCollectionIT.java
@@ -67,6 +67,7 @@ project2 = new Project.NameKey("p2"); createProject(sshSession, project2.get()); + sshSession.close(); session = new RestSession(server, admin); }
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 bf8aac1b..e7440e8 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
@@ -74,6 +74,7 @@ createProject(sshSession, p1.get()); Project.NameKey p2 = new Project.NameKey("p2"); createProject(sshSession, p2.get()); + sshSession.close(); assertEquals(HttpStatus.SC_NOT_FOUND, GET("/projects/" + p1.get() + "/children/" + p2.get()).getStatusCode()); } @@ -83,6 +84,7 @@ SshSession sshSession = new SshSession(server, admin); Project.NameKey child = new Project.NameKey("p1"); createProject(sshSession, child.get()); + sshSession.close(); RestResponse r = GET("/projects/" + allProjects.get() + "/children/" + child.get()); assertEquals(HttpStatus.SC_OK, r.getStatusCode()); ProjectInfo childInfo = @@ -98,6 +100,7 @@ createProject(sshSession, child.get()); Project.NameKey grandChild = new Project.NameKey("p1.1"); createProject(sshSession, grandChild.get(), child); + sshSession.close(); assertEquals(HttpStatus.SC_NOT_FOUND, GET("/projects/" + allProjects.get() + "/children/" + grandChild.get()) .getStatusCode()); @@ -111,6 +114,7 @@ createProject(sshSession, child.get()); Project.NameKey grandChild = new Project.NameKey("p1.1"); createProject(sshSession, grandChild.get(), child); + sshSession.close(); RestResponse r = GET("/projects/" + allProjects.get() + "/children/" + grandChild.get() + "?recursive");
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java index 4778662..69bbfda 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ListBranchesIT.java
@@ -99,6 +99,7 @@ @After public void cleanup() { + sshSession.close(); db.close(); }
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 c03ecd3..5feca06 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
@@ -84,6 +84,7 @@ Project.NameKey child2 = new Project.NameKey("p2"); createProject(sshSession, child2.get()); createProject(sshSession, "p1.1", child1); + sshSession.close(); RestResponse r = GET("/projects/" + allProjects.get() + "/children/"); assertEquals(HttpStatus.SC_OK, r.getStatusCode()); @@ -107,6 +108,7 @@ createProject(sshSession, child1_1_1.get(), child1_1); Project.NameKey child1_1_1_1 = new Project.NameKey("p1.1.1.1"); createProject(sshSession, child1_1_1_1.get(), child1_1_1); + sshSession.close(); RestResponse r = GET("/projects/" + child1.get() + "/children/?recursive"); assertEquals(HttpStatus.SC_OK, r.getStatusCode());
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java new file mode 100644 index 0000000..9fd7568 --- /dev/null +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/project/ProjectLevelConfigIT.java
@@ -0,0 +1,147 @@ +// 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.acceptance.rest.project; + +import static com.google.gerrit.acceptance.git.GitUtil.checkout; +import static com.google.gerrit.acceptance.git.GitUtil.cloneProject; +import static com.google.gerrit.acceptance.git.GitUtil.createProject; +import static com.google.gerrit.acceptance.git.GitUtil.fetch; +import static com.google.gerrit.acceptance.git.GitUtil.initSsh; +import static org.junit.Assert.assertEquals; + +import com.google.gerrit.acceptance.AbstractDaemonTest; +import com.google.gerrit.acceptance.AccountCreator; +import com.google.gerrit.acceptance.SshSession; +import com.google.gerrit.acceptance.TestAccount; +import com.google.gerrit.acceptance.git.PushOneCommit; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.config.AllProjectsNameProvider; +import com.google.gerrit.server.git.GitRepositoryManager; +import com.google.gerrit.server.project.ProjectCache; +import com.google.gerrit.server.project.ProjectState; +import com.google.gwtorm.server.SchemaFactory; +import com.google.inject.Inject; + +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Config; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; + +public class ProjectLevelConfigIT extends AbstractDaemonTest { + + @Inject + private AccountCreator accounts; + + @Inject + private SchemaFactory<ReviewDb> reviewDbProvider; + + @Inject + private ProjectCache projectCache; + + @Inject + private AllProjectsNameProvider allProjects; + + private ReviewDb db; + private TestAccount admin; + private SshSession sshSession; + private String project; + private Git git; + + @Before + public void setUp() throws Exception { + admin = accounts.admin(); + initSsh(admin); + sshSession = new SshSession(server, admin); + + project = "p"; + createProject(sshSession, project, null, true); + git = cloneProject(sshSession.getUrl() + "/" + project); + fetch(git, GitRepositoryManager.REF_CONFIG + ":refs/heads/config"); + checkout(git, "refs/heads/config"); + + db = reviewDbProvider.open(); + } + + @After + public void cleanup() { + db.close(); + } + + @Test + public void accessProjectSpecificConfig() throws GitAPIException, IOException { + String configName = "test.config"; + Config cfg = new Config(); + cfg.setString("s1", null, "k1", "v1"); + cfg.setString("s2", "ss", "k2", "v2"); + PushOneCommit push = + new PushOneCommit(db, admin.getIdent(), "Create Project Level Config", + configName, cfg.toText()); + push.to(git, GitRepositoryManager.REF_CONFIG); + + ProjectState state = projectCache.get(new Project.NameKey(project)); + assertEquals(cfg.toText(), state.getConfig(configName).get().toText()); + } + + @Test + public void nonExistingConfig() { + ProjectState state = projectCache.get(new Project.NameKey(project)); + assertEquals("", state.getConfig("test.config").get().toText()); + } + + @Test + public void withInheritance() throws GitAPIException, IOException { + String configName = "test.config"; + + Config parentCfg = new Config(); + parentCfg.setString("s1", null, "k1", "parentValue1"); + parentCfg.setString("s1", null, "k2", "parentValue2"); + parentCfg.setString("s2", "ss", "k3", "parentValue3"); + parentCfg.setString("s2", "ss", "k4", "parentValue4"); + + Git parentGit = + cloneProject(sshSession.getUrl() + "/" + allProjects.get().get(), false); + fetch(parentGit, GitRepositoryManager.REF_CONFIG + ":refs/heads/config"); + checkout(parentGit, "refs/heads/config"); + PushOneCommit push = + new PushOneCommit(db, admin.getIdent(), "Create Project Level Config", + configName, parentCfg.toText()); + push.to(parentGit, GitRepositoryManager.REF_CONFIG); + + Config cfg = new Config(); + cfg.setString("s1", null, "k1", "childValue1"); + cfg.setString("s2", "ss", "k3", "childValue2"); + push = new PushOneCommit(db, admin.getIdent(), "Create Project Level Config", + configName, cfg.toText()); + push.to(git, GitRepositoryManager.REF_CONFIG); + + ProjectState state = projectCache.get(new Project.NameKey(project)); + + Config expectedCfg = new Config(); + expectedCfg.setString("s1", null, "k1", "childValue1"); + expectedCfg.setString("s1", null, "k2", "parentValue2"); + expectedCfg.setString("s2", "ss", "k3", "childValue2"); + expectedCfg.setString("s2", "ss", "k4", "parentValue4"); + + assertEquals(expectedCfg.toText(), state.getConfig(configName) + .getWithInheritance().toText()); + + assertEquals(cfg.toText(), state.getConfig(configName).get().toText()); + } +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java index f10258c..24b9f51 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/GarbageCollectionIT.java
@@ -35,6 +35,7 @@ import com.jcraft.jsch.JSchException; +import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -83,6 +84,11 @@ createProject(sshSession, project3.get()); } + @After + public void cleanup() { + sshSession.close(); + } + @Test @UseLocalDisk public void testGc() throws JSchException, IOException { @@ -110,6 +116,7 @@ SshSession s = new SshSession(server, accounts.create("user", "user@example.com", "User")); s.exec("gerrit gc --all"); assertError("Capability runGC is required to access this resource", s.getError()); + s.close(); } @Test
diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/DefaultCacheFactory.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/DefaultCacheFactory.java index 1c850d1..4478cc9 100644 --- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/DefaultCacheFactory.java +++ b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/DefaultCacheFactory.java
@@ -27,7 +27,6 @@ import com.google.gerrit.server.cache.PersistentCacheFactory; import com.google.gerrit.server.cache.h2.H2CacheImpl.ValueHolder; import com.google.gerrit.server.config.ConfigUtil; -import com.google.gerrit.server.config.FactoryModule; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; @@ -39,13 +38,7 @@ public static class Module extends LifecycleModule { @Override protected void configure() { - install(new FactoryModule() { - @Override - protected void configure() { - factory(ForwardingRemovalListener.Factory.class); - } - }); - + factory(ForwardingRemovalListener.Factory.class); bind(DefaultCacheFactory.class); bind(MemoryCacheFactory.class).to(DefaultCacheFactory.class); bind(PersistentCacheFactory.class).to(H2CacheFactory.class);
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/changes/Side.java b/gerrit-common/src/main/java/com/google/gerrit/common/changes/Side.java index 777467d..4a9ddf8 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/changes/Side.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/changes/Side.java
@@ -16,5 +16,5 @@ /** The side on which a comment was added. */ public enum Side { - PARENT, REVISION; + PARENT, REVISION } \ No newline at end of file
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 69263d9..b5e2b2f 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
@@ -269,4 +269,24 @@ public int hashCode() { return name.hashCode(); } + + @Override + public String toString() { + StringBuilder bldr = new StringBuilder(); + bldr.append(name) + .append(" "); + if (exclusiveGroup) { + bldr.append("[exclusive] "); + } + bldr.append("["); + Iterator<PermissionRule> it = getRules().iterator(); + while (it.hasNext()) { + bldr.append(it.next()); + if (it.hasNext()) { + bldr.append(", "); + } + } + bldr.append("]"); + return bldr.toString(); + } }
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java index a7a66b1..bd05baf 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRule.java
@@ -20,7 +20,7 @@ public static enum Action { ALLOW, DENY, BLOCK, - INTERACTIVE, BATCH; + INTERACTIVE, BATCH } protected Action action = Action.ALLOW;
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAccess.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAccess.java index ee6cc95..dd6c22b 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAccess.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAccess.java
@@ -28,6 +28,7 @@ protected Set<String> ownerOf; protected boolean isConfigVisible; protected boolean canUpload; + protected boolean canChangeParent; protected LabelTypes labelTypes; protected Map<String, String> capabilities; @@ -107,6 +108,14 @@ this.canUpload = canUpload; } + public boolean canChangeParent() { + return canChangeParent; + } + + public void setCanChangeParent(boolean canChangeParent) { + this.canChangeParent = canChangeParent; + } + public LabelTypes getLabelTypes() { return labelTypes; }
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java index 44f60861..652acac 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ProjectAdminService.java
@@ -33,11 +33,11 @@ @Audit @SignInRequired void changeProjectAccess(Project.NameKey projectName, String baseRevision, - String message, List<AccessSection> sections, + String message, List<AccessSection> sections, Project.NameKey parentProjectName, AsyncCallback<ProjectAccess> callback); @SignInRequired void reviewProjectAccess(Project.NameKey projectName, String baseRevision, - String message, List<AccessSection> sections, + String message, List<AccessSection> sections, Project.NameKey parentProjectName, AsyncCallback<Change.Id> callback); }
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ReviewerInfo.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ReviewerInfo.java index 063f13b..28a8340 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ReviewerInfo.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ReviewerInfo.java
@@ -51,7 +51,7 @@ if (accountInfo.getPreferredEmail() != null) { return accountInfo.getPreferredEmail(); } - return accountInfo.getFullName().toString(); + return accountInfo.getFullName(); } return groupReference.getName(); }
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitRecord.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitRecord.java index 365f6a9..0d02fe0 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitRecord.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/SubmitRecord.java
@@ -37,7 +37,7 @@ * <p> * Additional detail may be available in {@link SubmitRecord#errorMessage}. */ - RULE_ERROR; + RULE_ERROR } public Status status; @@ -78,7 +78,7 @@ * The likely cause is access has not been granted correctly by the * project owner or site administrator. */ - IMPOSSIBLE; + IMPOSSIBLE } public String label;
diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/errors/UpdateParentFailedException.java b/gerrit-common/src/main/java/com/google/gerrit/common/errors/UpdateParentFailedException.java new file mode 100644 index 0000000..320d055 --- /dev/null +++ b/gerrit-common/src/main/java/com/google/gerrit/common/errors/UpdateParentFailedException.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.common.errors; + +/** Error indicating that updating a parent project failed. */ +public class UpdateParentFailedException extends Exception { + private static final long serialVersionUID = 1L; + + public static final String MESSAGE = "Update Parent Project Failed: "; + + public UpdateParentFailedException(final String message, + final Throwable why) { + super(MESSAGE + ": " + message, why); + } +}
diff --git a/gerrit-common/src/test/java/com/google/gerrit/common/data/EncodePathSeparatorTest.java b/gerrit-common/src/test/java/com/google/gerrit/common/data/EncodePathSeparatorTest.java index e00fa48..7c662ae 100644 --- a/gerrit-common/src/test/java/com/google/gerrit/common/data/EncodePathSeparatorTest.java +++ b/gerrit-common/src/test/java/com/google/gerrit/common/data/EncodePathSeparatorTest.java
@@ -14,10 +14,12 @@ package com.google.gerrit.common.data; -import junit.framework.TestCase; +import org.junit.Test; +import static org.junit.Assert.assertEquals; -public class EncodePathSeparatorTest extends TestCase { +public class EncodePathSeparatorTest { + @Test public void testDefaultBehaviour() { GitWebType gitWebType = GitWebType.fromName(null); @@ -25,6 +27,7 @@ assertEquals("a/b", gitWebType.replacePathSeparator("a/b")); } + @Test public void testExclamationMark() { GitWebType gitWebType = GitWebType.fromName(null);
diff --git a/gerrit-common/src/test/java/com/google/gerrit/common/data/ParameterizedStringTest.java b/gerrit-common/src/test/java/com/google/gerrit/common/data/ParameterizedStringTest.java index a2d1279..5000211 100644 --- a/gerrit-common/src/test/java/com/google/gerrit/common/data/ParameterizedStringTest.java +++ b/gerrit-common/src/test/java/com/google/gerrit/common/data/ParameterizedStringTest.java
@@ -14,12 +14,17 @@ package com.google.gerrit.common.data; -import junit.framework.TestCase; +import org.junit.Test; import java.util.HashMap; import java.util.Map; -public class ParameterizedStringTest extends TestCase { +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class ParameterizedStringTest { + @Test public void testEmptyString() { final ParameterizedString p = new ParameterizedString(""); assertEquals("", p.getPattern()); @@ -32,6 +37,7 @@ assertEquals("", p.replace(a)); } + @Test public void testAsis1() { final ParameterizedString p = ParameterizedString.asis("${bar}c"); assertEquals("${bar}c", p.getPattern()); @@ -45,6 +51,7 @@ assertEquals("${bar}c", p.replace(a)); } + @Test public void testReplace1() { final ParameterizedString p = new ParameterizedString("${bar}c"); assertEquals("${bar}c", p.getPattern()); @@ -60,6 +67,7 @@ assertEquals("frobinatorc", p.replace(a)); } + @Test public void testReplace2() { final ParameterizedString p = new ParameterizedString("a${bar}c"); assertEquals("a${bar}c", p.getPattern()); @@ -75,6 +83,7 @@ assertEquals("afrobinatorc", p.replace(a)); } + @Test public void testReplace3() { final ParameterizedString p = new ParameterizedString("a${bar}"); assertEquals("a${bar}", p.getPattern()); @@ -90,6 +99,7 @@ assertEquals("afrobinator", p.replace(a)); } + @Test public void testReplace4() { final ParameterizedString p = new ParameterizedString("a${bar}c"); assertEquals("a${bar}c", p.getPattern()); @@ -104,6 +114,7 @@ assertEquals("ac", p.replace(a)); } + @Test public void testReplaceToLowerCase() { final ParameterizedString p = new ParameterizedString("${a.toLowerCase}"); assertEquals(1, p.getParameterNames().size()); @@ -124,6 +135,7 @@ assertEquals("foo", p.replace(a)); } + @Test public void testReplaceToUpperCase() { final ParameterizedString p = new ParameterizedString("${a.toUpperCase}"); assertEquals(1, p.getParameterNames().size()); @@ -144,6 +156,7 @@ assertEquals("FOO", p.replace(a)); } + @Test public void testReplaceLocalName() { final ParameterizedString p = new ParameterizedString("${a.localPart}"); assertEquals(1, p.getParameterNames().size()); @@ -164,6 +177,7 @@ assertEquals("foo", p.replace(a)); } + @Test public void testUndefinedFunctionName() { ParameterizedString p = new ParameterizedString( @@ -183,6 +197,7 @@ assertEquals("hi, FIRSTNAME LASTNAME,your eamil address is 'firstname.lastname'.right?", p.replace(a)); } + @Test public void testReplaceToUpperCaseToLowerCase() { final ParameterizedString p = new ParameterizedString("${a.toUpperCase.toLowerCase}"); @@ -204,6 +219,7 @@ assertEquals("foo@example.com", p.replace(a)); } + @Test public void testReplaceToUpperCaseLocalName() { final ParameterizedString p = new ParameterizedString("${a.toUpperCase.localPart}"); @@ -225,6 +241,7 @@ assertEquals("FOO", p.replace(a)); } + @Test public void testReplaceToUpperCaseAnUndefinedMethod() { final ParameterizedString p = new ParameterizedString("${a.toUpperCase.anUndefinedMethod}"); @@ -246,6 +263,7 @@ assertEquals("FOO@EXAMPLE.COM", p.replace(a)); } + @Test public void testReplaceLocalNameToUpperCase() { final ParameterizedString p = new ParameterizedString("${a.localPart.toUpperCase}"); @@ -267,6 +285,7 @@ assertEquals("FOO", p.replace(a)); } + @Test public void testReplaceLocalNameToLowerCase() { final ParameterizedString p = new ParameterizedString("${a.localPart.toLowerCase}"); @@ -288,6 +307,7 @@ assertEquals("foo", p.replace(a)); } + @Test public void testReplaceLocalNameAnUndefinedMethod() { final ParameterizedString p = new ParameterizedString("${a.localPart.anUndefinedMethod}"); @@ -309,6 +329,7 @@ assertEquals("foo", p.replace(a)); } + @Test public void testReplaceToLowerCaseToUpperCase() { final ParameterizedString p = new ParameterizedString("${a.toLowerCase.toUpperCase}"); @@ -330,6 +351,7 @@ assertEquals("FOO@EXAMPLE.COM", p.replace(a)); } + @Test public void testReplaceToLowerCaseLocalName() { final ParameterizedString p = new ParameterizedString("${a.toLowerCase.localPart}"); @@ -351,6 +373,7 @@ assertEquals("foo", p.replace(a)); } + @Test public void testReplaceToLowerCaseAnUndefinedMethod() { final ParameterizedString p = new ParameterizedString("${a.toLowerCase.anUndefinedMethod}");
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/CapabilityScope.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/CapabilityScope.java index ede8b8c..85f7d15 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/CapabilityScope.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/CapabilityScope.java
@@ -32,5 +32,5 @@ PLUGIN, /** Scope is the core server. */ - CORE; + CORE }
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginCanonicalWebUrl.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginCanonicalWebUrl.java new file mode 100644 index 0000000..fd14429 --- /dev/null +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/annotations/PluginCanonicalWebUrl.java
@@ -0,0 +1,42 @@ +// 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.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 a String containing the plugin canonical web URL. + * <p> + * A plugin or extension may receive this string by Guice injection to discover + * the canonical web URL under which the plugin is available: + * + * <pre> + * @Inject + * MyType(@PluginCanonicalWebUrl String myUrl) { + * ... + * } + * </pre> + */ +@Target({ElementType.PARAMETER, ElementType.FIELD}) +@Retention(RUNTIME) +@BindingAnnotation +public @interface PluginCanonicalWebUrl { +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java similarity index 63% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java index a5371d2..bde58995 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/GerritApi.java
@@ -12,19 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.extensions.api; -import com.google.common.collect.Maps; +import com.google.gerrit.extensions.api.changes.Changes; -import java.util.Map; - -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; - } +public interface GerritApi { + public Changes changes(); }
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AbandonInput.java similarity index 63% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AbandonInput.java index a5371d2..04a7bc7 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/AbandonInput.java
@@ -12,19 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.extensions.api.changes; -import com.google.common.collect.Maps; +import com.google.gerrit.extensions.restapi.DefaultInput; -import java.util.Map; - -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; - } +public class AbandonInput { + @DefaultInput + public String message; } +
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 new file mode 100644 index 0000000..a264009 --- /dev/null +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
@@ -0,0 +1,34 @@ +// 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.extensions.api.changes; + +import com.google.gerrit.extensions.restapi.RestApiException; + +public interface ChangeApi { + String id(); + + RevisionApi current() throws RestApiException; + RevisionApi revision(int id) throws RestApiException; + RevisionApi revision(String id) throws RestApiException; + + void abandon() throws RestApiException; + void abandon(AbandonInput in) throws RestApiException; + + void restore() throws RestApiException; + void restore(RestoreInput in) throws RestApiException; + + ChangeApi revert() throws RestApiException; + ChangeApi revert(RevertInput in) throws RestApiException; +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java similarity index 63% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java index a5371d2..48e9fd3 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/Changes.java
@@ -12,19 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.extensions.api.changes; -import com.google.common.collect.Maps; +import com.google.gerrit.extensions.restapi.RestApiException; -import java.util.Map; - -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; - } +public interface Changes { + ChangeApi id(int id) throws RestApiException; + ChangeApi id(String triplet) throws RestApiException; + ChangeApi id(String project, String branch, String id) + throws RestApiException; }
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RestoreInput.java similarity index 63% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RestoreInput.java index a5371d2..a116dde 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RestoreInput.java
@@ -12,19 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.extensions.api.changes; -import com.google.common.collect.Maps; +import com.google.gerrit.extensions.restapi.DefaultInput; -import java.util.Map; - -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; - } +public class RestoreInput { + @DefaultInput + public String message; } +
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevertInput.java similarity index 63% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevertInput.java index a5371d2..2c1c688 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevertInput.java
@@ -12,19 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.extensions.api.changes; -import com.google.common.collect.Maps; +import com.google.gerrit.extensions.restapi.DefaultInput; -import java.util.Map; - -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; - } +public class RevertInput { + @DefaultInput + public String message; }
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 new file mode 100644 index 0000000..5f106fc --- /dev/null +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ReviewInput.java
@@ -0,0 +1,116 @@ +// 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.extensions.api.changes; + +import com.google.gerrit.extensions.restapi.DefaultInput; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** Input passed to {@code POST /changes/{id}/revisions/{id}/review}. */ +public class ReviewInput { + @DefaultInput + public String message; + + public Map<String, Short> labels; + public Map<String, List<Comment>> comments; + + /** + * If true require all labels to be within the user's permitted ranges based + * on access controls, attempting to use a label not granted to the user + * will fail the entire modify operation early. If false the operation will + * execute anyway, but the proposed labels given by the user will be + * modified to be the "best" value allowed by the access controls, or + * ignored if the label does not exist. + */ + public boolean strictLabels = true; + + /** + * How to process draft comments already in the database that were not also + * described in this input request. + */ + public DraftHandling drafts = DraftHandling.DELETE; + + /** Who to send email notifications to after review is stored. */ + public NotifyHandling notify = NotifyHandling.ALL; + + /** + * Account ID, name, email address or username of another user. The review + * will be posted/updated on behalf of this named user instead of the + * caller. Caller must have the labelAs-$NAME permission granted for each + * label that appears in {@link #labels}. This is in addition to the named + * user also needing to have permission to use the labels. + * <p> + * {@link #strictLabels} impacts how labels is processed for the named user, + * not the caller. + */ + public String onBehalfOf; + + public static enum DraftHandling { + DELETE, PUBLISH, KEEP + } + + public static enum NotifyHandling { + NONE, OWNER, OWNER_REVIEWERS, ALL + } + + public static enum Side { + PARENT, REVISION + } + + public static class Comment { + public String id; + public Side side; + public int line; + public String inReplyTo; + public String message; + public Range range; + + public static class Range { + public int startLine; + public int startCharacter; + public int endLine; + public int endCharacter; + } + } + + public ReviewInput message(String msg) { + message = msg != null && !msg.isEmpty() ? msg : null; + return this; + } + + public ReviewInput label(String name, short value) { + if (name == null || name.isEmpty()) { + throw new IllegalArgumentException(); + } + if (labels == null) { + labels = new LinkedHashMap<String, Short>(4); + } + labels.put(name, value); + return this; + } + + public ReviewInput label(String name, int value) { + if (value < Short.MIN_VALUE || value > Short.MAX_VALUE) { + throw new IllegalArgumentException(); + } + return label(name, (short) value); + } + + public ReviewInput label(String name) { + return label(name, (short) 1); + } +}
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 new file mode 100644 index 0000000..ff4a94e --- /dev/null +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/RevisionApi.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.extensions.api.changes; + +import com.google.gerrit.extensions.restapi.RestApiException; + +public interface RevisionApi { + void delete() throws RestApiException; + void rebase() throws RestApiException; + void review(ReviewInput in) throws RestApiException; + + /** {@code submit} with {@link SubmitInput#waitForMerge} set to true. */ + void submit() throws RestApiException; + void submit(SubmitInput in) throws RestApiException; +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmitInput.java similarity index 63% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmitInput.java index a5371d2..91e3c70 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/SubmitInput.java
@@ -12,19 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.extensions.api.changes; -import com.google.common.collect.Maps; - -import java.util.Map; - -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; - } +public class SubmitInput { + public boolean waitForMerge; }
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadScheme.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadScheme.java index 20eda97..d81657a 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadScheme.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/config/DownloadScheme.java
@@ -30,9 +30,7 @@ public abstract boolean isAuthRequired(); /** @return whether this scheme supports authentication */ - public boolean isAuthSupported() { - return isAuthRequired(); - } + public abstract boolean isAuthSupported(); /** @return whether the download scheme is enabled */ public abstract boolean isEnabled();
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/CacheControl.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/CacheControl.java index 72f1bc5..3aa1781 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/CacheControl.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/CacheControl.java
@@ -19,7 +19,7 @@ public class CacheControl { public enum Type { - NONE, PUBLIC, PRIVATE; + NONE, PUBLIC, PRIVATE } public static final CacheControl NONE = new CacheControl(Type.NONE, 0, null);
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiException.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiException.java index 3fae128..b6ba730 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiException.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiException.java
@@ -15,7 +15,7 @@ package com.google.gerrit.extensions.restapi; /** Root exception type for JSON API failures. */ -public abstract class RestApiException extends Exception { +public class RestApiException extends Exception { private static final long serialVersionUID = 1L; private CacheControl caching = CacheControl.NONE;
diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/ServerInformation.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/ServerInformation.java index 3d2df21..c7deedb 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/ServerInformation.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/systemstatus/ServerInformation.java
@@ -35,7 +35,7 @@ * The server is attempting a graceful halt of operations and will exit (or * be killed by the operating system) soon. */ - SHUTDOWN; + SHUTDOWN } State getState();
diff --git a/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritDebugLauncher.java b/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritDebugLauncher.java index a2a770e..5770f58 100644 --- a/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritDebugLauncher.java +++ b/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritDebugLauncher.java
@@ -368,7 +368,7 @@ AbstractConnector connector = getConnector(); if (bindAddress != null) { - connector.setHost(bindAddress.toString()); + connector.setHost(bindAddress); } connector.setPort(port);
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressBar.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressBar.java index 5e13f55..931e84e 100644 --- a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressBar.java +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/progress/client/ProgressBar.java
@@ -71,7 +71,7 @@ public void setValue(final int pComplete) { assert 0 <= pComplete && pComplete <= 100; value = pComplete; - bar.setWidth("" + (2 * pComplete) + "px"); + bar.setWidth(2 * pComplete + "px"); msg.setText(callerText + pComplete + "%"); } }
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/LinkFindReplaceTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/LinkFindReplaceTest.java index 97f816f..0d8336e 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/LinkFindReplaceTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/LinkFindReplaceTest.java
@@ -15,10 +15,15 @@ package com.google.gwtexpui.safehtml.client; import static com.google.gwtexpui.safehtml.client.LinkFindReplace.hasValidScheme; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; -import junit.framework.TestCase; +import org.junit.Test; -public class LinkFindReplaceTest extends TestCase { +public class LinkFindReplaceTest { + @Test public void testNoEscaping() { String find = "find"; String link = "link"; @@ -28,12 +33,14 @@ assertEquals("find = " + find + ", link = " + link, a.toString()); } + @Test public void testBackreference() { assertEquals("<a href=\"/bug?id=123\">issue 123</a>", new LinkFindReplace("(bug|issue)\\s*([0-9]+)", "/bug?id=$2") .replace("issue 123")); } + @Test public void testHasValidScheme() { assertTrue(hasValidScheme("/absolute/path")); assertTrue(hasValidScheme("relative/path")); @@ -46,6 +53,7 @@ assertFalse(hasValidScheme("javascript:alert(1)")); } + @Test public void testInvalidSchemeInReplace() { try { new LinkFindReplace("find", "javascript:alert(1)").replace("find"); @@ -54,6 +62,7 @@ } } + @Test public void testInvalidSchemeWithBackreference() { try { new LinkFindReplace(".*(script:[^;]*)", "java$1") @@ -63,11 +72,13 @@ } } + @Test public void testReplaceEscaping() { assertEquals("<a href=\"a"&'<>b\">find</a>", new LinkFindReplace("find", "a\"&'<>b").replace("find")); } + @Test public void testHtmlInFind() { String rawFind = "<b>"bold"</b>"; LinkFindReplace a = new LinkFindReplace(rawFind, "/bold");
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/RawFindReplaceTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/RawFindReplaceTest.java index 9c450bd..bc20a9d 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/RawFindReplaceTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/RawFindReplaceTest.java
@@ -14,9 +14,11 @@ package com.google.gwtexpui.safehtml.client; -import junit.framework.TestCase; +import org.junit.Test; +import static org.junit.Assert.assertEquals; -public class RawFindReplaceTest extends TestCase { +public class RawFindReplaceTest { + @Test public void testFindReplace() { final String find = "find"; final String replace = "replace";
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilderTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilderTest.java index a6b0012..0163d7f 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilderTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtmlBuilderTest.java
@@ -14,9 +14,18 @@ package com.google.gwtexpui.safehtml.client; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; -public class SafeHtmlBuilderTest extends TestCase { +import org.junit.Test; + +public class SafeHtmlBuilderTest { + @Test public void testEmpty() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertTrue(b.isEmpty()); @@ -28,6 +37,7 @@ assertEquals("a", b.asString()); } + @Test public void testToSafeHtml() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); b.append(1); @@ -39,6 +49,7 @@ assertEquals("1", h.asString()); } + @Test public void testAppend_boolean() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.append(true)); @@ -46,6 +57,7 @@ assertEquals("truefalse", b.asString()); } + @Test public void testAppend_char() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.append('a')); @@ -53,6 +65,7 @@ assertEquals("ab", b.asString()); } + @Test public void testAppend_int() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.append(4)); @@ -61,6 +74,7 @@ assertEquals("42-100", b.asString()); } + @Test public void testAppend_long() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.append(4L)); @@ -68,18 +82,21 @@ assertEquals("42", b.asString()); } + @Test public void testAppend_float() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.append(0.0f)); assertEquals("0.0", b.asString()); } + @Test public void testAppend_double() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.append(0.0)); assertEquals("0.0", b.asString()); } + @Test public void testAppend_String() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.append((String) null)); @@ -89,6 +106,7 @@ assertEquals("foobar", b.asString()); } + @Test public void testAppend_StringBuilder() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.append((StringBuilder) null)); @@ -98,6 +116,7 @@ assertEquals("foobar", b.asString()); } + @Test public void testAppend_StringBuffer() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.append((StringBuffer) null)); @@ -107,6 +126,7 @@ assertEquals("foobar", b.asString()); } + @Test public void testAppend_Object() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.append((Object) null)); @@ -120,6 +140,7 @@ assertEquals("foobar", b.asString()); } + @Test public void testAppend_CharSequence() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.append((CharSequence) null)); @@ -129,6 +150,7 @@ assertEquals("foobar", b.asString()); } + @Test public void testAppend_SafeHtml() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.append((SafeHtml) null)); @@ -138,6 +160,7 @@ assertEquals("foobar", b.asString()); } + @Test public void testHtmlSpecialCharacters() { assertEquals("&", escape("&")); assertEquals("<", escape("<")); @@ -155,18 +178,21 @@ assertEquals("&lt;b&gt;", escape("<b>")); } + @Test public void testEntityNbsp() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.nbsp()); assertEquals(" ", b.asString()); } + @Test public void testTagBr() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.br()); assertEquals("<br />", b.asString()); } + @Test public void testTagTableTrTd() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.openElement("table")); @@ -179,6 +205,7 @@ assertEquals("<table><tr><td>d<a>ta</td></tr></table>", b.asString()); } + @Test public void testTagDiv() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.openDiv()); @@ -187,6 +214,7 @@ assertEquals("<div>d<a>ta</div>", b.asString()); } + @Test public void testTagAnchor() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.openAnchor()); @@ -206,6 +234,7 @@ assertEquals("<a href=\"d<a>ta\">go</a>", b.asString()); } + @Test public void testTagHeightWidth() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.openElement("img")); @@ -215,6 +244,7 @@ assertEquals("<img height=\"100\" width=\"42\" />", b.asString()); } + @Test public void testStyleName() { final SafeHtmlBuilder b = new SafeHtmlBuilder(); assertSame(b, b.openSpan()); @@ -225,6 +255,7 @@ assertEquals("<span class=\"foo bar\">d<a>ta</span>", b.asString()); } + @Test public void testRejectJavaScript_AnchorHref() { final String href = "javascript:window.close();"; try { @@ -235,6 +266,7 @@ } } + @Test public void testRejectJavaScript_ImgSrc() { final String href = "javascript:window.close();"; try { @@ -245,6 +277,7 @@ } } + @Test public void testRejectJavaScript_FormAction() { final String href = "javascript:window.close();"; try {
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_LinkifyTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_LinkifyTest.java index a9d9450..749df17 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_LinkifyTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_LinkifyTest.java
@@ -14,9 +14,13 @@ package com.google.gwtexpui.safehtml.client; -import junit.framework.TestCase; +import org.junit.Test; -public class SafeHtml_LinkifyTest extends TestCase { +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; + +public class SafeHtml_LinkifyTest { + @Test public void testLinkify_SimpleHttp1() { final SafeHtml o = html("A http://go.here/ B"); final SafeHtml n = o.linkify(); @@ -24,6 +28,7 @@ assertEquals("A <a href=\"http://go.here/\" target=\"_blank\">http://go.here/</a> B", n.asString()); } + @Test public void testLinkify_SimpleHttps2() { final SafeHtml o = html("A https://go.here/ B"); final SafeHtml n = o.linkify(); @@ -31,6 +36,7 @@ assertEquals("A <a href=\"https://go.here/\" target=\"_blank\">https://go.here/</a> B", n.asString()); } + @Test public void testLinkify_Parens1() { final SafeHtml o = html("A (http://go.here/) B"); final SafeHtml n = o.linkify(); @@ -38,6 +44,7 @@ assertEquals("A (<a href=\"http://go.here/\" target=\"_blank\">http://go.here/</a>) B", n.asString()); } + @Test public void testLinkify_Parens() { final SafeHtml o = html("A http://go.here/#m() B"); final SafeHtml n = o.linkify(); @@ -45,6 +52,7 @@ assertEquals("A <a href=\"http://go.here/#m()\" target=\"_blank\">http://go.here/#m()</a> B", n.asString()); } + @Test public void testLinkify_AngleBrackets1() { final SafeHtml o = html("A <http://go.here/> B"); final SafeHtml n = o.linkify();
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_ReplaceTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_ReplaceTest.java index d7a3aaf..71b55a1 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_ReplaceTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_ReplaceTest.java
@@ -14,19 +14,25 @@ package com.google.gwtexpui.safehtml.client; -import junit.framework.TestCase; +import org.junit.Test; import java.util.Arrays; import java.util.Collections; import java.util.List; -public class SafeHtml_ReplaceTest extends TestCase { +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; + +public class SafeHtml_ReplaceTest { + @Test public void testReplaceEmpty() { SafeHtml o = html("A\nissue42\nB"); assertSame(o, o.replaceAll(null)); assertSame(o, o.replaceAll(Collections.<FindReplace> emptyList())); } + @Test public void testReplaceOneLink() { SafeHtml o = html("A\nissue 42\nB"); SafeHtml n = o.replaceAll(repls( @@ -35,6 +41,7 @@ assertEquals("A\n<a href=\"?42\">issue 42</a>\nB", n.asString()); } + @Test public void testReplaceNoLeadingOrTrailingText() { SafeHtml o = html("issue 42"); SafeHtml n = o.replaceAll(repls( @@ -43,6 +50,7 @@ assertEquals("<a href=\"?42\">issue 42</a>", n.asString()); } + @Test public void testReplaceTwoLinks() { SafeHtml o = html("A\nissue 42\nissue 9918\nB"); SafeHtml n = o.replaceAll(repls( @@ -55,6 +63,7 @@ , n.asString()); } + @Test public void testReplaceInOrder() { SafeHtml o = html("A\nissue 42\nReally GWTEXPUI-9918 is better\nB"); SafeHtml n = o.replaceAll(repls( @@ -70,6 +79,7 @@ , n.asString()); } + @Test public void testReplaceOverlappingAfterFirstChar() { SafeHtml o = html("abcd"); RawFindReplace ab = new RawFindReplace("ab", "AB"); @@ -81,6 +91,7 @@ assertEquals("ABYZ", o.replaceAll(repls(ab, bc, cd)).asString()); } + @Test public void testReplaceOverlappingAtFirstCharLongestMatch() { SafeHtml o = html("abcd"); RawFindReplace ab = new RawFindReplace("ab", "AB"); @@ -90,6 +101,7 @@ assertEquals("234d", o.replaceAll(repls(abc, ab)).asString()); } + @Test public void testReplaceOverlappingAtFirstCharFirstMatch() { SafeHtml o = html("abcd"); RawFindReplace ab1 = new RawFindReplace("ab", "AB"); @@ -99,6 +111,7 @@ assertEquals("12cd", o.replaceAll(repls(ab2, ab1)).asString()); } + @Test public void testFailedSanitization() { SafeHtml o = html("abcd"); LinkFindReplace evil = new LinkFindReplace("(b)", "javascript:alert('$1')");
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyListTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyListTest.java index 250a1b5..045555a 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyListTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyListTest.java
@@ -14,9 +14,12 @@ package com.google.gwtexpui.safehtml.client; -import junit.framework.TestCase; +import org.junit.Test; -public class SafeHtml_WikifyListTest extends TestCase { +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; + +public class SafeHtml_WikifyListTest { private static final String BEGIN_LIST = "<ul class=\"wikiList\">"; private static final String END_LIST = "</ul>"; @@ -24,6 +27,7 @@ return "<li>" + raw + "</li>"; } + @Test public void testBulletList1() { final SafeHtml o = html("A\n\n* line 1\n* 2nd line"); final SafeHtml n = o.wikify(); @@ -36,6 +40,7 @@ , n.asString()); } + @Test public void testBulletList2() { final SafeHtml o = html("A\n\n* line 1\n* 2nd line\n\nB"); final SafeHtml n = o.wikify(); @@ -49,6 +54,7 @@ , n.asString()); } + @Test public void testBulletList3() { final SafeHtml o = html("* line 1\n* 2nd line\n\nB"); final SafeHtml n = o.wikify(); @@ -61,6 +67,7 @@ , n.asString()); } + @Test public void testBulletList4() { final SafeHtml o = html("To see this bug, you have to:\n" // + "* Be on IMAP or EAS (not on POP)\n"// @@ -75,6 +82,7 @@ , n.asString()); } + @Test public void testBulletList5() { final SafeHtml o = html("To see this bug,\n" // + "you have to:\n" // @@ -90,6 +98,7 @@ , n.asString()); } + @Test public void testDashList1() { final SafeHtml o = html("A\n\n- line 1\n- 2nd line"); final SafeHtml n = o.wikify(); @@ -102,6 +111,7 @@ , n.asString()); } + @Test public void testDashList2() { final SafeHtml o = html("A\n\n- line 1\n- 2nd line\n\nB"); final SafeHtml n = o.wikify(); @@ -115,6 +125,7 @@ , n.asString()); } + @Test public void testDashList3() { final SafeHtml o = html("- line 1\n- 2nd line\n\nB"); final SafeHtml n = o.wikify();
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyPreformatTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyPreformatTest.java index cbb315b..605185e 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyPreformatTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyPreformatTest.java
@@ -14,9 +14,12 @@ package com.google.gwtexpui.safehtml.client; -import junit.framework.TestCase; +import org.junit.Test; -public class SafeHtml_WikifyPreformatTest extends TestCase { +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; + +public class SafeHtml_WikifyPreformatTest { private static final String B = "<span class=\"wikiPreFormat\">"; private static final String E = "</span><br />"; @@ -24,6 +27,7 @@ return B + raw + E; } + @Test public void testPreformat1() { final SafeHtml o = html("A\n\n This is pre\n formatted"); final SafeHtml n = o.wikify(); @@ -36,6 +40,7 @@ , n.asString()); } + @Test public void testPreformat2() { final SafeHtml o = html("A\n\n This is pre\n formatted\n\nbut this is not"); final SafeHtml n = o.wikify(); @@ -49,6 +54,7 @@ , n.asString()); } + @Test public void testPreformat3() { final SafeHtml o = html("A\n\n Q\n <R>\n S\n\nB"); final SafeHtml n = o.wikify(); @@ -63,6 +69,7 @@ , n.asString()); } + @Test public void testPreformat4() { final SafeHtml o = html(" Q\n <R>\n S\n\nB"); final SafeHtml n = o.wikify();
diff --git a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyTest.java b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyTest.java index c9837037..00b29de 100644 --- a/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyTest.java +++ b/gerrit-gwtexpui/src/test/java/com/google/gwtexpui/safehtml/client/SafeHtml_WikifyTest.java
@@ -14,9 +14,13 @@ package com.google.gwtexpui.safehtml.client; -import junit.framework.TestCase; +import org.junit.Test; -public class SafeHtml_WikifyTest extends TestCase { +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; + +public class SafeHtml_WikifyTest { + @Test public void testWikify_OneLine1() { final SafeHtml o = html("A B"); final SafeHtml n = o.wikify(); @@ -24,6 +28,7 @@ assertEquals("<p>A B</p>", n.asString()); } + @Test public void testWikify_OneLine2() { final SafeHtml o = html("A B\n"); final SafeHtml n = o.wikify(); @@ -31,6 +36,7 @@ assertEquals("<p>A B\n</p>", n.asString()); } + @Test public void testWikify_OneParagraph1() { final SafeHtml o = html("A\nB"); final SafeHtml n = o.wikify(); @@ -38,6 +44,7 @@ assertEquals("<p>A\nB</p>", n.asString()); } + @Test public void testWikify_OneParagraph2() { final SafeHtml o = html("A\nB\n"); final SafeHtml n = o.wikify(); @@ -45,6 +52,7 @@ assertEquals("<p>A\nB\n</p>", n.asString()); } + @Test public void testWikify_TwoParagraphs() { final SafeHtml o = html("A\nB\n\nC\nD"); final SafeHtml n = o.wikify(); @@ -52,6 +60,7 @@ assertEquals("<p>A\nB</p><p>C\nD</p>", n.asString()); } + @Test public void testLinkify_SimpleHttp1() { final SafeHtml o = html("A http://go.here/ B"); final SafeHtml n = o.wikify(); @@ -59,6 +68,7 @@ assertEquals("<p>A <a href=\"http://go.here/\" target=\"_blank\">http://go.here/</a> B</p>", n.asString()); } + @Test public void testLinkify_SimpleHttps2() { final SafeHtml o = html("A https://go.here/ B"); final SafeHtml n = o.wikify(); @@ -66,6 +76,7 @@ assertEquals("<p>A <a href=\"https://go.here/\" target=\"_blank\">https://go.here/</a> B</p>", n.asString()); } + @Test public void testLinkify_Parens1() { final SafeHtml o = html("A (http://go.here/) B"); final SafeHtml n = o.wikify(); @@ -73,6 +84,7 @@ assertEquals("<p>A (<a href=\"http://go.here/\" target=\"_blank\">http://go.here/</a>) B</p>", n.asString()); } + @Test public void testLinkify_Parens() { final SafeHtml o = html("A http://go.here/#m() B"); final SafeHtml n = o.wikify(); @@ -80,6 +92,7 @@ assertEquals("<p>A <a href=\"http://go.here/#m()\" target=\"_blank\">http://go.here/#m()</a> B</p>", n.asString()); } + @Test public void testLinkify_AngleBrackets1() { final SafeHtml o = html("A <http://go.here/> B"); final SafeHtml n = o.wikify();
diff --git a/gerrit-gwtui/BUCK b/gerrit-gwtui/BUCK index 1ae823e..0c873ee 100644 --- a/gerrit-gwtui/BUCK +++ b/gerrit-gwtui/BUCK
@@ -1,4 +1,5 @@ include_defs('//gerrit-gwtui/gwt.defs') +include_defs('//tools/gwt-constants.defs') genrule( name = 'ui_optdbg', @@ -25,13 +26,7 @@ gwt_application( name = 'ui_opt', module_target = MODULE, - compiler_opts = [ - '-strict', - '-style', 'OBF', - '-optimize', '9', - '-XdisableClassMetadata', - '-XdisableCastChecking', - ], + compiler_opts = GWT_COMPILER_OPTS, deps = APP_DEPS, )
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 40e5252..7b5389e 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
@@ -71,6 +71,7 @@ import com.google.gerrit.client.dashboards.DashboardInfo; import com.google.gerrit.client.dashboards.DashboardList; import com.google.gerrit.client.diff.SideBySide2; +import com.google.gerrit.client.documentation.DocScreen; import com.google.gerrit.client.groups.GroupApi; import com.google.gerrit.client.groups.GroupInfo; import com.google.gerrit.client.patches.PatchScreen; @@ -201,6 +202,9 @@ if (matchPrefix("/q/", token)) { query(token); + } else if (matchPrefix("/Documentation/", token)) { + docSearch(token); + } else if (matchPrefix("/c/", token)) { change(token); @@ -884,4 +888,12 @@ } } } + + private static void docSearch(final String token) { + GWT.runAsync(new AsyncSplit(token) { + public void onSuccess() { + Gerrit.display(token, new DocScreen(skip(token))); + } + }); + } }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.java index cbb5513..21da8ce 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.java
@@ -34,4 +34,6 @@ String pluginFailed(String scriptPath); String cannotDownloadPlugin(String scriptPath); + + String parentUpdateFailed(String message); }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.properties index 5ab8b3b..8196e98 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.properties +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritMessages.properties
@@ -15,3 +15,5 @@ pluginFailed = Plugin JavaScript {0} failed to load cannotDownloadPlugin = Cannot download JavaScript plugin from: {0}. + +parentUpdateFailed = Setting parent project failed: {0}
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 80d65b0..dffa7c4 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
@@ -57,4 +57,7 @@ @Source("draftComments.png") public ImageResource draftComments(); + + @Source("readOnly.png") + public ImageResource readOnly(); }
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 da9f1c6..4c69300 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
@@ -22,13 +22,13 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.TreeSet; public class SearchSuggestOracle extends HighlightSuggestOracle { private static final List<ParamSuggester> paramSuggester = Arrays.asList( - new ParamSuggester("project:", new ProjectNameSuggestOracle()), + new ParamSuggester(Arrays.asList("project:", "parentproject:"), + new ProjectNameSuggestOracle()), new ParamSuggester(Arrays.asList("owner:", "reviewer:"), new AccountSuggestOracle() { @Override @@ -80,7 +80,9 @@ suggestions.add("commit:"); suggestions.add("comment:"); + suggestions.add("conflicts:"); suggestions.add("project:"); + suggestions.add("parentproject:"); suggestions.add("branch:"); suggestions.add("topic:"); suggestions.add("ref:"); @@ -89,7 +91,6 @@ suggestions.add("label:"); suggestions.add("message:"); suggestions.add("file:"); - suggestions.add("has:"); suggestions.add("has:draft"); suggestions.add("has:star"); @@ -207,11 +208,6 @@ private final List<String> operators; private final SuggestOracle parameterSuggestionOracle; - ParamSuggester(final String operator, - final SuggestOracle parameterSuggestionOracle) { - this(Collections.singletonList(operator), parameterSuggestionOracle); - } - ParamSuggester(final List<String> operators, final SuggestOracle parameterSuggestionOracle) { this.operators = operators;
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 333dcfa..0aeeac6 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
@@ -77,14 +77,14 @@ Confirm the default path <em>.ssh/id_rsa</em>\ </li>\ <li>\ - Enter a passphrase (recommended) or leave it blank.<br>\ - Remember this passphrase, as you will need it to unlock the<br>\ + Enter a passphrase (recommended) or leave it blank.<br />\ + Remember this passphrase, as you will need it to unlock the<br />\ key whenever you use it.\ </li>\ <li>\ - Open <em>~/.ssh/id_rsa.pub</em> and copy & paste the contents into<br>\ - the box below, then click on "Add".<br>\ - Note that <em>id_rsa.pub</em> is your public key and can be shared,<br>\ + Open <em>~/.ssh/id_rsa.pub</em> and copy & paste the contents into<br />\ + the box below, then click on "Add".<br />\ + Note that <em>id_rsa.pub</em> is your public key and can be shared,<br />\ while <em>id_rsa</em> is your private key and should be kept secret.\ </li>\ <\ol>
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 731eaeb..2dd4df7 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
@@ -280,7 +280,7 @@ return; } } - if (currentValue != defaultValue) { + if (!currentValue.equals(defaultValue)) { setListBox(f, defaultValue, defaultValue); } }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessEditor.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessEditor.java index 49a9aa4..567f14c 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessEditor.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessEditor.java
@@ -18,6 +18,7 @@ import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.GitwebLink; import com.google.gerrit.client.ui.Hyperlink; +import com.google.gerrit.client.ui.ParentProjectBox; import com.google.gerrit.common.data.AccessSection; import com.google.gerrit.common.data.ProjectAccess; import com.google.gerrit.reviewdb.client.Branch; @@ -56,6 +57,10 @@ Hyperlink parentProject; @UiField + @Editor.Ignore + ParentProjectBox parentProjectBox; + + @UiField DivElement history; @UiField @@ -106,6 +111,11 @@ parentProject.setText(parent.get()); parentProject.setTargetHistoryToken( // Dispatcher.toProjectAdmin(parent, ProjectScreen.ACCESS)); + + parentProjectBox.setVisible(editing && value.canChangeParent()); + parentProjectBox.setProject(value.getProjectName()); + parentProjectBox.setParentProject(value.getInheritsFrom()); + parentProject.setVisible(!parentProjectBox.isVisible()); } else { inheritsFrom.getStyle().setDisplay(Display.NONE); } @@ -135,6 +145,7 @@ } } value.setLocal(keep); + value.setInheritsFrom(parentProjectBox.getParentProjectName()); } @Override
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessEditor.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessEditor.ui.xml index 4942b83..120824b 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessEditor.ui.xml +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessEditor.ui.xml
@@ -56,6 +56,9 @@ <div ui:field='inheritsFrom' class='{style.inheritsFrom}'> <span class='{style.parentTitle}'><ui:msg>Rights Inherit From:</ui:msg></span> <q:Hyperlink ui:field='parentProject' styleName='{style.parentLink}'/> + <q:ParentProjectBox + ui:field='parentProjectBox' + visible='false'/> </div> <div ui:field='history' class='{style.history}'> <span class='{style.historyTitle}'><ui:msg>History:</ui:msg></span>
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java index ef7f560..c76bba9 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/ProjectAccessScreen.java
@@ -17,6 +17,7 @@ import static com.google.gerrit.common.ProjectAccessUtil.mergeSections; import static com.google.gerrit.common.ProjectAccessUtil.removeEmptyPermissionsAndSections; +import com.google.gerrit.client.ErrorDialog; import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.config.CapabilityInfo; import com.google.gerrit.client.config.ConfigServerApi; @@ -28,6 +29,7 @@ import com.google.gerrit.common.PageLinks; import com.google.gerrit.common.data.AccessSection; import com.google.gerrit.common.data.ProjectAccess; +import com.google.gerrit.common.errors.UpdateParentFailedException; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Project; import com.google.gwt.core.client.GWT; @@ -45,6 +47,7 @@ import com.google.gwt.user.client.ui.UIObject; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwtexpui.globalkey.client.NpTextArea; +import com.google.gwtjsonrpc.client.RemoteJsonException; import java.util.Collections; import java.util.HashMap; @@ -205,6 +208,7 @@ access.getRevision(), // message, // access.getLocal(), // + access.getInheritsFrom(), // new GerritCallback<ProjectAccess>() { @Override public void onSuccess(ProjectAccess newAccess) { @@ -250,7 +254,15 @@ public void onFailure(Throwable caught) { error.clear(); enable(true); - super.onFailure(caught); + if (caught instanceof RemoteJsonException + && caught.getMessage().startsWith( + UpdateParentFailedException.MESSAGE)) { + new ErrorDialog(Gerrit.M.parentUpdateFailed(caught.getMessage() + .substring(UpdateParentFailedException.MESSAGE.length() + 1))) + .center(); + } else { + super.onFailure(caught); + } } }); } @@ -275,6 +287,7 @@ access.getRevision(), // message, // access.getLocal(), // + access.getInheritsFrom(), // new GerritCallback<Change.Id>() { @Override public void onSuccess(Change.Id changeId) {
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 331afee..23e13d4 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
@@ -37,6 +37,7 @@ import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwtexpui.globalkey.client.NpTextBox; @@ -102,9 +103,11 @@ protected void initColumnHeaders() { super.initColumnHeaders(); if (Gerrit.getGitwebLink() != null) { - table.setText(0, 3, Util.C.projectRepoBrowser()); + table.setText(0, ProjectsTable.C_REPO_BROWSER, + Util.C.projectRepoBrowser()); table.getFlexCellFormatter(). - addStyleName(0, 3, Gerrit.RESOURCES.css().dataHeader()); + addStyleName(0, ProjectsTable.C_REPO_BROWSER, + Gerrit.RESOURCES.css().dataHeader()); } } @@ -122,20 +125,39 @@ super.insert(row, k); if (Gerrit.getGitwebLink() != null) { table.getFlexCellFormatter(). - addStyleName(row, 3, Gerrit.RESOURCES.css().dataCell()); + addStyleName(row, ProjectsTable.C_REPO_BROWSER, + Gerrit.RESOURCES.css().dataCell()); } } @Override protected void populate(final int row, final ProjectInfo k) { + Image state = new Image(); + switch (k.state()) { + case HIDDEN: + state.setResource(Gerrit.RESOURCES.redNot()); + state.setTitle(Util.toLongString(k.state())); + table.setWidget(row, ProjectsTable.C_STATE, state); + break; + case READ_ONLY: + state.setResource(Gerrit.RESOURCES.readOnly()); + state.setTitle(Util.toLongString(k.state())); + table.setWidget(row, ProjectsTable.C_STATE, state); + break; + default: + // Intentionally left blank, do not show an icon when active. + break; + } + FlowPanel fp = new FlowPanel(); fp.add(new ProjectSearchLink(k.name_key())); fp.add(new HighlightingInlineHyperlink(k.name(), link(k), subname)); - table.setWidget(row, 1, fp); - table.setText(row, 2, k.description()); + 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, 3, new Anchor(l.getLinkName(), false, l.toProject(k + table.setWidget(row, ProjectsTable.C_REPO_BROWSER, + new Anchor(l.getLinkName(), false, l.toProject(k .name_key()))); }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/deleteHover.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/deleteHover.png index 839e8ef..9fde3fa 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/deleteHover.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/deleteHover.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/deleteNormal.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/deleteNormal.png index ffddb6f..47a1195 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/deleteNormal.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/deleteNormal.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/editText.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/editText.png index 188e1c1..2927275 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/editText.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/editText.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/undoNormal.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/undoNormal.png index 8b0fef9..b780f75 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/undoNormal.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/undoNormal.png Binary files differ
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 60377c4..f22fa3f 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
@@ -93,6 +93,21 @@ e.onkeypress = stopPropagation; return e; }, + select: function(a,s) { + var e = doc.createElement('select'); + for (var i = 0; i < a.length; i++) { + var o = doc.createElement('option'); + if (i==s) { + o.setAttributeNode(doc.createAttribute("selected")); + } + o.appendChild(doc.createTextNode(a[i])); + e.appendChild(o); + } + return e; + }, + selected: function(e) { + return e.options[e.selectedIndex].text; + }, popup: function(e){this._p=@com.google.gerrit.client.api.PopupHelper::popup(Lcom/google/gerrit/client/api/ActionContext;Lcom/google/gwt/dom/client/Element;)(this,e)}, hide: function() { @@ -135,10 +150,30 @@ } static final void post(RestApi api, JavaScriptObject in, JavaScriptObject cb) { + if (NativeString.is(in)) { + post(api, ((NativeString) in).asString(), cb); + } else { + api.post(in, wrap(cb)); + } + } + + static final void post(RestApi api, String in, JavaScriptObject cb) { api.post(in, wrap(cb)); } + static final void put(RestApi api, JavaScriptObject cb) { + api.put(wrap(cb)); + } + static final void put(RestApi api, JavaScriptObject in, JavaScriptObject cb) { + if (NativeString.is(in)) { + put(api, ((NativeString) in).asString(), cb); + } else { + api.put(in, wrap(cb)); + } + } + + static final void put(RestApi api, String in, JavaScriptObject cb) { api.put(in, wrap(cb)); }
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 f3fb1fa..1e2e19e 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
@@ -59,9 +59,24 @@ _api: function(u) {return @com.google.gerrit.client.rpc.RestApi::new(Ljava/lang/String;)(u)}, get: function(u,b){@com.google.gerrit.client.api.ActionContext::get(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),b)}, - post: function(u,i,b){@com.google.gerrit.client.api.ActionContext::post(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),i,b)}, - put: function(u,i,b){@com.google.gerrit.client.api.ActionContext::put(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),i,b)}, + post: function(u,i,b){ + if (typeof i=='string') + @com.google.gerrit.client.api.ActionContext::post(Lcom/google/gerrit/client/rpc/RestApi;Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),i,b); + else + @com.google.gerrit.client.api.ActionContext::post(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),i,b); + }, + put: function(u,i,b){ + if(b){ + if(typeof i=='string') + @com.google.gerrit.client.api.ActionContext::put(Lcom/google/gerrit/client/rpc/RestApi;Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),i,b); + else + @com.google.gerrit.client.api.ActionContext::put(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),i,b); + }else{ + @com.google.gerrit.client.api.ActionContext::put(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),i) + } + }, 'delete': function(u,b){@com.google.gerrit.client.api.ActionContext::delete(Lcom/google/gerrit/client/rpc/RestApi;Lcom/google/gwt/core/client/JavaScriptObject;)(this._api(u),b)}, + JsonString: @com.google.gerrit.client.rpc.NativeString::TYPE, }; Plugin.prototype = {
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 fcd6056..53a3784 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
@@ -22,6 +22,7 @@ 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.rpc.AsyncCallback; @@ -44,7 +45,8 @@ invoke(action, api, cb); } - static void invokeProjectAction(ActionInfo action, RestApi api) { + static void invokeProjectAction(final Project.NameKey project, + ActionInfo action, RestApi api) { AsyncCallback<JavaScriptObject> cb = new GerritCallback<JavaScriptObject>() { @Override public void onSuccess(JavaScriptObject msg) { @@ -54,7 +56,7 @@ Window.alert(str.asString()); } } - Gerrit.display(PageLinks.ADMIN_PROJECTS); + Gerrit.display(PageLinks.toProject(project)); } }; invoke(action, api, cb);
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 b95f4e0..bce691c 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
@@ -35,7 +35,7 @@ c.button(button); ApiGlue.invoke(f, c); } else { - DefaultActions.invokeProjectAction(action, api); + DefaultActions.invokeProjectAction(project, action, api); } }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/EditMessageBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/EditMessageBox.java index cd1f304..939f946 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/EditMessageBox.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/EditMessageBox.java
@@ -82,7 +82,7 @@ public void onSuccess(JavaScriptObject msg) { Gerrit.display(PageLinks.toChange(changeId)); hide(); - }; + } }); }
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 c8eb13a..75ca6b3 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
@@ -56,6 +56,8 @@ import java.util.TreeSet; class ReplyBox extends Composite { + private static final String CODE_REVIEW = "Code-Review"; + interface Binder extends UiBinder<HTMLPanel, ReplyBox> {} private static final Binder uiBinder = GWT.create(Binder.class); @@ -67,7 +69,7 @@ private final PatchSet.Id psId; private final String revision; private ReviewInput in = ReviewInput.create(); - private List<Runnable> lgtm; + private Runnable lgtm; @UiField Styles style; @UiField NpTextArea message; @@ -91,7 +93,6 @@ UIObject.setVisible(labelsParent, false); } else { Collections.sort(names); - lgtm = new ArrayList<Runnable>(names.size()); renderLabels(names, all, permitted); } } @@ -118,11 +119,7 @@ Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { - if (message.getValue().startsWith("LGTM")) { - for (Runnable r : lgtm) { - r.run(); - } - } + lgtm.run(); } }); } @@ -236,8 +233,8 @@ } } - if (!group.isEmpty()) { - lgtm.add(new Runnable() { + if (CODE_REVIEW.equalsIgnoreCase(id) && !group.isEmpty()) { + lgtm = new Runnable() { @Override public void run() { for (int i = 0; i < group.size() - 1; i++) { @@ -245,7 +242,7 @@ } group.get(group.size() - 1).setValue(true, true); } - }); + }; } } @@ -269,12 +266,14 @@ b.setStyleName(style.label_name()); labelsTable.setWidget(row, 0, b); - lgtm.add(new Runnable() { - @Override - public void run() { - b.setValue(true, true); - } - }); + if (CODE_REVIEW.equalsIgnoreCase(id)) { + lgtm = new Runnable() { + @Override + public void run() { + b.setValue(true, true); + } + }; + } } private static boolean isCheckBox(Set<Short> values) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/remove_reviewer.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/remove_reviewer.png index 9e494dd..5a3e6f0 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/remove_reviewer.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/remove_reviewer.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/star_filled.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/star_filled.png index 39bddb1..db1e24e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/star_filled.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/star_filled.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeApi.java index 97b0166..03058fe 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeApi.java
@@ -171,7 +171,7 @@ protected CherryPickInput() { } - }; + } private static class SubmitInput extends JavaScriptObject { final native void wait_for_merge(boolean b) /*-{ this.wait_for_merge=b; }-*/;
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 42705db..48aa02d 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
@@ -453,7 +453,7 @@ for (Patch p : detail.getPatches()) { openWindow(Dispatcher.toPatchUnified(base, p.getKey())); } - }; + } }); table.setWidget(row, C_UNIFIED, unified); }
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 fa3d784..d29fb0f 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
@@ -18,7 +18,7 @@ public class ReviewInput extends JavaScriptObject { public static enum NotifyHandling { - NONE, OWNER, OWNER_REVIEWERS, ALL; + NONE, OWNER, OWNER_REVIEWERS, ALL } public static ReviewInput create() {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/removeReviewerNormal.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/removeReviewerNormal.png index 839e8ef..9fde3fa 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/removeReviewerNormal.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/removeReviewerNormal.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/removeReviewerPressed.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/removeReviewerPressed.png index 2e509ec..e46f0aa 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/removeReviewerPressed.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/removeReviewerPressed.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java index 826d477..aee30df 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffApi.java
@@ -23,8 +23,8 @@ public class DiffApi { public enum IgnoreWhitespace { - NONE, TRAILING, CHANGED, ALL; - }; + NONE, TRAILING, CHANGED, ALL + } public static void list(int id, String revision, AsyncCallback<NativeMap<FileInfo>> cb) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java index f833509..d5f7819 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffInfo.java
@@ -93,7 +93,7 @@ } public enum IntraLineStatus { - OFF, OK, TIMEOUT, FAILURE; + OFF, OK, TIMEOUT, FAILURE } public static class FileMeta extends JavaScriptObject {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DisplaySide.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DisplaySide.java index c51a673..36911bd 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DisplaySide.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DisplaySide.java
@@ -16,5 +16,5 @@ /** Enum representing the side on a side-by-side view */ enum DisplaySide { - A, B; + A, B }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SidePanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SidePanel.java index 6a19b30..fba8f19 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SidePanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SidePanel.java
@@ -49,7 +49,7 @@ } enum GutterType { - COMMENT, DRAFT, INSERT, DELETE, EDIT; + COMMENT, DRAFT, INSERT, DELETE, EDIT } @UiField @@ -114,7 +114,7 @@ Label gutter = wrapper.gutter; final double height = cm.heightAtLine(line, "local"); final double scrollbarHeight = cmB.getScrollbarV().getClientHeight(); - double top = height / (double) cmB.getSizer().getClientHeight() * + double top = height / cmB.getSizer().getClientHeight() * scrollbarHeight + cmB.getScrollbarV().getAbsoluteTop(); if (top == 0) {
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocConstants.java similarity index 63% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocConstants.java index a5371d2..f6b7a9d 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocConstants.java
@@ -12,19 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.client.documentation; -import com.google.common.collect.Maps; +import com.google.gwt.i18n.client.Constants; -import java.util.Map; +public interface DocConstants extends Constants { + String keyReloadSearch(); -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; - } + String docItemHelp(); + String docTableColumnTitle(); + String docTableNone(); }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocConstants.properties new file mode 100644 index 0000000..b48c507 --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocConstants.properties
@@ -0,0 +1,5 @@ +keyReloadSearch = Reload documentation list + +docItemHelp = documentation +docTableColumnTitle = Title +docTableNone = (None)
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocInfo.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocInfo.java new file mode 100644 index 0000000..6235186 --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocInfo.java
@@ -0,0 +1,31 @@ +// 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.client.documentation; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.JavaScriptObject; + +public class DocInfo extends JavaScriptObject { + + public final native String title() /*-{ return this.title; }-*/; + public final native String url() /*-{ return this.url; }-*/; + + protected DocInfo() { + } + + public final String getFullUrl() { + return GWT.getHostPageBaseURL() + url(); + } +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocMessages.java similarity index 63% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocMessages.java index a5371d2..df62b92 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocMessages.java
@@ -12,19 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.client.documentation; -import com.google.common.collect.Maps; +import com.google.gwt.i18n.client.Messages; -import java.util.Map; - -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; - } +public interface DocMessages extends Messages { + String docQueryWindowTitle(String query); + String docQueryPageTitle(String query); }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocMessages.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocMessages.properties new file mode 100644 index 0000000..8810a4a --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocMessages.properties
@@ -0,0 +1,2 @@ +docQueryWindowTitle = {0} +docQueryPageTitle = Search for {0} in documentation
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocScreen.java new file mode 100644 index 0000000..0a87d29 --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocScreen.java
@@ -0,0 +1,78 @@ +// 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.client.documentation; + +import com.google.gerrit.client.rpc.GerritCallback; +import com.google.gerrit.client.rpc.RestApi; +import com.google.gerrit.client.ui.Screen; +import com.google.gwt.core.client.JsArray; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwtorm.client.KeyUtil; + +public class DocScreen extends Screen { + private static final String URI = "/Documentation/"; + + private DocTable table; + private final String query; + + public DocScreen(String query) { + this.query = KeyUtil.decode(query); + } + + @Override + protected void onInitUI() { + super.onInitUI(); + + table = new DocTable(); + table.setSavePointerId(query); + add(table); + + setWindowTitle(Util.M.docQueryWindowTitle(query)); + setPageTitle(Util.M.docQueryPageTitle(query)); + } + + @Override + protected void onLoad() { + super.onLoad(); + doQuery(); + } + + @Override + public void registerKeys() { + super.registerKeys(); + table.setRegisterKeys(true); + } + + private AsyncCallback<JsArray<DocInfo>> loadCallback() { + return new GerritCallback<JsArray<DocInfo>>() { + @Override + public void onSuccess(JsArray<DocInfo> result) { + displayResults(result); + display(); + } + }; + } + + private void displayResults(JsArray<DocInfo> result) { + table.display(result); + table.finishDisplay(); + } + + private void doQuery() { + RestApi call = new RestApi(URI); + call.addParameterRaw("q", KeyUtil.encode(query)); + call.get(loadCallback()); + } +}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocTable.java new file mode 100644 index 0000000..f176372 --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/DocTable.java
@@ -0,0 +1,125 @@ +// 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.client.documentation; + +import com.google.gerrit.client.Gerrit; +import com.google.gerrit.client.ui.NavigationTable; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.core.client.JsArray; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; +import com.google.gwt.user.client.ui.HTMLTable.Cell; +import com.google.gwt.user.client.ui.HTMLTable.CellFormatter; + +class DocTable extends NavigationTable<DocInfo> { + private static final int C_TITLE = 1; + + private int rows = 0; + private int dataBeginRow = 0; + + public DocTable() { + super(Util.C.docItemHelp()); + + table.setText(0, C_TITLE, Util.C.docTableColumnTitle()); + + FlexCellFormatter fmt = table.getFlexCellFormatter(); + fmt.addStyleName(0, C_TITLE, Gerrit.RESOURCES.css().dataHeader()); + + table.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + Cell cell = table.getCellForEvent(event); + if (cell == null) { + return; + } + if (getRowItem(cell.getRowIndex()) != null) { + movePointerTo(cell.getRowIndex()); + } + } + }); + } + + @Override + protected Object getRowItemKey(DocInfo item) { + return item.url(); + } + + @Override + protected void onOpenRow(int row) { + DocInfo d = getRowItem(row); + Window.Location.assign(d.getFullUrl()); + } + + private void insertNoneRow(int row) { + table.insertRow(row); + table.setText(row, 0, Util.C.docTableNone()); + FlexCellFormatter fmt = table.getFlexCellFormatter(); + fmt.setStyleName(row, 0, Gerrit.RESOURCES.css().emptySection()); + } + + private void insertDocRow(int row) { + table.insertRow(row); + applyDataRowStyle(row); + } + + @Override + protected void applyDataRowStyle(int row) { + super.applyDataRowStyle(row); + CellFormatter fmt = table.getCellFormatter(); + fmt.addStyleName(row, C_TITLE, Gerrit.RESOURCES.css().dataCell()); + fmt.addStyleName(row, C_TITLE, Gerrit.RESOURCES.css().cSUBJECT()); + } + + private void populateDocRow(int row, DocInfo d) { + table.setWidget(row, C_TITLE, new DocLink(d)); + setRowItem(row, d); + } + + public void display(JsArray<DocInfo> docList) { + int sz = docList != null ? docList.length() : 0; + boolean hadData = rows > 0; + + if (hadData) { + while (sz < rows) { + table.removeRow(dataBeginRow); + rows--; + } + } else { + table.removeRow(dataBeginRow); + } + + if (sz == 0) { + insertNoneRow(dataBeginRow); + return; + } + + while (rows < sz) { + insertDocRow(dataBeginRow + rows); + rows++; + } + for (int i = 0; i < sz; i++) { + populateDocRow(dataBeginRow + i, docList.get(i)); + } + } + + public static class DocLink extends Anchor { + public DocLink(DocInfo d) { + super(com.google.gerrit.client.changes.Util.cropSubject(d.title())); + setHref(d.getFullUrl()); + } + } +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/Util.java similarity index 63% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/Util.java index a5371d2..273ead8 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/documentation/Util.java
@@ -12,19 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.client.documentation; -import com.google.common.collect.Maps; +import com.google.gwt.core.client.GWT; -import java.util.Map; - -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; - } +public class Util { + public static final DocConstants C = GWT.create(DocConstants.class); + public static final DocMessages M = GWT.create(DocMessages.class); }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/downloadIcon.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/downloadIcon.png index 22ff495..1a6520e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/downloadIcon.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/downloadIcon.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/draftComments.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/draftComments.png index 31c770f..276912a 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/draftComments.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/draftComments.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editText.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editText.png index 188e1c1..2927275 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/editText.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/editText.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/greenCheck.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/greenCheck.png index cd70687..207c0e7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/greenCheck.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/greenCheck.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchLine.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchLine.java index 9726bbb..4863af2 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchLine.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchLine.java
@@ -16,7 +16,7 @@ class PatchLine { static enum Type { - DELETE, INSERT, REPLACE, CONTEXT; + DELETE, INSERT, REPLACE, CONTEXT } private PatchLine.Type type;
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchScriptSettingsPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchScriptSettingsPanel.java index 9795a64..08799a5 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchScriptSettingsPanel.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchScriptSettingsPanel.java
@@ -147,7 +147,7 @@ } } toggleEnabledStatus(on); - }; + } } public void setEnableSmallFileFeatures(final boolean on) {
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 62dbf1c7..ebae86a 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
@@ -110,6 +110,15 @@ }); } + public static void getChildren(Project.NameKey name, boolean recursive, + AsyncCallback<JsArray<ProjectInfo>> cb) { + RestApi view = project(name).view("children"); + if (recursive) { + view.addParameterTrue("recursive"); + } + view.get(cb); + } + public static void getDescription(Project.NameKey name, AsyncCallback<NativeString> cb) { project(name).view("description").get(cb);
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 80c1feb..cab45b5 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
@@ -28,6 +28,12 @@ public final native String name() /*-{ return this.name; }-*/; public final native String description() /*-{ return this.description; }-*/; + public final Project.State state() { + return Project.State.valueOf(getStringState()); + } + + private final native String getStringState() /*-{ return this.state; }-*/; + @Override public final String getDisplayString() { if (description() != null) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/queryIcon.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/queryIcon.png index 5aace51..5ebf2cb 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/queryIcon.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/queryIcon.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/readOnly.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/readOnly.png new file mode 100644 index 0000000..62e89f9 --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/readOnly.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/redNot.png b/gerrit-gwtui/src/main/java/com/google/gerrit/client/redNot.png index 4e83a8f..99834fd 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/redNot.png +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/redNot.png Binary files differ
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/NativeString.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/NativeString.java index be4cfd6..a3dce43 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/NativeString.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/rpc/NativeString.java
@@ -19,10 +19,15 @@ /** Wraps a String that was returned from a JSON API. */ public final class NativeString extends JavaScriptObject { - private static final JavaScriptObject TYPE = init(); + public static final JavaScriptObject TYPE = init(); - private static final native JavaScriptObject init() - /*-{ return function(s){this.s=s} }-*/; + private static final native JavaScriptObject init() /*-{ + var T = function(s){this.s=s}; + T.prototype = { + get: function(){return this.s}, + }; + return T; + }-*/; static final NativeString wrap(String s) { return wrap0(TYPE, s); @@ -32,7 +37,6 @@ /*-{ return new T(s) }-*/; public final native String asString() /*-{ return this.s; }-*/; - private final native void set(String v) /*-{ this.s = v; }-*/; public static final AsyncCallback<NativeString> unwrap(final AsyncCallback<String> cb) {
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 4666d34..5ae3091 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
@@ -124,29 +124,31 @@ } } else if (200 <= status && status < 300) { - if (!isJsonBody(res)) { + T data; + if (isTextBody(res)) { + data = NativeString.wrap(res.getText()).cast(); + } else if (isJsonBody(res)) { + try { + // javac generics bug + data = RestApi.<T>cast(parseJson(res)); + } catch (JSONException e) { + if (!background) { + RpcStatus.INSTANCE.onRpcComplete(); + } + cb.onFailure(new StatusCodeException(SC_BAD_RESPONSE, + "Invalid JSON: " + e.getMessage())); + return; + } + } else { if (!background) { RpcStatus.INSTANCE.onRpcComplete(); } cb.onFailure(new StatusCodeException(SC_BAD_RESPONSE, "Expected " - + JSON_TYPE + "; received Content-Type: " + + JSON_TYPE + " or " + TEXT_TYPE + "; received Content-Type: " + res.getHeader("Content-Type"))); return; } - T data; - try { - // javac generics bug - data = RestApi.<T>cast(parseJson(res)); - } catch (JSONException e) { - if (!background) { - RpcStatus.INSTANCE.onRpcComplete(); - } - cb.onFailure(new StatusCodeException(SC_BAD_RESPONSE, - "Invalid JSON: " + e.getMessage())); - return; - } - cb.onSuccess(data); if (!background) { RpcStatus.INSTANCE.onRpcComplete(); @@ -336,6 +338,11 @@ send(PUT, cb); } + public <T extends JavaScriptObject> void put(String content, + AsyncCallback<T> cb) { + sendRaw(PUT, content, cb); + } + public <T extends JavaScriptObject> void put( JavaScriptObject content, AsyncCallback<T> cb) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ParentProjectBox.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ParentProjectBox.java new file mode 100644 index 0000000..a03cb34 --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ParentProjectBox.java
@@ -0,0 +1,101 @@ +// 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.client.ui; + +import com.google.gerrit.client.projects.ProjectApi; +import com.google.gerrit.client.projects.ProjectInfo; +import com.google.gerrit.client.rpc.Natives; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gwt.core.client.JsArray; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.SuggestBox; +import com.google.gwtexpui.globalkey.client.NpTextBox; + +import java.util.HashSet; +import java.util.Set; + +public class ParentProjectBox extends Composite { + private final NpTextBox textBox; + private final SuggestBox suggestBox; + private final ParentProjectNameSuggestOracle suggestOracle; + + public ParentProjectBox() { + textBox = new NpTextBox(); + suggestOracle = new ParentProjectNameSuggestOracle(); + suggestBox = new SuggestBox(suggestOracle, textBox); + initWidget(suggestBox); + } + + public void setVisibleLength(int len) { + textBox.setVisibleLength(len); + } + + public void setProject(final Project.NameKey project) { + suggestOracle.setProject(project); + } + + public void setParentProject(final Project.NameKey parent) { + suggestBox.setText(parent != null ? parent.get() : ""); + } + + public Project.NameKey getParentProjectName() { + final String projectName = suggestBox.getText().trim(); + if (projectName.isEmpty()) { + return null; + } + return new Project.NameKey(projectName); + } + + private static class ParentProjectNameSuggestOracle extends ProjectNameSuggestOracle { + private Set<String> exclude = new HashSet<String>(); + + public void setProject(Project.NameKey project) { + exclude.clear(); + exclude.add(project.get()); + ProjectApi.getChildren(project, true, new AsyncCallback<JsArray<ProjectInfo>>() { + @Override + public void onSuccess(JsArray<ProjectInfo> result) { + for (ProjectInfo p : Natives.asList(result)) { + exclude.add(p.name()); + } + } + + @Override + public void onFailure(Throwable caught) { + } + }); + } + + @Override + public void _onRequestSuggestions(Request req, final Callback callback) { + super._onRequestSuggestions(req, new Callback() { + public void onSuggestionsReady(Request request, Response response) { + if (exclude.size() > 0) { + Set<Suggestion> filteredSuggestions = + new HashSet<Suggestion>(response.getSuggestions()); + for (Suggestion s : response.getSuggestions()) { + if (exclude.contains(s.getReplacementString())) { + filteredSuggestions.remove(s); + } + } + response.setSuggestions(filteredSuggestions); + } + callback.onSuggestionsReady(request, response); + } + }); + } + } +}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java index 052878b..289e6fe 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/ProjectsTable.java
@@ -25,6 +25,10 @@ import java.util.List; public class ProjectsTable extends NavigationTable<ProjectInfo> { + public static final int C_STATE = 1; + public static final int C_NAME = 2; + public static final int C_DESCRIPTION = 3; + public static final int C_REPO_BROWSER = 4; public ProjectsTable() { super(Util.C.projectItemHelp()); @@ -32,12 +36,16 @@ } protected void initColumnHeaders() { - table.setText(0, 1, Util.C.projectName()); - table.setText(0, 2, Util.C.projectDescription()); + table.setText(0, C_STATE, Util.C.projectStateAbbrev()); + table.getCellFormatter().getElement(0, C_STATE) + .setTitle(Util.C.projectStateHelp()); + table.setText(0, C_NAME, Util.C.projectName()); + table.setText(0, C_DESCRIPTION, Util.C.projectDescription()); final FlexCellFormatter fmt = table.getFlexCellFormatter(); - fmt.addStyleName(0, 1, Gerrit.RESOURCES.css().dataHeader()); - fmt.addStyleName(0, 2, Gerrit.RESOURCES.css().dataHeader()); + fmt.addStyleName(0, C_STATE, Gerrit.RESOURCES.css().iconHeader()); + fmt.addStyleName(0, C_NAME, Gerrit.RESOURCES.css().dataHeader()); + fmt.addStyleName(0, C_DESCRIPTION, Gerrit.RESOURCES.css().dataHeader()); } @Override @@ -75,16 +83,18 @@ applyDataRowStyle(row); final FlexCellFormatter fmt = table.getFlexCellFormatter(); - fmt.addStyleName(row, 1, Gerrit.RESOURCES.css().dataCell()); - fmt.addStyleName(row, 1, Gerrit.RESOURCES.css().projectNameColumn()); - fmt.addStyleName(row, 2, Gerrit.RESOURCES.css().dataCell()); + fmt.addStyleName(row, C_STATE, Gerrit.RESOURCES.css().iconCell()); + fmt.addStyleName(row, C_NAME, Gerrit.RESOURCES.css().dataCell()); + fmt.addStyleName(row, C_NAME, Gerrit.RESOURCES.css().projectNameColumn()); + fmt.addStyleName(row, C_DESCRIPTION, Gerrit.RESOURCES.css().dataCell()); populate(row, k); } protected void populate(final int row, final ProjectInfo k) { - table.setText(row, 1, k.name()); - table.setText(row, 2, k.description()); + table.setText(row, C_STATE, k.state().toString()); + table.setText(row, C_NAME, k.name()); + table.setText(row, C_DESCRIPTION, k.description()); setRowItem(row, k); }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Screen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Screen.java index 0cabdda..01a90e3 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Screen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/Screen.java
@@ -71,7 +71,7 @@ } private static enum Cols { - West, Title, East, FarEast; + West, Title, East, FarEast } protected void onInitUI() {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.java index 1919cd3..bcfb394 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.java
@@ -23,4 +23,6 @@ String projectName(); String projectDescription(); String projectItemHelp(); + String projectStateAbbrev(); + String projectStateHelp(); }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.properties index 8a72355..1e0e185 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.properties +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/ui/UIConstants.properties
@@ -3,4 +3,6 @@ projectName = Project Name projectDescription = Project Description -projectItemHelp = project \ No newline at end of file +projectItemHelp = project +projectStateAbbrev = S +projectStateHelp = State \ No newline at end of file
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 c5a047c..2ebe326 100644 --- a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java +++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java
@@ -68,7 +68,7 @@ }-*/; public enum LineClassWhere { - TEXT, BACKGROUND, WRAP; + TEXT, BACKGROUND, WRAP } public final void addLineClass(int line, LineClassWhere where, @@ -201,7 +201,7 @@ public final FromTo getSelectedRange() { return FromTo.create(getCursor("start"), getCursor("end")); - }; + } public final native void setCursor(LineCharacter lineCh) /*-{ this.setCursor(lineCh);
diff --git a/gerrit-httpd/BUCK b/gerrit-httpd/BUCK index 512e6e6..c20b589 100644 --- a/gerrit-httpd/BUCK +++ b/gerrit-httpd/BUCK
@@ -1,4 +1,6 @@ -SRCS = glob(['src/main/java/**/*.java']) +SRCS = glob( + ['src/main/java/**/*.java'], +) RESOURCES = glob(['src/main/resources/**/*']) java_library2( @@ -30,6 +32,7 @@ '//lib/jgit:jgit', '//lib/jgit:jgit-servlet', '//lib/log:api', + '//lib/lucene:core', ], compile_deps = ['//lib:servlet-api-3_0'], visibility = ['PUBLIC'],
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CookieBase64.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CookieBase64.java index 3bcdcd2..fab9f1b 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CookieBase64.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CookieBase64.java
@@ -33,8 +33,9 @@ } private static int fill(final char[] out, int o, final char f, final int l) { - for (char c = f; c <= l; c++) + for (char c = f; c <= l; c++) { out[o++] = c; + } return o; }
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 2980159..61ea464 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
@@ -127,7 +127,7 @@ cfg, "change", null, "updateDelay", 30, TimeUnit.SECONDS)); config.setChangeScreen(cfg.getEnum( "gerrit", null, "changeScreen", - AccountGeneralPreferences.ChangeScreen.OLD_UI)); + AccountGeneralPreferences.ChangeScreen.CHANGE_SCREEN2)); config.setReportBugUrl(cfg.getString("gerrit", null, "reportBugUrl")); if (config.getReportBugUrl() == null) { @@ -136,7 +136,7 @@ config.setReportBugUrl(null); } - config.setGitBasicAuth(authConfig.isGitBasichAuth()); + config.setGitBasicAuth(authConfig.isGitBasicAuth()); final Set<Account.FieldName> fields = new HashSet<Account.FieldName>(); for (final Account.FieldName n : Account.FieldName.values()) {
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java index 6ca9949..4f4c783 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/GitOverHttpModule.java
@@ -34,7 +34,7 @@ Class<? extends Filter> authFilter; if (authConfig.isTrustContainerAuth()) { authFilter = ContainerAuthFilter.class; - } else if (authConfig.isGitBasichAuth()) { + } else if (authConfig.isGitBasicAuth()) { authFilter = ProjectBasicAuthFilter.class; } else { authFilter = ProjectDigestFilter.class;
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java index bf39bfb..3c4dfc5 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java
@@ -30,6 +30,7 @@ import com.google.gerrit.httpd.rpc.change.ChangesRestApiServlet; import com.google.gerrit.httpd.rpc.change.DeprecatedChangeQueryServlet; import com.google.gerrit.httpd.rpc.config.ConfigRestApiServlet; +import com.google.gerrit.httpd.rpc.doc.QueryDocumentationFilter; import com.google.gerrit.httpd.rpc.group.GroupsRestApiServlet; import com.google.gerrit.httpd.rpc.project.ProjectsRestApiServlet; import com.google.gerrit.reviewdb.client.Change; @@ -110,6 +111,8 @@ serveRegex("^/(?:a/)?groups/(.*)?$").with(GroupsRestApiServlet.class); serveRegex("^/(?:a/)?projects/(.*)?$").with(ProjectsRestApiServlet.class); + filter("/Documentation/").through(QueryDocumentationFilter.class); + if (cfg.deprecatedQuery) { serve("/query").with(DeprecatedChangeQueryServlet.class); }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java index 5593baf..3443968 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebModule.java
@@ -31,7 +31,6 @@ import com.google.gerrit.server.RemotePeer; import com.google.gerrit.server.config.AuthConfig; import com.google.gerrit.server.config.CanonicalWebUrl; -import com.google.gerrit.server.config.FactoryModule; import com.google.gerrit.server.config.GerritRequestModule; import com.google.gerrit.server.contact.ContactStore; import com.google.gerrit.server.contact.ContactStoreProvider; @@ -46,7 +45,7 @@ import java.net.SocketAddress; -public class WebModule extends FactoryModule { +public class WebModule extends LifecycleModule { private final AuthConfig authConfig; private final UrlModule.UrlConfig urlConfig; private final boolean wantSSL; @@ -132,11 +131,6 @@ bind(SocketAddress.class).annotatedWith(RemotePeer.class).toProvider( HttpRemotePeerProvider.class).in(RequestScoped.class); - install(new LifecycleModule() { - @Override - protected void configure() { - listener().toInstance(registerInParentInjectors()); - } - }); + listener().toInstance(registerInParentInjectors()); } }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java index 28e361c..2dde16e 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java
@@ -168,7 +168,7 @@ Element userlistElement = HtmlDomUtil.find(doc, "userlist"); ReviewDb db = schema.open(); try { - ResultSet<Account> accounts = db.accounts().firstNById(5); + ResultSet<Account> accounts = db.accounts().firstNById(100); for (Account a : accounts) { String displayName; if (a.getUserName() != null) {
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 517b017..2e1cc06 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
@@ -607,7 +607,7 @@ throw new InstantiationException("Cannot make " + type); } - private static void replyJson(@Nullable HttpServletRequest req, + public static void replyJson(@Nullable HttpServletRequest req, HttpServletResponse res, Multimap<String, String> config, Object result)
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/doc/QueryDocumentationFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/doc/QueryDocumentationFilter.java new file mode 100644 index 0000000..002b520 --- /dev/null +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/doc/QueryDocumentationFilter.java
@@ -0,0 +1,74 @@ +// 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.httpd.rpc.doc; + +import com.google.common.base.Strings; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import com.google.gerrit.httpd.restapi.RestApiServlet; +import com.google.gerrit.server.documentation.QueryDocumentationExecutor; +import com.google.gerrit.server.documentation.QueryDocumentationExecutor.DocQueryException; +import com.google.gerrit.server.documentation.QueryDocumentationExecutor.DocResult; +import com.google.inject.Inject; +import com.google.inject.Singleton; + +import java.io.IOException; +import java.util.List; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Singleton +public class QueryDocumentationFilter implements Filter { + private final QueryDocumentationExecutor searcher; + + @Inject + QueryDocumentationFilter(QueryDocumentationExecutor searcher) { + this.searcher = searcher; + } + + @Override + public void init(FilterConfig filterConfig) { + } + + @Override + public void destroy() { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) request; + if ("GET".equals(req.getMethod()) + && !Strings.isNullOrEmpty(req.getParameter("q"))) { + HttpServletResponse rsp = (HttpServletResponse) response; + try { + List<DocResult> result = searcher.doQuery(request.getParameter("q")); + Multimap<String, String> config = LinkedHashMultimap.create(); + RestApiServlet.replyJson(req, rsp, config, result); + } catch (DocQueryException e) { + rsp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } else { + chain.doFilter(request, response); + } + } +}
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java index 0dd3d16..57be31e 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ChangeProjectAccess.java
@@ -19,12 +19,15 @@ import com.google.gerrit.common.data.ProjectAccess; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.config.AllProjectsNameProvider; import com.google.gerrit.server.git.MetaDataUpdate; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.NoSuchProjectException; import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectControl; +import com.google.gerrit.server.project.SetParent; import com.google.inject.Inject; +import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; import org.eclipse.jgit.errors.ConfigInvalidException; @@ -35,9 +38,11 @@ class ChangeProjectAccess extends ProjectAccessHandler<ProjectAccess> { interface Factory { - ChangeProjectAccess create(@Assisted Project.NameKey projectName, + ChangeProjectAccess create( + @Assisted("projectName") Project.NameKey projectName, @Nullable @Assisted ObjectId base, @Assisted List<AccessSection> sectionList, + @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName, @Nullable @Assisted String message); } @@ -45,17 +50,21 @@ private final ProjectCache projectCache; @Inject - ChangeProjectAccess(final ProjectAccessFactory.Factory projectAccessFactory, - final ProjectControl.Factory projectControlFactory, - final ProjectCache projectCache, final GroupBackend groupBackend, - final MetaDataUpdate.User metaDataUpdateFactory, + ChangeProjectAccess(ProjectAccessFactory.Factory projectAccessFactory, + ProjectControl.Factory projectControlFactory, + ProjectCache projectCache, GroupBackend groupBackend, + MetaDataUpdate.User metaDataUpdateFactory, + AllProjectsNameProvider allProjects, + Provider<SetParent> setParent, - @Assisted final Project.NameKey projectName, - @Nullable @Assisted final ObjectId base, + @Assisted("projectName") Project.NameKey projectName, + @Nullable @Assisted ObjectId base, @Assisted List<AccessSection> sectionList, + @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName, @Nullable @Assisted String message) { super(projectControlFactory, groupBackend, metaDataUpdateFactory, - projectName, base, sectionList, message, true); + allProjects, setParent, projectName, base, sectionList, + parentProjectName, message, true); this.projectAccessFactory = projectAccessFactory; this.projectCache = projectCache; }
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 2c5681b..6e7150d 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
@@ -203,6 +203,8 @@ detail.setOwnerOf(ownerOf); detail.setCanUpload(pc.isOwner() || (metaConfigControl.isVisible() && metaConfigControl.canUpload())); + detail.setCanChangeParent(pc.getCurrentUser().getCapabilities() + .canAdministrateServer()); detail.setConfigVisible(pc.isOwner() || metaConfigControl.isVisible()); detail.setLabelTypes(pc.getLabelTypes()); return detail;
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 0a50a38..971c4b3 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
@@ -22,16 +22,23 @@ import com.google.gerrit.common.data.PermissionRule; import com.google.gerrit.common.errors.InvalidNameException; import com.google.gerrit.common.errors.NoSuchGroupException; +import com.google.gerrit.common.errors.UpdateParentFailedException; +import com.google.gerrit.extensions.restapi.AuthException; +import com.google.gerrit.extensions.restapi.ResourceConflictException; +import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.httpd.rpc.Handler; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.account.GroupBackend; import com.google.gerrit.server.account.GroupBackends; +import com.google.gerrit.server.config.AllProjectsNameProvider; import com.google.gerrit.server.git.MetaDataUpdate; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.project.NoSuchProjectException; import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.server.project.RefControl; +import com.google.gerrit.server.project.SetParent; import com.google.gwtorm.server.OrmException; +import com.google.inject.Provider; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; @@ -47,27 +54,32 @@ private final ProjectControl.Factory projectControlFactory; protected final GroupBackend groupBackend; private final MetaDataUpdate.User metaDataUpdateFactory; + private final AllProjectsNameProvider allProjects; + private final Provider<SetParent> setParent; protected final Project.NameKey projectName; protected final ObjectId base; private List<AccessSection> sectionList; + private final Project.NameKey parentProjectName; protected String message; private boolean checkIfOwner; - protected ProjectAccessHandler( - final ProjectControl.Factory projectControlFactory, - final GroupBackend groupBackend, - final MetaDataUpdate.User metaDataUpdateFactory, - final Project.NameKey projectName, final ObjectId base, - final List<AccessSection> sectionList, final String message, - final boolean checkIfOwner) { + protected ProjectAccessHandler(ProjectControl.Factory projectControlFactory, + GroupBackend groupBackend, MetaDataUpdate.User metaDataUpdateFactory, + AllProjectsNameProvider allProjects, Provider<SetParent> setParent, + Project.NameKey projectName, ObjectId base, + List<AccessSection> sectionList, Project.NameKey parentProjectName, + String message, boolean checkIfOwner) { this.projectControlFactory = projectControlFactory; this.groupBackend = groupBackend; this.metaDataUpdateFactory = metaDataUpdateFactory; + this.allProjects = allProjects; + this.setParent = setParent; this.projectName = projectName; this.base = base; this.sectionList = sectionList; + this.parentProjectName = parentProjectName; this.message = message; this.checkIfOwner = checkIfOwner; } @@ -75,7 +87,7 @@ @Override public final T call() throws NoSuchProjectException, IOException, ConfigInvalidException, InvalidNameException, NoSuchGroupException, - OrmException { + OrmException, UpdateParentFailedException { final ProjectControl projectControl = projectControlFactory.controlFor(projectName); @@ -120,6 +132,20 @@ } } + if (!config.getProject().getNameKey().equals(allProjects.get()) && + !config.getProject().getParent(allProjects.get()).equals(parentProjectName)) { + try { + setParent.get().validateParentUpdate(projectControl, parentProjectName.get()); + } catch (AuthException e) { + throw new UpdateParentFailedException(e.getMessage(), e); + } catch (ResourceConflictException e) { + throw new UpdateParentFailedException(e.getMessage(), e); + } catch (UnprocessableEntityException e) { + throw new UpdateParentFailedException(e.getMessage(), e); + } + config.getProject().setParentName(parentProjectName); + } + if (message != null && !message.isEmpty()) { if (!message.endsWith("\n")) { message += "\n";
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java index 66ba75c..c378701 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/project/ProjectAdminServiceImpl.java
@@ -56,14 +56,16 @@ @Override public void changeProjectAccess(Project.NameKey projectName, String baseRevision, String msg, List<AccessSection> sections, - AsyncCallback<ProjectAccess> cb) { - changeProjectAccessFactory.create(projectName, getBase(baseRevision), sections, msg).to(cb); + Project.NameKey parentProjectName, AsyncCallback<ProjectAccess> cb) { + changeProjectAccessFactory.create(projectName, getBase(baseRevision), + sections, parentProjectName, msg).to(cb); } @Override public void reviewProjectAccess(Project.NameKey projectName, String baseRevision, String msg, List<AccessSection> sections, - AsyncCallback<Change.Id> cb) { - reviewProjectAccessFactory.create(projectName, getBase(baseRevision), sections, msg).to(cb); + Project.NameKey parentProjectName, AsyncCallback<Change.Id> cb) { + reviewProjectAccessFactory.create(projectName, getBase(baseRevision), + sections, parentProjectName, msg).to(cb); } }
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 27a02d9..3f4030d 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
@@ -31,6 +31,7 @@ import com.google.gerrit.server.account.GroupBackend; import com.google.gerrit.server.change.ChangeResource; import com.google.gerrit.server.change.PostReviewers; +import com.google.gerrit.server.config.AllProjectsNameProvider; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.MetaDataUpdate; import com.google.gerrit.server.git.ProjectConfig; @@ -39,6 +40,7 @@ import com.google.gerrit.server.patch.PatchSetInfoFactory; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.ProjectControl; +import com.google.gerrit.server.project.SetParent; import com.google.gerrit.server.util.TimeUtil; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; @@ -60,9 +62,11 @@ LoggerFactory.getLogger(ReviewProjectAccess.class); interface Factory { - ReviewProjectAccess create(@Assisted Project.NameKey projectName, + ReviewProjectAccess create( + @Assisted("projectName") Project.NameKey projectName, @Nullable @Assisted ObjectId base, @Assisted List<AccessSection> sectionList, + @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName, @Nullable @Assisted String message); } @@ -84,13 +88,17 @@ ChangeControl.GenericFactory changeFactory, ChangeIndexer indexer, ChangeHooks hooks, CreateChangeSender.Factory createChangeSenderFactory, + AllProjectsNameProvider allProjects, + Provider<SetParent> setParent, - @Assisted Project.NameKey projectName, + @Assisted("projectName") Project.NameKey projectName, @Nullable @Assisted ObjectId base, @Assisted List<AccessSection> sectionList, + @Nullable @Assisted("parentProjectName") Project.NameKey parentProjectName, @Nullable @Assisted String message) { super(projectControlFactory, groupBackend, metaDataUpdateFactory, - projectName, base, sectionList, message, false); + allProjects, setParent, projectName, base, sectionList, + parentProjectName, message, false); this.db = db; this.user = user; this.patchSetInfoFactory = patchSetInfoFactory;
diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/GitWebConfigTest.java b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/GitWebConfigTest.java index c834b94..26cdd8a 100644 --- a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/GitWebConfigTest.java +++ b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/GitWebConfigTest.java
@@ -14,19 +14,24 @@ package com.google.gerrit.httpd; -import junit.framework.TestCase; +import org.junit.Test; -public class GitWebConfigTest extends TestCase { +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class GitWebConfigTest { private static final String VALID_CHARACTERS = "*()"; private static final String SOME_INVALID_CHARACTERS = "09AZaz$-_.+!',"; + @Test public void testValidPathSeparator() { for(char c : VALID_CHARACTERS.toCharArray()) { assertTrue("valid character rejected: " + c, GitWebConfig.isValidPathSeparator(c)); } } + @Test public void testInalidPathSeparator() { for(char c : SOME_INVALID_CHARACTERS.toCharArray()) { assertFalse("invalid character accepted: " + c, GitWebConfig.isValidPathSeparator(c));
diff --git a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/restapi/ParameterParserTest.java b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/restapi/ParameterParserTest.java index ffbc7f3..8533a9c 100644 --- a/gerrit-httpd/src/test/java/com/google/gerrit/httpd/restapi/ParameterParserTest.java +++ b/gerrit-httpd/src/test/java/com/google/gerrit/httpd/restapi/ParameterParserTest.java
@@ -21,9 +21,11 @@ import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; -import junit.framework.TestCase; +import org.junit.Test; +import static org.junit.Assert.assertEquals; -public class ParameterParserTest extends TestCase { +public class ParameterParserTest { + @Test public void testConvertFormToJson() throws BadRequestException { JsonObject obj = ParameterParser.formToJson( ImmutableMap.of(
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 2dd20a2..3ca3619 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
@@ -190,7 +190,7 @@ try { path = getDistributionArchive(); } catch (FileNotFoundException e) { - if (NOT_ARCHIVED == e.getMessage()) { + if (NOT_ARCHIVED.equals(e.getMessage())) { // Assume the CLASSPATH was made complete by the calling process, // as we are likely being run from within a developer's IDE. // @@ -302,6 +302,7 @@ } private volatile static File myArchive; + private volatile static File myHome; /** * Locate the JAR/WAR file we were launched from. @@ -459,42 +460,26 @@ return tmp; } + /** + * Provide path to a working directory + * + * @return local path of the working directory or null if cannot be determined + */ + public static File getHomeDirectory() { + if (myHome == null) { + myHome = locateHomeDirectory(); + } + return myHome; + } + + private static File tmproot() { File tmp; String gerritTemp = System.getenv("GERRIT_TMP"); if (gerritTemp != null && gerritTemp.length() > 0) { tmp = new File(gerritTemp); } else { - // Try to find the user's home directory. If we can't find it - // return null so the JVM's default temporary directory is used - // instead. This is probably /tmp or /var/tmp. - // - String userHome = System.getProperty("user.home"); - if (userHome == null || "".equals(userHome)) { - userHome = System.getenv("HOME"); - if (userHome == null || "".equals(userHome)) { - System.err.println("warning: cannot determine home directory"); - System.err.println("warning: using system temporary directory instead"); - return null; - } - } - - // Ensure the home directory exists. If it doesn't, try to make it. - // - final File home = new File(userHome); - if (!home.exists()) { - if (home.mkdirs()) { - System.err.println("warning: created " + home.getAbsolutePath()); - } else { - System.err.println("warning: " + home.getAbsolutePath() + " not found"); - System.err.println("warning: using system temporary directory instead"); - return null; - } - } - - // Use $HOME/.gerritcodereview/tmp for our temporary file area. - // - tmp = new File(new File(home, ".gerritcodereview"), "tmp"); + tmp = new File(getHomeDirectory(), "tmp"); } if (!tmp.exists() && !tmp.mkdirs()) { System.err.println("warning: cannot create " + tmp.getAbsolutePath()); @@ -527,6 +512,49 @@ } } + private static File locateHomeDirectory() { + // Try to find the user's home directory. If we can't find it + // return null so the JVM's default temporary directory is used + // instead. This is probably /tmp or /var/tmp. + // + String userHome = System.getProperty("user.home"); + if (userHome == null || "".equals(userHome)) { + userHome = System.getenv("HOME"); + if (userHome == null || "".equals(userHome)) { + System.err.println("warning: cannot determine home directory"); + System.err.println("warning: using system temporary directory instead"); + return null; + } + } + + // Ensure the home directory exists. If it doesn't, try to make it. + // + final File home = new File(userHome); + if (!home.exists()) { + if (home.mkdirs()) { + System.err.println("warning: created " + home.getAbsolutePath()); + } else { + System.err.println("warning: " + home.getAbsolutePath() + " not found"); + System.err.println("warning: using system temporary directory instead"); + return null; + } + } + + // Use $HOME/.gerritcodereview/tmp for our temporary file area. + // + final File gerrithome = new File(home, ".gerritcodereview"); + if (!gerrithome.exists() && !gerrithome.mkdirs()) { + System.err.println("warning: cannot create " + gerrithome.getAbsolutePath()); + System.err.println("warning: using system temporary directory instead"); + return null; + } + try { + return gerrithome.getCanonicalFile(); + } catch (IOException e) { + return gerrithome; + } + } + private GerritLauncher() { } }
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java index ef96374..583e54f 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneIndexModule.java
@@ -16,7 +16,6 @@ import com.google.gerrit.extensions.events.LifecycleListener; import com.google.gerrit.lifecycle.LifecycleModule; -import com.google.gerrit.server.config.FactoryModule; import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.index.ChangeSchemas; import com.google.gerrit.server.index.IndexCollection; @@ -45,12 +44,7 @@ @Override protected void configure() { - install(new FactoryModule() { - @Override - public void configure() { - factory(LuceneChangeIndex.Factory.class); - } - }); + factory(LuceneChangeIndex.Factory.class); install(new IndexModule(threads)); if (singleVersion == null && base == null) { install(new MultiVersionModule()); @@ -62,12 +56,7 @@ private class MultiVersionModule extends LifecycleModule { @Override public void configure() { - install(new FactoryModule() { - @Override - public void configure() { - factory(OnlineReindexer.Factory.class); - } - }); + factory(OnlineReindexer.Factory.class); listener().to(LuceneVersionManager.class); } }
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/DiscoveryResult.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/DiscoveryResult.java index 711f29a..37051da 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/DiscoveryResult.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/DiscoveryResult.java
@@ -25,7 +25,7 @@ NO_PROVIDER, /** The provider was discovered, but something else failed. */ - ERROR; + ERROR } Status status;
diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/SignInMode.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/SignInMode.java index b6a9857..9aae6c5 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/SignInMode.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/SignInMode.java
@@ -15,5 +15,5 @@ package com.google.gerrit.httpd.auth.openid; enum SignInMode { - SIGN_IN, LINK_IDENTIY, REGISTER; + SIGN_IN, LINK_IDENTIY, REGISTER }
diff --git a/gerrit-patch-jgit/BUCK b/gerrit-patch-jgit/BUCK index 18890ac..1e0953f 100644 --- a/gerrit-patch-jgit/BUCK +++ b/gerrit-patch-jgit/BUCK
@@ -30,3 +30,15 @@ ], visibility = ['PUBLIC'], ) + +java_test( + name = 'jgit_patch_tests', + srcs = glob(['src/test/java/**/*.java']), + deps = [ + ':server', + '//lib/jgit:jgit', + '//lib:junit', + ], + source_under_test = [':server'], + visibility = ['//tools/eclipse:classpath'], +)
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-patch-jgit/src/test/java/org/eclipse/jgit/diff/EditDeserializerTest.java similarity index 64% rename from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java rename to gerrit-patch-jgit/src/test/java/org/eclipse/jgit/diff/EditDeserializerTest.java index a5371d2..f0ad62a 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-patch-jgit/src/test/java/org/eclipse/jgit/diff/EditDeserializerTest.java
@@ -12,19 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package org.eclipse.jgit.diff; -import com.google.common.collect.Maps; +import org.junit.Test; +import static org.junit.Assert.assertNotNull; -import java.util.Map; - -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; +public class EditDeserializerTest { + @Test + public void testDiffDeserializer() { + assertNotNull("edit deserializer", new EditDeserializer()); } }
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 6adaf32..aee16da 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
@@ -35,6 +35,7 @@ import com.google.gerrit.pgm.http.jetty.JettyEnv; import com.google.gerrit.pgm.http.jetty.JettyModule; import com.google.gerrit.pgm.http.jetty.ProjectQoSFilter; +import com.google.gerrit.pgm.shell.JythonShell; import com.google.gerrit.pgm.util.ErrorLogFile; import com.google.gerrit.pgm.util.GarbageCollectionLogFile; import com.google.gerrit.pgm.util.LogFileCompressor; @@ -59,6 +60,7 @@ import com.google.gerrit.server.patch.IntraLineWorkerPool; import com.google.gerrit.server.plugins.PluginGuiceEnvironment; import com.google.gerrit.server.plugins.PluginRestApiModule; +import com.google.gerrit.server.schema.DataSourceProvider; import com.google.gerrit.server.schema.SchemaVersionCheck; import com.google.gerrit.server.ssh.NoSshKeyCache; import com.google.gerrit.server.ssh.NoSshModule; @@ -114,6 +116,9 @@ @Option(name = "--console-log", usage = "Log to console (not $site_path/logs)") private boolean consoleLog; + @Option(name = "-s", usage = "Start interactive shell") + private boolean inspector; + @Option(name = "--run-id", usage = "Cookie to store in $site_path/logs/gerrit.run") private String runId; @@ -133,6 +138,7 @@ private Injector httpdInjector; private File runFile; private boolean test; + private AbstractModule luceneModule; private Runnable serverStarted; @@ -216,7 +222,16 @@ serverStarted.run(); } - RuntimeShutdown.waitFor(); + if (inspector) { + JythonShell shell = new JythonShell(); + shell.set("m", manager); + shell.set("ds", dbInjector.getInstance(DataSourceProvider.class)); + shell.set("schk", dbInjector.getInstance(SchemaVersionCheck.class)); + shell.set("d", this); + shell.run(); + } else { + RuntimeShutdown.waitFor(); + } return 0; } catch (Throwable err) { log.error("Unable to start daemon", err); @@ -237,6 +252,12 @@ } @VisibleForTesting + public void setLuceneModule(LuceneIndexModule m) { + luceneModule = m; + test = true; + } + + @VisibleForTesting public void start() { if (dbInjector == null) { dbInjector = createDbInjector(MULTI_USER); @@ -290,7 +311,7 @@ AbstractModule changeIndexModule; switch (IndexModule.getIndexType(cfgInjector)) { case LUCENE: - changeIndexModule = new LuceneIndexModule(); + changeIndexModule = luceneModule != null ? luceneModule : new LuceneIndexModule(); break; case SOLR: changeIndexModule = new SolrIndexModule();
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 68e0f6a..3cfd1bb 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
@@ -56,7 +56,7 @@ @Option(name = "--list-plugins", usage = "List available plugins") private boolean listPlugins; - @Option(name = "--install-plugin", usage = "Install given plugin without asking", multiValued = true) + @Option(name = "--install-plugin", usage = "Install given plugin without asking") private List<String> installPlugins; @Inject
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 803b702..4c66f0b 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
@@ -32,7 +32,7 @@ import java.util.List; public class PrologShell extends AbstractProgram { - @Option(name = "-s", multiValued = true, metaVar = "FILE.pl", usage = "file to load") + @Option(name = "-s", metaVar = "FILE.pl", usage = "file to load") private List<String> fileName = new ArrayList<String>(); @Override
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java index e086e6a..5ca53df 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java
@@ -18,9 +18,9 @@ import com.google.common.base.Strings; import com.google.gwtexpui.server.CacheHeaders; -import org.eclipse.jetty.http.HttpHeaders; +import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpStatus; -import org.eclipse.jetty.server.AbstractHttpConnection; +import org.eclipse.jetty.server.HttpConnection; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.ErrorHandler; import org.slf4j.Logger; @@ -37,8 +37,8 @@ public void handle(String target, Request baseRequest, HttpServletRequest req, HttpServletResponse res) throws IOException { - AbstractHttpConnection conn = AbstractHttpConnection.getCurrentConnection(); - conn.getRequest().setHandled(true); + HttpConnection conn = HttpConnection.getCurrentConnection(); + baseRequest.setHandled(true); try { log(req); } finally { @@ -46,10 +46,11 @@ } } - private void reply(AbstractHttpConnection conn, HttpServletResponse res) + private void reply(HttpConnection conn, HttpServletResponse res) throws IOException { byte[] msg = message(conn); - res.setHeader(HttpHeaders.CONTENT_TYPE, "text/plain; charset=ISO-8859-1"); + res.setHeader(HttpHeader.CONTENT_TYPE.asString(), + "text/plain; charset=ISO-8859-1"); res.setContentLength(msg.length); try { CacheHeaders.setNotCacheable(res); @@ -63,10 +64,12 @@ } } - private static byte[] message(AbstractHttpConnection conn) { - String msg = conn.getResponse().getReason(); - if (msg == null) - msg = HttpStatus.getMessage(conn.getResponse().getStatus()); + private static byte[] message(HttpConnection conn) { + String msg = conn.getHttpChannel().getResponse().getReason(); + if (msg == null) { + msg = HttpStatus.getMessage(conn.getHttpChannel() + .getResponse().getStatus()); + } return msg.getBytes(Charsets.ISO_8859_1); }
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyModule.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyModule.java index 1ae9355..b563349 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyModule.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyModule.java
@@ -15,9 +15,8 @@ package com.google.gerrit.pgm.http.jetty; import com.google.gerrit.lifecycle.LifecycleModule; -import com.google.inject.AbstractModule; -public class JettyModule extends AbstractModule { +public class JettyModule extends LifecycleModule { private final JettyEnv env; public JettyModule(final JettyEnv env) { @@ -28,11 +27,6 @@ protected void configure() { bind(JettyEnv.class).toInstance(env); bind(JettyServer.class); - install(new LifecycleModule() { - @Override - protected void configure() { - listener().to(JettyServer.Lifecycle.class); - } - }); + listener().to(JettyServer.Lifecycle.class); } }
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 e1d1281b..615e11e 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
@@ -32,21 +32,24 @@ import com.google.inject.servlet.GuiceFilter; import com.google.inject.servlet.GuiceServletContextListener; -import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.ForwardedRequestCustomizer; import org.eclipse.jetty.server.Handler; -import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.HttpConfiguration; +import org.eclipse.jetty.server.HttpConnectionFactory; +import org.eclipse.jetty.server.SecureRequestCustomizer; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.SslConnectionFactory; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.RequestLogHandler; -import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.server.session.SessionHandler; -import org.eclipse.jetty.server.ssl.SslSelectChannelConnector; import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.util.BlockingArrayQueue; import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.util.thread.QueuedThreadPool; @@ -131,9 +134,8 @@ throws MalformedURLException, IOException { this.site = site; - httpd = new Server(); - httpd.setConnectors(listen(cfg)); - httpd.setThreadPool(threadPool(cfg)); + httpd = new Server(threadPool(cfg)); + httpd.setConnectors(listen(httpd, cfg)); Handler app = makeContext(env, cfg); if (cfg.getBoolean("httpd", "requestLog", !reverseProxy)) { @@ -142,15 +144,12 @@ handler.setHandler(app); app = handler; } - httpd.setHandler(app); + httpd.setHandler(app); httpd.setStopAtShutdown(false); - httpd.setSendDateHeader(true); - httpd.setSendServerVersion(false); - httpd.setGracefulShutdown((int) MILLISECONDS.convert(1, SECONDS)); } - private Connector[] listen(final Config cfg) { + private Connector[] listen(Server server, Config cfg) { // OpenID and certain web-based single-sign-on products can cause // some very long headers, especially in the Referer header. We // need to use a larger default header size to ensure we have @@ -168,7 +167,8 @@ for (int idx = 0; idx < listenUrls.length; idx++) { final URI u = listenUrls[idx]; final int defaultPort; - final SelectChannelConnector c; + final ServerConnector c; + HttpConfiguration config = defaultConfig(requestHeaderSize); if (AuthType.CLIENT_SSL_CERT_LDAP.equals(authType) && ! "https".equals(u.getScheme())) { throw new IllegalArgumentException("Protocol '" + u.getScheme() @@ -179,7 +179,9 @@ if ("http".equals(u.getScheme())) { defaultPort = 80; - c = new SelectChannelConnector(); + c = new ServerConnector(server, null, null, null, 0, acceptors, + new HttpConnectionFactory(config)); + } else if ("https".equals(u.getScheme())) { SslContextFactory ssl = new SslContextFactory(); final File keystore = getFile(cfg, "sslkeystore", "etc/keystore"); @@ -188,7 +190,7 @@ password = "gerrit"; } ssl.setKeyStorePath(keystore.getAbsolutePath()); - ssl.setTrustStore(keystore.getAbsolutePath()); + ssl.setTrustStorePath(keystore.getAbsolutePath()); ssl.setKeyStorePassword(password); ssl.setTrustStorePassword(password); @@ -203,24 +205,27 @@ } defaultPort = 443; - c = new SslSelectChannelConnector(ssl); + + config.addCustomizer(new SecureRequestCustomizer()); + c = new ServerConnector(server, + null, null, null, 0, acceptors, + new SslConnectionFactory(ssl, "http/1.1"), + new HttpConnectionFactory(config)); } else if ("proxy-http".equals(u.getScheme())) { defaultPort = 8080; - c = new SelectChannelConnector(); - c.setForwarded(true); + config.addCustomizer(new ForwardedRequestCustomizer()); + c = new ServerConnector(server, + null, null, null, 0, acceptors, + new HttpConnectionFactory(config)); } else if ("proxy-https".equals(u.getScheme())) { defaultPort = 8080; - c = new SelectChannelConnector() { - @Override - public void customize(EndPoint endpoint, Request request) - throws IOException { - request.setScheme("https"); - super.customize(endpoint, request); - } - }; - c.setForwarded(true); + config.addCustomizer(new ForwardedRequestCustomizer()); + config.addCustomizer(new SecureRequestCustomizer()); + c = new ServerConnector(server, + null, null, null, 0, acceptors, + new HttpConnectionFactory(config)); } else { throw new IllegalArgumentException("Protocol '" + u.getScheme() + "' " @@ -249,16 +254,20 @@ throw new IllegalArgumentException("Invalid httpd.listenurl " + u, e); } - c.setRequestHeaderSize(requestHeaderSize); - c.setAcceptors(acceptors); c.setReuseAddress(reuseAddress); - c.setStatsOn(false); - connectors[idx] = c; } return connectors; } + private HttpConfiguration defaultConfig(int requestHeaderSize) { + HttpConfiguration config = new HttpConfiguration(); + config.setRequestHeaderSize(requestHeaderSize); + config.setSendServerVersion(false); + config.setSendDateHeader(true); + return config; + } + static boolean isReverseProxied(final URI[] listenUrls) { for (URI u : listenUrls) { if ("http".equals(u.getScheme()) || "https".equals(u.getScheme())) { @@ -295,11 +304,20 @@ } private ThreadPool threadPool(Config cfg) { - final QueuedThreadPool pool = new QueuedThreadPool(); + int maxThreads = cfg.getInt("httpd", null, "maxthreads", 25); + int minThreads = cfg.getInt("httpd", null, "minthreads", 5); + int maxCapacity = cfg.getInt("httpd", null, "maxqueued", 50); + int idleTimeout = (int)MILLISECONDS.convert(60, SECONDS); + QueuedThreadPool pool = new QueuedThreadPool( + maxThreads, + minThreads, + idleTimeout, + new BlockingArrayQueue<Runnable>( + minThreads, // capacity, + minThreads, // growBy, + maxCapacity // maxCapacity + )); pool.setName("HTTP"); - pool.setMinThreads(cfg.getInt("httpd", null, "minthreads", 5)); - pool.setMaxThreads(cfg.getInt("httpd", null, "maxthreads", 25)); - pool.setMaxQueued(cfg.getInt("httpd", null, "maxqueued", 50)); return pool; }
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 new file mode 100644 index 0000000..4ad91d9 --- /dev/null +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/shell/JythonShell.java
@@ -0,0 +1,221 @@ +// 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.pgm.shell; + +import com.google.gerrit.launcher.GerritLauncher; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Properties; + +public class JythonShell { + private static final Logger log = LoggerFactory.getLogger(JythonShell.class); + private static final String STARTUP_RESOURCE = "com/google/gerrit/pgm/Startup.py"; + private static final String STARTUP_FILE = "Startup.py"; + + private Class<?> console; + private Class<?> pyObject; + private Class<?> pySystemState; + private Object shell; + private ArrayList <String> injectedVariables; + + public JythonShell() { + Properties env = new Properties(); + // Let us inspect private class members + env.setProperty("python.security.respectJavaAccessibility", "false"); + + File home = GerritLauncher.getHomeDirectory(); + if (home != null) { + env.setProperty("python.cachedir", new File(home, "jythoncache").getPath()); + } + + // For package introspection and "import com.google" to work, + // Jython needs to inspect actual .jar files (not just classloader) + StringBuilder classPath = new StringBuilder(); + final ClassLoader cl = getClass().getClassLoader(); + if (cl instanceof java.net.URLClassLoader) { + URLClassLoader ucl = (URLClassLoader) cl; + for (URL u : ucl.getURLs()) { + if ("file".equals(u.getProtocol())) { + if (classPath.length() > 0) { + classPath.append(java.io.File.pathSeparatorChar); + } + classPath.append(u.getFile()); + } + } + } + env.setProperty("java.class.path", classPath.toString()); + + console = findClass("org.python.util.InteractiveConsole"); + pyObject = findClass("org.python.core.PyObject"); + pySystemState = findClass("org.python.core.PySystemState"); + + runMethod(pySystemState, pySystemState, "initialize", + new Class[] { Properties.class, Properties.class }, + new Object[] { null, env } + ); + + try { + shell = console.newInstance(); + log.info("Jython shell instance created."); + } catch (InstantiationException e) { + throw noInterpreter(e); + } catch (IllegalAccessException e) { + throw noInterpreter(e); + } + injectedVariables = new ArrayList<String>(); + set("Shell", this); + } + + protected Object runMethod0(Class<?> klazz, Object instance, + String name, Class<?>[] sig, Object[] args) + throws InvocationTargetException { + try { + Method m; + m = klazz.getMethod(name, sig); + return m.invoke(instance, args); + } catch (NoSuchMethodException e) { + throw cannotStart(e); + } catch (SecurityException e) { + throw cannotStart(e); + } catch (IllegalArgumentException e) { + throw cannotStart(e); + } catch (IllegalAccessException e) { + throw cannotStart(e); + } + } + + protected Object runMethod(Class<?> klazz, Object instance, + String name, Class<?>[] sig, Object[] args) { + try { + return runMethod0(klazz, instance, name, sig, args); + } catch (InvocationTargetException e) { + throw cannotStart(e); + } + } + + protected Object runInterpreter(String name, Class<?>[] sig, Object[] args) { + return runMethod(console, shell, name, sig, args); + } + + protected String getDefaultBanner() { + return (String)runInterpreter("getDefaultBanner", + new Class[] { }, new Object[] { }); + } + + protected void printInjectedVariable(String id) { + runInterpreter("exec", + new Class[] { String.class }, + new Object[] { "print '\"%s\" is \"%s\"' % (\"" + id + "\", " + id + ")" } + ); + } + + public void run() { + for (String key : injectedVariables) { + printInjectedVariable(key); + } + reload(); + runInterpreter("interact", + new Class[] { String.class, pyObject }, + new Object[] { getDefaultBanner() + + " running for Gerrit " + com.google.gerrit.common.Version.getVersion(), + null }); + } + + public void set(String key, Object content) { + runInterpreter("set", + new Class[] { String.class, Object.class }, + new Object[] { key, content } + ); + injectedVariables.add(key); + } + + private static Class<?> findClass(String klazzname) { + try { + return Class.forName(klazzname); + } catch (ClassNotFoundException e) { + throw noShell("Class " + klazzname + " not found", e); + } + } + + public void reload() { + execResource(STARTUP_RESOURCE); + execFile(GerritLauncher.getHomeDirectory(), STARTUP_FILE); + } + + protected void execResource(final String p) { + InputStream in = JythonShell.class.getClassLoader().getResourceAsStream(p); + if (in != null) { + execStream(in, "resource " + p); + } else { + log.error("Cannot load resource " + p); + } + } + + protected void execFile(final File parent, final String p) { + try { + File script = new File(parent, p); + if (script.canExecute()) { + runMethod0(console, shell, "execfile", + new Class[] { String.class }, + new Object[] { script.getAbsolutePath() } + ); + } else { + log.info("User initialization file " + + script.getAbsolutePath() + + " is not found or not executable"); + } + } catch (InvocationTargetException e) { + log.error("Exception occured while loading file " + p + " : ", e); + } catch (SecurityException e) { + log.error("SecurityException occured while loading file " + p + " : ", e); + } + } + + protected void execStream(final InputStream in, final String p) { + try { + runMethod0(console, shell, "execfile", + new Class[] { InputStream.class, String.class }, + new Object[] { in, p } + ); + } catch (InvocationTargetException e) { + log.error("Exception occured while loading " + p + " : ", e); + } + } + + private static UnsupportedOperationException noShell(final String m, Throwable why) { + final String prefix = "Cannot create Jython shell: "; + final String postfix = "\n (You might need to install jython.jar in the lib directory)"; + return new UnsupportedOperationException(prefix + m + postfix, why); + } + + private static UnsupportedOperationException noInterpreter(Throwable why) { + final String msg = "Cannot create Python interpreter"; + return noShell(msg, why); + } + + private static UnsupportedOperationException cannotStart(Throwable why) { + final String msg = "Cannot start Jython shell"; + return new UnsupportedOperationException(msg, why); + } +}
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 e8cf0ab..9af95ab 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
@@ -179,7 +179,7 @@ } console.printf(" Supported options are:\n"); for (final String v : allowedValues) { - console.printf(" %s\n", v.toString().toLowerCase()); + console.printf(" %s\n", v.toLowerCase()); } } }
diff --git a/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/Startup.py b/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/Startup.py new file mode 100644 index 0000000..92d6e56 --- /dev/null +++ b/gerrit-pgm/src/main/resources/com/google/gerrit/pgm/Startup.py
@@ -0,0 +1,31 @@ +# 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. + +# ----------------------------------------------------------------------- +# Startup script for Gerrit Inspector - a Jython introspector +# ----------------------------------------------------------------------- + +import sys + +def help(): + for (n, v) in vars(sys.modules['__main__']).items(): + if not n.startswith("__") and not n in ['help', 'reload'] \ + and str(type(v)) != "<type 'javapackage'>" \ + and not str(v).startswith("<module"): + print "\"%s\" is \"%s\"" % (n, v) + print + print "Welcome to the Gerrit Inspector" + print "Enter help() to see the above again, EOF to quit and stop Gerrit" + +help()
diff --git a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java index df1f447..9ffcf6b 100644 --- a/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java +++ b/gerrit-pgm/src/test/java/com/google/gerrit/pgm/init/LibrariesTest.java
@@ -21,13 +21,14 @@ import com.google.gerrit.pgm.util.ConsoleUI; import com.google.gerrit.server.config.SitePaths; import com.google.inject.Provider; - -import junit.framework.TestCase; +import org.junit.Test; +import static org.junit.Assert.assertNotNull; import java.io.File; import java.io.FileNotFoundException; -public class LibrariesTest extends TestCase { +public class LibrariesTest { + @Test public void testCreate() throws FileNotFoundException { final SitePaths site = new SitePaths(new File(".")); final ConsoleUI ui = createStrictMock(ConsoleUI.class);
diff --git a/gerrit-plugin-archetype/pom.xml b/gerrit-plugin-archetype/pom.xml index 1b33510..401f126 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.8-SNAPSHOT</version> + <version>2.9-SNAPSHOT</version> <name>Gerrit Code Review - Plugin Archetype</name> <properties>
diff --git a/gerrit-plugin-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/gerrit-plugin-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index ce8fa1a..21f508b 100644 --- a/gerrit-plugin-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/gerrit-plugin-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -28,8 +28,12 @@ <defaultValue>Y</defaultValue> </requiredProperty> - <requiredProperty key="Implementation-Vendor"/> - <requiredProperty key="Implementation-Url"/> + <requiredProperty key="Implementation-Vendor"> + <defaultValue>Gerrit Code Review</defaultValue> + </requiredProperty> + <requiredProperty key="Implementation-Url"> + <defaultValue>http://code.google.com/p/gerrit/</defaultValue> + </requiredProperty> <requiredProperty key="gerritApiType"> <defaultValue>plugin</defaultValue> @@ -58,6 +62,7 @@ <directory></directory> <includes> <include>.gitignore</include> + <include>.settings/*</include> <include>LICENSE</include> </includes> </fileSet>
diff --git a/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.resources.prefs b/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..f15f85d --- /dev/null +++ b/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,5 @@ +#Tue May 15 09:19:33 PDT 2012 +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8
diff --git a/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.runtime.prefs b/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.runtime.prefs new file mode 100644 index 0000000..8667cfd --- /dev/null +++ b/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@ +#Tue Sep 02 16:59:24 PDT 2008 +eclipse.preferences.version=1 +line.separator=\n
diff --git a/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs b/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..2f45466 --- /dev/null +++ b/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,264 @@ +#Fri Jul 16 23:39:13 PDT 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=16 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=0 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=0 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=2 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=true +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=80 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=3 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.ui.prefs b/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..d4218a5 --- /dev/null +++ b/gerrit-plugin-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,61 @@ +#Wed Jul 29 11:31:38 PDT 2009 +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_Google Format +formatter_settings_version=11 +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder=com.google;com;junit;net;org;java;javax; +org.eclipse.jdt.ui.ondemandthreshold=99 +org.eclipse.jdt.ui.staticondemandthreshold=99 +org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/> +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=false +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=false +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=true +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=true +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=false +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/gerrit-plugin-archetype/src/main/resources/archetype-resources/pom.xml b/gerrit-plugin-archetype/src/main/resources/archetype-resources/pom.xml index cbf8a52..cbdb9a2 100644 --- a/gerrit-plugin-archetype/src/main/resources/archetype-resources/pom.xml +++ b/gerrit-plugin-archetype/src/main/resources/archetype-resources/pom.xml
@@ -1,5 +1,5 @@ <!-- -Copyright (C) 2012 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.
diff --git a/gerrit-plugin-archetype/src/main/resources/archetype-resources/src/main/java/HttpModule.java b/gerrit-plugin-archetype/src/main/resources/archetype-resources/src/main/java/HttpModule.java index 2840112..69949ca 100644 --- a/gerrit-plugin-archetype/src/main/resources/archetype-resources/src/main/java/HttpModule.java +++ b/gerrit-plugin-archetype/src/main/resources/archetype-resources/src/main/java/HttpModule.java
@@ -1,4 +1,4 @@ -// Copyright (C) 2012 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.
diff --git a/gerrit-plugin-archetype/src/main/resources/archetype-resources/src/main/java/Module.java b/gerrit-plugin-archetype/src/main/resources/archetype-resources/src/main/java/Module.java index 0d28349..e9668d8 100644 --- a/gerrit-plugin-archetype/src/main/resources/archetype-resources/src/main/java/Module.java +++ b/gerrit-plugin-archetype/src/main/resources/archetype-resources/src/main/java/Module.java
@@ -1,4 +1,4 @@ -// Copyright (C) 2012 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.
diff --git a/gerrit-plugin-archetype/src/main/resources/archetype-resources/src/main/java/SshModule.java b/gerrit-plugin-archetype/src/main/resources/archetype-resources/src/main/java/SshModule.java index aa15ca5..fca5112 100644 --- a/gerrit-plugin-archetype/src/main/resources/archetype-resources/src/main/java/SshModule.java +++ b/gerrit-plugin-archetype/src/main/resources/archetype-resources/src/main/java/SshModule.java
@@ -1,4 +1,4 @@ -// Copyright (C) 2012 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.
diff --git a/gerrit-plugin-gwt-archetype/pom.xml b/gerrit-plugin-gwt-archetype/pom.xml index 3c4dc99..56e6c95 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.8-SNAPSHOT</version> + <version>2.9-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 78f2941..f619f91 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
@@ -18,9 +18,15 @@ <requiredProperties> <requiredProperty key="pluginName"/> - <requiredProperty key="Implementation-Vendor"/> - <requiredProperty key="Implementation-Url"/> - <requiredProperty key="Gwt-Version"/> + <requiredProperty key="Implementation-Vendor"> + <defaultValue>Gerrit Code Review</defaultValue> + </requiredProperty> + <requiredProperty key="Implementation-Url"> + <defaultValue>http://code.google.com/p/gerrit/</defaultValue> + </requiredProperty> + <requiredProperty key="Gwt-Version"> + <defaultValue>2.5.1</defaultValue> + </requiredProperty> <requiredProperty key="gerritApiVersion"> <defaultValue>${defaultGerritApiVersion}</defaultValue> @@ -49,6 +55,7 @@ <directory></directory> <includes> <include>.gitignore</include> + <include>.settings/*</include> <include>LICENSE</include> </includes> </fileSet>
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.resources.prefs b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..f15f85d --- /dev/null +++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,5 @@ +#Tue May 15 09:19:33 PDT 2012 +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.runtime.prefs b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.runtime.prefs new file mode 100644 index 0000000..8667cfd --- /dev/null +++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@ +#Tue Sep 02 16:59:24 PDT 2008 +eclipse.preferences.version=1 +line.separator=\n
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..2f45466 --- /dev/null +++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,264 @@ +#Fri Jul 16 23:39:13 PDT 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=16 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=0 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=0 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=2 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=true +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=80 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=3 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.ui.prefs b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..d4218a5 --- /dev/null +++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,61 @@ +#Wed Jul 29 11:31:38 PDT 2009 +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_Google Format +formatter_settings_version=11 +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder=com.google;com;junit;net;org;java;javax; +org.eclipse.jdt.ui.ondemandthreshold=99 +org.eclipse.jdt.ui.staticondemandthreshold=99 +org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/> +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=false +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=false +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=true +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=true +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=false +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/pom.xml b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/pom.xml index 3a28c48..34912de 100644 --- a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/pom.xml +++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/pom.xml
@@ -1,5 +1,5 @@ <!-- -Copyright (C) 2012 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. @@ -71,7 +71,7 @@ <artifactId>gwt-maven-plugin</artifactId> <version>${Gwt-Version}</version> <configuration> - <module>${package}.HelloPlugins</module> + <module>${package}.HelloPlugin</module> <disableClassMetadata>true</disableClassMetadata> <disableCastChecking>true</disableCastChecking> <webappDirectory>${project.build.directory}/classes/static</webappDirectory> @@ -108,13 +108,6 @@ <version>${Gwt-Version}</version> <scope>provided</scope> </dependency> - - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>4.8.1</version> - <scope>test</scope> - </dependency> </dependencies> <repositories>
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 new file mode 100644 index 0000000..546381b --- /dev/null +++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/HelloMenu.java
@@ -0,0 +1,39 @@ +// 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 ${package}; + +import com.google.gerrit.extensions.annotations.Listen; +import com.google.gerrit.extensions.webui.TopMenu; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Listen +public class HelloMenu implements TopMenu { + public final static String MENU_ID = "hello_open-dialog-box"; + private final List<MenuEntry> menuEntries; + + public HelloMenu() { + menuEntries = new ArrayList<TopMenu.MenuEntry>(); + menuEntries.add(new MenuEntry("Hello", Collections + .singletonList(new MenuItem("Open Dialog Box", "", "", MENU_ID)))); + } + + @Override + public List<MenuEntry> getEntries() { + return menuEntries; + } +}
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/HelloPlugins.gwt.xml b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/HelloPlugin.gwt.xml similarity index 88% rename from gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/HelloPlugins.gwt.xml rename to gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/HelloPlugin.gwt.xml index 4c70fcc..71a29d4 100644 --- a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/HelloPlugins.gwt.xml +++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/HelloPlugin.gwt.xml
@@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (C) 2012 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. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. --> -<module rename-to="hello_gwt_plugins"> +<module rename-to="hello_gwt_plugin"> <!-- Inherit the core Web Toolkit stuff. --> <inherits name="com.google.gwt.user.User"/> <!-- Other module inherits --> @@ -24,6 +24,6 @@ <!-- resources to the plugin. No theme inherits lines were --> <!-- added in order to make this plugin as simple as possible --> <!-- Specify the app entry point class. --> - <entry-point class="${package}.client.HelloPlugins"/> + <entry-point class="${package}.client.HelloPlugin"/> <stylesheet src="hello.css"/> </module>
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/MyExtension.java b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/MyExtension.java index ebdbb26..cf0f52d 100644 --- a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/MyExtension.java +++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/MyExtension.java
@@ -1,4 +1,4 @@ -// Copyright (C) 2012 Google +// 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. @@ -20,6 +20,6 @@ @Listen public class MyExtension extends GwtPlugin { public MyExtension() { - super("hello_gwt_plugins"); + super("hello_gwt_plugin"); } }
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/client/HelloPlugins.java b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/client/HelloPlugin.java similarity index 70% rename from gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/client/HelloPlugins.java rename to gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/client/HelloPlugin.java index 5584d85..24b8136 100644 --- a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/client/HelloPlugins.java +++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/client/HelloPlugin.java
@@ -1,4 +1,4 @@ -// Copyright (C) 2012 Google Inc +// 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. @@ -14,33 +14,23 @@ package ${package}.client; -import com.google.gerrit.client.Plugin; +import com.google.gerrit.plugin.client.Plugin; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.DialogBox; -import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.VerticalPanel; +import ${package}.HelloMenu; + /** - * HelloWorld Plugins. + * HelloWorld Plugin. */ -public class HelloPlugins extends Plugin { +public class HelloPlugin extends Plugin { @Override public void onModuleLoad() { - Image img = new Image("http://code.google.com/webtoolkit/logo-185x175.png"); - Button button = new Button("Click me"); - - VerticalPanel vPanel = new VerticalPanel(); - vPanel.setWidth("100%"); - vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER); - vPanel.add(img); - vPanel.add(button); - - RootPanel.get().add(vPanel); - // Create the dialog box final DialogBox dialogBox = new DialogBox(); @@ -62,11 +52,14 @@ // Set the contents of the Widget dialogBox.setWidget(dialogVPanel); - button.addClickHandler(new ClickHandler() { - public void onClick(ClickEvent event) { - dialogBox.center(); - dialogBox.show(); - } - }); + RootPanel rootPanel = RootPanel.get(HelloMenu.MENU_ID); + rootPanel.getElement().removeAttribute("href"); + rootPanel.addDomHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + dialogBox.center(); + dialogBox.show(); + } + }, ClickEvent.getType()); } }
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/public/gwt-hello-gadgets-igoogle-thumb.png b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/public/gwt-hello-gadgets-igoogle-thumb.png deleted file mode 100644 index e970774..0000000 --- a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/public/gwt-hello-gadgets-igoogle-thumb.png +++ /dev/null Binary files differ
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/public/gwt-hello-gadgets-igoogle.png b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/public/gwt-hello-gadgets-igoogle.png deleted file mode 100644 index c041149..0000000 --- a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/public/gwt-hello-gadgets-igoogle.png +++ /dev/null Binary files differ
diff --git a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/public/hello.css b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/public/hello.css index 73bf5c6..13c5177 100644 --- a/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/public/hello.css +++ b/gerrit-plugin-gwt-archetype/src/main/resources/archetype-resources/src/main/java/public/hello.css
@@ -101,3 +101,6 @@ zoom: 1; } +#hello_open-dialog-box { + cursor: pointer; +}
diff --git a/gerrit-plugin-gwtui/BUCK b/gerrit-plugin-gwtui/BUCK new file mode 100644 index 0000000..58eda5c --- /dev/null +++ b/gerrit-plugin-gwtui/BUCK
@@ -0,0 +1,20 @@ +SRC = 'src/main/java/com/google/gerrit/' + +gwt_module( + name = 'client', + srcs = glob([SRC + '**/*.java']), + gwtxml = SRC + 'Plugin.gwt.xml', + resources = glob(['src/main/resources/**/*']), + deps = [ + '//lib/gwt:user', + '//lib/gwt:dev', + ], + visibility = ['PUBLIC'], +) + +java_library( + name = 'src', + srcs = [], + resources = glob(['src/main/**/*']), + visibility = ['PUBLIC'], +)
diff --git a/gerrit-plugin-gwtui/pom.xml b/gerrit-plugin-gwtui/pom.xml deleted file mode 100644 index 3c9e2ca..0000000 --- a/gerrit-plugin-gwtui/pom.xml +++ /dev/null
@@ -1,161 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -Copyright (C) 2012 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. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <groupId>com.google.gerrit</groupId> - <artifactId>gerrit-plugin-gwtui</artifactId> - <version>2.8-SNAPSHOT</version> - <name>Gerrit Code Review - Plugin GWT UI</name> - - <description> - API for UI plugins to build with GWT and integrate with Gerrit - </description> - - <dependencies> - <dependency> - <groupId>com.google.gwt</groupId> - <artifactId>gwt-user</artifactId> - <version>2.5.1</version> - </dependency> - - <dependency> - <groupId>com.google.gwt</groupId> - <artifactId>gwt-dev</artifactId> - <version>2.5.1</version> - </dependency> - </dependencies> - - <build> - <pluginManagement> - <plugins> - <plugin> - <groupId>org.eclipse.m2e</groupId> - <artifactId>lifecycle-mapping</artifactId> - <version>1.0.0</version> - <configuration> - <lifecycleMappingMetadata> - <pluginExecutions> - <pluginExecution> - <pluginExecutionFilter> - <groupId>org.codehaus.mojo</groupId> - <artifactId>gwt-maven-plugin</artifactId> - <versionRange>[2.5.0,)</versionRange> - <goals> - <goal>resources</goal> - <goal>compile</goal> - <goal>i18n</goal> - <goal>generateAsync</goal> - </goals> - </pluginExecutionFilter> - <action> - <execute /> - </action> - </pluginExecution> - <pluginExecution> - <pluginExecutionFilter> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-war-plugin</artifactId> - <versionRange>[2.1.1,)</versionRange> - <goals> - <goal>exploded</goal> - </goals> - </pluginExecutionFilter> - <action> - <execute /> - </action> - </pluginExecution> - </pluginExecutions> - </lifecycleMappingMetadata> - </configuration> - </plugin> - </plugins> - </pluginManagement> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-source-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>gwt-maven-plugin</artifactId> - <configuration> - <module>com.google.gerrit.Plugin</module> - <disableClassMetadata>true</disableClassMetadata> - <disableCastChecking>true</disableCastChecking> - </configuration> - <executions> - <execution> - <goals> - <goal>resources</goal> - <goal>compile</goal> - </goals> - </execution> - </executions> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-antrun-plugin</artifactId> - <executions> - <execution> - <id>unpack-sources</id> - <phase>package</phase> - <configuration> - <tasks> - <unzip src="${project.build.directory}/${project.artifactId}-${project.version}-sources.jar" dest="${project.build.directory}/unpack_sources" /> - </tasks> - </configuration> - <goals> - <goal>run</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <configuration> - <sourcepath>${project.build.directory}/unpack_sources</sourcepath> - <encoding>ISO-8859-1</encoding> - <quiet>true</quiet> - <detectOfflineLinks>false</detectOfflineLinks> - </configuration> - <executions> - <execution> - <goals> - <goal>jar</goal> - </goals> - <phase>package</phase> - </execution> - </executions> - </plugin> - - </plugins> - </build> -</project> -
diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/Plugin.gwt.xml b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/Plugin.gwt.xml index 03edf67..1e2280a 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/Plugin.gwt.xml +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/Plugin.gwt.xml
@@ -14,10 +14,10 @@ limitations under the License. --> <module> - <define-linker name="gerrit_plugin" class="com.google.gerrit.linker.GerritPluginLinker"/> + <define-linker name="gerrit_plugin" class="com.google.gerrit.plugin.linker.GerritPluginLinker"/> <add-linker name="gerrit_plugin"/> - <generate-with class="com.google.gerrit.rebind.PluginGenerator"> - <when-type-assignable class="com.google.gerrit.client.Plugin"/> + <generate-with class="com.google.gerrit.plugin.rebind.PluginGenerator"> + <when-type-assignable class="com.google.gerrit.plugin.client.Plugin"/> </generate-with> - <source path="client"/> + <source path="plugin/client"/> </module>
diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/client/Plugin.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/Plugin.java similarity index 95% rename from gerrit-plugin-gwtui/src/main/java/com/google/gerrit/client/Plugin.java rename to gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/Plugin.java index 1291b79..b5f7175 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/client/Plugin.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/Plugin.java
@@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.client; +package com.google.gerrit.plugin.client; import com.google.gwt.core.client.EntryPoint;
diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/NativeString.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/NativeString.java new file mode 100644 index 0000000..fe65857 --- /dev/null +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/NativeString.java
@@ -0,0 +1,54 @@ +// 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.plugin.client.rpc; + +import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.user.client.rpc.AsyncCallback; + +/** Wraps a String that was returned from a JSON API. */ +public class NativeString extends JavaScriptObject { + private static final JavaScriptObject TYPE = init(); + + private static final native JavaScriptObject init() + /*-{ return $wnd.Gerrit.JsonString }-*/; + + public final native String asString() + /*-{ return this.get(); }-*/; + + public static final + AsyncCallback<NativeString> unwrap(final AsyncCallback<String> cb) { + return new AsyncCallback<NativeString>() { + @Override + public void onSuccess(NativeString result) { + cb.onSuccess(result != null ? result.asString() : null); + } + + @Override + public void onFailure(Throwable caught) { + cb.onFailure(caught); + } + }; + } + + public static final boolean is(JavaScriptObject o) { + return is(TYPE, o); + } + + private static final native boolean is(JavaScriptObject T, JavaScriptObject o) + /*-{ return o instanceof T }-*/; + + protected NativeString() { + } +}
diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/Natives.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/Natives.java new file mode 100644 index 0000000..6f5b136 --- /dev/null +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/Natives.java
@@ -0,0 +1,71 @@ +// Copyright (C) 2012 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.plugin.client.rpc; + +import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.core.client.JsArray; +import com.google.gwt.json.client.JSONObject; + +import java.util.AbstractList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +public class Natives { + /** + * Get the names of defined properties on the object. The returned set + * iterates in the native iteration order, which may match the source order. + */ + public static Set<String> keys(JavaScriptObject obj) { + if (obj != null) { + return new JSONObject(obj).keySet(); + } + return Collections.emptySet(); + } + + public static <T extends JavaScriptObject> List<T> asList( + final JsArray<T> arr) { + if (arr == null) { + return null; + } + return new AbstractList<T>() { + @Override + public T set(int index, T element) { + T old = arr.get(index); + arr.set(index, element); + return old; + } + + @Override + public T get(int index) { + return arr.get(index); + } + + @Override + public int size() { + return arr.length(); + } + }; + } + + public static <T extends JavaScriptObject> JsArray<T> arrayOf(T element) { + JsArray<T> arr = JavaScriptObject.createArray().cast(); + arr.push(element); + return arr; + } + + private Natives() { + } +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/NoContent.java similarity index 64% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/NoContent.java index a5371d2..55744d5 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/NoContent.java
@@ -12,19 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.plugin.client.rpc; -import com.google.common.collect.Maps; +import com.google.gwt.core.client.JavaScriptObject; -import java.util.Map; - -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; +public class NoContent extends JavaScriptObject { + protected NoContent() { } }
diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/RestApi.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/RestApi.java new file mode 100644 index 0000000..57a23e0 --- /dev/null +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/client/rpc/RestApi.java
@@ -0,0 +1,171 @@ +// 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.plugin.client.rpc; + +import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.http.client.URL; +import com.google.gwt.user.client.rpc.AsyncCallback; + +public class RestApi { + private final StringBuilder path; + private boolean hasQueryParams; + + public RestApi(String name) { + path = new StringBuilder(); + path.append(name); + } + + public RestApi view(String name) { + return idRaw(name); + } + + public RestApi view(String pluginName, String name) { + return idRaw(pluginName + "~" + name); + } + + public RestApi id(String id) { + return idRaw(URL.encodeQueryString(id)); + } + + public RestApi id(int id) { + return idRaw(Integer.toString(id)); + } + + public RestApi idRaw(String name) { + if (hasQueryParams) { + throw new IllegalStateException(); + } + if (path.charAt(path.length() - 1) != '/') { + path.append('/'); + } + path.append(name); + return this; + } + + public RestApi addParameter(String name, String value) { + return addParameterRaw(name, URL.encodeQueryString(value)); + } + + public RestApi addParameter(String name, String... value) { + for (String val : value) { + addParameter(name, val); + } + return this; + } + + public RestApi addParameterTrue(String name) { + return addParameterRaw(name, null); + } + + public RestApi addParameter(String name, boolean value) { + return addParameterRaw(name, value ? "t" : "f"); + } + + public RestApi addParameter(String name, int value) { + return addParameterRaw(name, String.valueOf(value)); + } + + public RestApi addParameter(String name, Enum<?> value) { + return addParameterRaw(name, value.name()); + } + + public RestApi addParameterRaw(String name, String value) { + if (hasQueryParams) { + path.append("&"); + } else { + path.append("?"); + hasQueryParams = true; + } + path.append(name); + if (value != null) { + path.append("=").append(value); + } + return this; + } + + public String path() { + return path.toString(); + } + + public <T extends JavaScriptObject> + void get(AsyncCallback<T> cb) { + get(path(), wrap(cb)); + } + + public void getString(AsyncCallback<String> cb) { + get(NativeString.unwrap(cb)); + } + + private native static void get(String p, JavaScriptObject r) + /*-{ $wnd.Gerrit.get(p, r) }-*/; + + public <T extends JavaScriptObject> + void put(AsyncCallback<T> cb) { + put(path(), wrap(cb)); + } + + private native static void put(String p, JavaScriptObject r) + /*-{ $wnd.Gerrit.put(p, r) }-*/; + + public <T extends JavaScriptObject> + void put(String content, AsyncCallback<T> cb) { + put(path(), content, wrap(cb)); + } + + private native static + void put(String p, String c, JavaScriptObject r) + /*-{ $wnd.Gerrit.put(p, c, r) }-*/; + + public <T extends JavaScriptObject> + void put(JavaScriptObject content, AsyncCallback<T> cb) { + put(path(), content, wrap(cb)); + } + + private native static + void put(String p, JavaScriptObject c, JavaScriptObject r) + /*-{ $wnd.Gerrit.put(p, c, r) }-*/; + + public <T extends JavaScriptObject> + void post(String content, AsyncCallback<T> cb) { + post(path(), content, wrap(cb)); + } + + private native static + void post(String p, String c, JavaScriptObject r) + /*-{ $wnd.Gerrit.post(p, c, r) }-*/; + + public <T extends JavaScriptObject> + void post(JavaScriptObject content, AsyncCallback<T> cb) { + post(path(), content, wrap(cb)); + } + + private native static + void post(String p, JavaScriptObject c, JavaScriptObject r) + /*-{ $wnd.Gerrit.post(p, c, r) }-*/; + + public void delete(AsyncCallback<NoContent> cb) { + delete(path(), wrap(cb)); + } + + private native static void delete(String p, JavaScriptObject r) + /*-{ '$wnd.Gerrit.delete'(p, r) }-*/; + + private native static <T extends JavaScriptObject> + JavaScriptObject wrap(AsyncCallback<T> b) /*-{ + return function(r) { + b.@com.google.gwt.user.client.rpc.AsyncCallback::onSuccess(Ljava/lang/Object;)(r) + } + }-*/; +}
diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/linker/GerritPluginLinker.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/linker/GerritPluginLinker.java similarity index 96% rename from gerrit-plugin-gwtui/src/main/java/com/google/gerrit/linker/GerritPluginLinker.java rename to gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/linker/GerritPluginLinker.java index e50334e..18f6e54 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/linker/GerritPluginLinker.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/linker/GerritPluginLinker.java
@@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.linker; +package com.google.gerrit.plugin.linker; import com.google.gwt.core.ext.LinkerContext; import com.google.gwt.core.linker.CrossSiteIframeLinker;
diff --git a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/rebind/PluginGenerator.java b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/rebind/PluginGenerator.java similarity index 98% rename from gerrit-plugin-gwtui/src/main/java/com/google/gerrit/rebind/PluginGenerator.java rename to gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/rebind/PluginGenerator.java index 37c3e96..8278280 100644 --- a/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/rebind/PluginGenerator.java +++ b/gerrit-plugin-gwtui/src/main/java/com/google/gerrit/plugin/rebind/PluginGenerator.java
@@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.rebind; +package com.google.gerrit.plugin.rebind; import java.io.PrintWriter;
diff --git a/gerrit-plugin-js-archetype/pom.xml b/gerrit-plugin-js-archetype/pom.xml index 681d7a9..eb32b11 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.8-SNAPSHOT</version> + <version>2.9-SNAPSHOT</version> <name>Gerrit Code Review - Web UI JavaScript Plugin Archetype</name> <properties>
diff --git a/gerrit-plugin-js-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml b/gerrit-plugin-js-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml index 054caae..e4978dd 100644 --- a/gerrit-plugin-js-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml +++ b/gerrit-plugin-js-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -18,8 +18,12 @@ <requiredProperties> <requiredProperty key="pluginName"/> - <requiredProperty key="Implementation-Vendor"/> - <requiredProperty key="Implementation-Url"/> + <requiredProperty key="Implementation-Vendor"> + <defaultValue>Gerrit Code Review</defaultValue> + </requiredProperty> + <requiredProperty key="Implementation-Url"> + <defaultValue>http://code.google.com/p/gerrit/</defaultValue> + </requiredProperty> <requiredProperty key="gerritApiType"> <defaultValue>js</defaultValue> @@ -55,6 +59,7 @@ <directory></directory> <includes> <include>.gitignore</include> + <include>.settings/*</include> <include>LICENSE</include> </includes> </fileSet>
diff --git a/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.resources.prefs b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..f15f85d --- /dev/null +++ b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,5 @@ +#Tue May 15 09:19:33 PDT 2012 +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8
diff --git a/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.runtime.prefs b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.runtime.prefs new file mode 100644 index 0000000..8667cfd --- /dev/null +++ b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@ +#Tue Sep 02 16:59:24 PDT 2008 +eclipse.preferences.version=1 +line.separator=\n
diff --git a/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..2f45466 --- /dev/null +++ b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,264 @@ +#Fri Jul 16 23:39:13 PDT 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=16 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=0 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=0 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=2 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=true +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=80 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=3 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.ui.prefs b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..d4218a5 --- /dev/null +++ b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,61 @@ +#Wed Jul 29 11:31:38 PDT 2009 +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_Google Format +formatter_settings_version=11 +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder=com.google;com;junit;net;org;java;javax; +org.eclipse.jdt.ui.ondemandthreshold=99 +org.eclipse.jdt.ui.staticondemandthreshold=99 +org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/> +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=false +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=false +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=true +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=true +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=false +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/pom.xml b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/pom.xml index 85de7b5..207e49a 100644 --- a/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/pom.xml +++ b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/pom.xml
@@ -1,5 +1,5 @@ <!-- -Copyright (C) 2012 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.
diff --git a/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/src/main/java/MyJsExtension.java b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/src/main/java/MyJsExtension.java index bec914dd..da80a83 100644 --- a/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/src/main/java/MyJsExtension.java +++ b/gerrit-plugin-js-archetype/src/main/resources/archetype-resources/src/main/java/MyJsExtension.java
@@ -1,4 +1,4 @@ -// Copyright (C) 2012 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.
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java index 5cfa5e1..5dc2a08 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java
@@ -56,7 +56,7 @@ */ public final class Account { public static enum FieldName { - FULL_NAME, USER_NAME, REGISTER_NEW_EMAIL; + FULL_NAME, USER_NAME, REGISTER_NEW_EMAIL } public static final String USER_NAME_PATTERN_FIRST = "[a-zA-Z]";
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 6cc83e5..efdc92b 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
@@ -27,12 +27,12 @@ /** Preferred scheme type to download a change. */ public static enum DownloadScheme { - ANON_GIT, ANON_HTTP, HTTP, SSH, REPO_DOWNLOAD, DEFAULT_DOWNLOADS; + ANON_GIT, ANON_HTTP, HTTP, SSH, REPO_DOWNLOAD, DEFAULT_DOWNLOADS } /** Preferred method to download a change. */ public static enum DownloadCommand { - REPO_DOWNLOAD, PULL, CHECKOUT, CHERRY_PICK, FORMAT_PATCH, DEFAULT_DOWNLOADS; + REPO_DOWNLOAD, PULL, CHECKOUT, CHERRY_PICK, FORMAT_PATCH, DEFAULT_DOWNLOADS } public static enum DateFormat { @@ -69,7 +69,7 @@ COLLAPSE_ALL, EXPAND_MOST_RECENT, EXPAND_RECENT, - EXPAND_ALL; + EXPAND_ALL } public static enum DiffView {
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroup.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroup.java index ea9c52d..a4846ac 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroup.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AccountGroup.java
@@ -142,7 +142,7 @@ * who is a member of the owner group. These groups are not treated special * in the code. */ - INTERNAL; + INTERNAL } /** Common UUID assigned to the "Project Owners" placeholder group. */
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AuthType.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AuthType.java index b615fc5..6af9610 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AuthType.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/AuthType.java
@@ -80,5 +80,5 @@ CUSTOM_EXTENSION, /** Development mode to enable becoming anyone you want. */ - DEVELOPMENT_BECOME_ANY_ACCOUNT; + DEVELOPMENT_BECOME_ANY_ACCOUNT }
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 f3cf471..3b5a1aa 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
@@ -74,7 +74,7 @@ MERGE_ALWAYS, - CHERRY_PICK; + CHERRY_PICK } public static enum State { @@ -82,13 +82,13 @@ READ_ONLY, - HIDDEN; + HIDDEN } public static enum InheritableBoolean { TRUE, FALSE, - INHERIT; + INHERIT } protected NameKey name;
diff --git a/gerrit-server/BUCK b/gerrit-server/BUCK index 1db7555..8b3f531 100644 --- a/gerrit-server/BUCK +++ b/gerrit-server/BUCK
@@ -1,15 +1,28 @@ +CONSTANTS_SRC = [ + 'src/main/java/com/google/gerrit/server/documentation/Constants.java', +] + SRCS = glob([ - 'src/main/java/**/*.java', - 'src/test/java/com/google/gerrit/server/project/Util.java' -]) + 'src/main/java/**/*.java', + 'src/test/java/com/google/gerrit/server/project/Util.java', + ], + excludes = CONSTANTS_SRC, +) RESOURCES = glob(['src/main/resources/**/*']) +java_library2( + name = 'constants', + srcs = CONSTANTS_SRC, + visibility = ['PUBLIC'], +) + # TODO(sop) break up gerrit-server java_library(), its too big java_library2( name = 'server', srcs = SRCS, resources = RESOURCES, deps = [ + ':constants', '//gerrit-antlr:query_exception', '//gerrit-antlr:query_parser', '//gerrit-common:server', @@ -48,6 +61,9 @@ '//lib/joda:joda-time', '//lib/log:api', '//lib/prolog:prolog-cafe', + '//lib/lucene:analyzers-common', + '//lib/lucene:core', + '//lib/lucene:query-parser', ], compile_deps = [ '//lib/bouncycastle:bcprov', @@ -129,6 +145,7 @@ '//gerrit-common:server', '//gerrit-extension-api:api', '//gerrit-reviewdb:server', + '//lib:args4j', '//lib:easymock', '//lib:guava', '//lib:gwtorm',
diff --git a/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleModule.java b/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleModule.java index 04682f5..a22e6da 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/lifecycle/LifecycleModule.java
@@ -1,7 +1,7 @@ package com.google.gerrit.lifecycle; import com.google.gerrit.extensions.events.LifecycleListener; -import com.google.inject.AbstractModule; +import com.google.gerrit.server.config.FactoryModule; import com.google.inject.Singleton; import com.google.inject.binder.LinkedBindingBuilder; import com.google.inject.internal.UniqueAnnotations; @@ -9,7 +9,7 @@ import java.lang.annotation.Annotation; /** Module to support registering a unique LifecyleListener. */ -public abstract class LifecycleModule extends AbstractModule { +public abstract class LifecycleModule extends FactoryModule { /** * Create a unique listener binding. * <p>
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 a0196fd..4ab3442 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
@@ -64,7 +64,7 @@ } public static enum Status { - NO_RULES, COMPILED; + NO_RULES, COMPILED } private final File ruleDir;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/AccessPath.java b/gerrit-server/src/main/java/com/google/gerrit/server/AccessPath.java index 31df875..cb720c8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/AccessPath.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/AccessPath.java
@@ -32,5 +32,5 @@ SSH_COMMAND, /** Access from a Git client using any Git protocol. */ - GIT; + GIT }
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 new file mode 100644 index 0000000..15062ac --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/DefaultFileExtensionRegistry.java
@@ -0,0 +1,104 @@ +// 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; + +import com.google.common.collect.ImmutableMap; + +import eu.medsea.mimeutil.MimeType; +import eu.medsea.mimeutil.MimeUtil; +import eu.medsea.mimeutil.detector.MimeDetector; + +import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.util.Collection; +import java.util.Collections; + +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 ImmutableMap<String, MimeType> TYPES = ImmutableMap.of( + ".gitmodules", INI, + "project.config", INI, + "BUCK", PYTHON, + "defs", newMimeType(PYTHON.toString(), 1), + "go", newMimeType("text/x-go", 1)); + + 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; + } + }; + } + + static { + for (MimeType type : TYPES.values()) { + MimeUtil.addKnownMimeType(type); + } + } + + @Override + public String getDescription() { + return getClass().getName(); + } + + @Override + protected Collection<MimeType> getMimeTypesFileName(String name) { + int s = name.lastIndexOf('/'); + if (s >= 0) { + name = name.substring(s + 1); + } + + MimeType type = TYPES.get(name); + if (type != null) { + return Collections.singletonList(type); + } + + int d = name.lastIndexOf('.'); + if (0 < d) { + type = TYPES.get(name.substring(d + 1)); + if (type != null) { + return Collections.singletonList(type); + } + } + + return Collections.emptyList(); + } + + @Override + protected Collection<MimeType> getMimeTypesFile(File file) { + return getMimeTypesFileName(file.getName()); + } + + @Override + protected Collection<MimeType> getMimeTypesURL(URL url) { + return getMimeTypesFileName(url.getPath()); + } + + @Override + protected Collection<MimeType> getMimeTypesInputStream(InputStream arg0) { + return Collections.emptyList(); + } + + @Override + protected Collection<MimeType> getMimeTypesByteArray(byte[] arg0) { + return Collections.emptyList(); + } +}
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 b271d6a..ff46b00 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
@@ -54,13 +54,13 @@ if (HostPlatform.isWin32()) { register("eu.medsea.mimeutil.detector.WindowsRegistryMimeDetector"); } + register(DefaultFileExtensionRegistry.class.getName()); } private void register(String name) { mimeUtil.registerMimeDetector(name); } - /** * Get specificity of mime types with generic types forced to low values *
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/StringUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/StringUtil.java index fe1072d..2133dfb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/StringUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/StringUtil.java
@@ -22,7 +22,7 @@ * corresponds to its ASCII value, i.e. the string representation of * ASCII 0 is found in the first element of this array. */ - static String[] NON_PRINTABLE_CHARS = + private static final String[] NON_PRINTABLE_CHARS = { "\\x00", "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", "\\x06", "\\a", "\\b", "\\t", "\\n", "\\v", "\\f", "\\r", "\\x0e", "\\x0f", "\\x10", "\\x11", "\\x12", "\\x13", "\\x14", "\\x15", "\\x16", "\\x17",
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDirectory.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDirectory.java index a4881a4..4dc9d79 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDirectory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountDirectory.java
@@ -34,7 +34,7 @@ AVATARS, /** Unique user identity to login to Gerrit, may be deprecated. */ - USERNAME; + USERNAME } public abstract void fillAccountInfo(
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibility.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibility.java index 7452da3..7ee8db6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibility.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountVisibility.java
@@ -29,5 +29,5 @@ * Other accounts are not visible to the given user unless they are explicitly * collaborating on a change. */ - NONE; + NONE }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AddSshKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AddSshKey.java index 2cff009..0b40c81 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AddSshKey.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AddSshKey.java
@@ -19,9 +19,7 @@ import com.google.gerrit.common.errors.InvalidSshKeyException; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.BadRequestException; -import com.google.gerrit.extensions.restapi.MethodNotAllowedException; import com.google.gerrit.extensions.restapi.RawInput; -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.reviewdb.client.AccountSshKey; @@ -57,8 +55,7 @@ @Override public Response<SshKeyInfo> apply(AccountResource rsrc, Input input) - throws AuthException, MethodNotAllowedException, BadRequestException, - ResourceConflictException, OrmException, IOException { + throws AuthException, BadRequestException, OrmException, IOException { if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("not allowed to add SSH keys");
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java index 340746e..3b03c3a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java
@@ -89,7 +89,7 @@ } @Override - public Object apply(TopLevelResource rsrc, Input input) + public Response<AccountInfo> apply(TopLevelResource rsrc, Input input) throws BadRequestException, ResourceConflictException, UnprocessableEntityException, OrmException { if (input == null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java index 4fda74c..9a5a864 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateEmail.java
@@ -78,8 +78,8 @@ } @Override - public Object apply(AccountResource rsrc, Input input) throws AuthException, - BadRequestException, ResourceConflictException, + public Response<EmailInfo> apply(AccountResource rsrc, Input input) + throws AuthException, BadRequestException, ResourceConflictException, ResourceNotFoundException, OrmException, EmailException, MethodNotAllowedException { if (self.get() != rsrc.getUser()
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteActive.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteActive.java index d44bc2c..4382655 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteActive.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteActive.java
@@ -43,7 +43,7 @@ } @Override - public Object apply(AccountResource rsrc, Input input) + public Response<?> apply(AccountResource rsrc, Input input) throws ResourceNotFoundException, OrmException { Account a = dbProvider.get().accounts().get(rsrc.getUser().getAccountId()); if (a == null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java index 4b38b9f..b38c49b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteEmail.java
@@ -48,7 +48,7 @@ } @Override - public Object apply(AccountResource.Email rsrc, Input input) + public Response<?> apply(AccountResource.Email rsrc, Input input) throws AuthException, ResourceNotFoundException, ResourceConflictException, MethodNotAllowedException, OrmException { if (self.get() != rsrc.getUser()
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteSshKey.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteSshKey.java index cf60df1..bbba48a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteSshKey.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteSshKey.java
@@ -40,7 +40,7 @@ } @Override - public Object apply(AccountResource.SshKey rsrc, Input input) + public Response<?> apply(AccountResource.SshKey rsrc, Input input) throws OrmException { dbProvider.get().accountSshKeys() .deleteKeys(Collections.singleton(rsrc.getSshKey().getKey()));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetActive.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetActive.java index 76c7ddb..c042e18 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetActive.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetActive.java
@@ -14,16 +14,16 @@ package com.google.gerrit.server.account; -import com.google.gerrit.extensions.restapi.ResourceNotFoundException; +import com.google.gerrit.extensions.restapi.BinaryResult; import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestReadView; public class GetActive implements RestReadView<AccountResource> { @Override - public Object apply(AccountResource rsrc) throws ResourceNotFoundException { + public Object apply(AccountResource rsrc) { if (rsrc.getUser().getAccount().isActive()) { - return Response.ok(""); + return BinaryResult.create("ok\n"); } - throw new ResourceNotFoundException(); + return Response.none(); } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java index 615d09e..03ba94f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java
@@ -36,7 +36,6 @@ import com.google.gerrit.extensions.config.CapabilityDefinition; import com.google.gerrit.extensions.registration.DynamicMap; import com.google.gerrit.extensions.restapi.AuthException; -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.CurrentUser; @@ -59,7 +58,7 @@ @Option(name = "--format", usage = "(deprecated) output format") private OutputFormat format; - @Option(name = "-q", metaVar = "CAP", multiValued = true, usage = "Capability to inspect") + @Option(name = "-q", metaVar = "CAP", usage = "Capability to inspect") void addQuery(String name) { if (query == null) { query = Sets.newHashSet(); @@ -79,8 +78,7 @@ } @Override - public Object apply(AccountResource resource) - throws BadRequestException, Exception { + public Object apply(AccountResource resource) throws AuthException { if (self.get() != resource.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("restricted to administrator"); @@ -178,7 +176,7 @@ static class CheckOne implements RestReadView<AccountResource.Capability> { @Override - public Object apply(Capability resource) { + public BinaryResult apply(Capability resource) { return BinaryResult.create("ok\n"); } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetHttpPassword.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetHttpPassword.java index 8eaf4b3..7fc82f9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetHttpPassword.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetHttpPassword.java
@@ -18,7 +18,6 @@ import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.server.CurrentUser; -import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; @@ -33,7 +32,7 @@ @Override public String apply(AccountResource rsrc) throws AuthException, - ResourceNotFoundException, OrmException { + ResourceNotFoundException { if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) { throw new AuthException("not allowed to get http password");
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutActive.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutActive.java index a860fda..f1b5151 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutActive.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutActive.java
@@ -43,7 +43,7 @@ } @Override - public Object apply(AccountResource rsrc, Input input) + public Response<String> apply(AccountResource rsrc, Input input) throws ResourceNotFoundException, OrmException { Account a = dbProvider.get().accounts().get(rsrc.getUser().getAccountId()); if (a == null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutEmail.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutEmail.java index b79d8dc4..ba12bbf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutEmail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/PutEmail.java
@@ -15,12 +15,13 @@ package com.google.gerrit.server.account; 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.account.CreateEmail.Input; public class PutEmail implements RestModifyView<AccountResource.Email, Input> { @Override - public Object apply(AccountResource.Email rsrc, Input input) + public Response<?> apply(AccountResource.Email rsrc, Input input) throws ResourceConflictException { throw new ResourceConflictException("email exists"); }
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 0e335d0..b8984ab 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
@@ -42,7 +42,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.UnsupportedEncodingException; import java.util.Collections; class StarredChanges implements @@ -65,7 +64,7 @@ @Override public AccountResource.StarredChange parse(AccountResource parent, IdString id) - throws ResourceNotFoundException, OrmException, UnsupportedEncodingException { + throws ResourceNotFoundException, OrmException { IdentifiedUser user = parent.getUser(); try { user.asyncStarredChanges(); @@ -107,9 +106,6 @@ .setChange(changes.parse(TopLevelResource.INSTANCE, id)); } catch (ResourceNotFoundException e) { throw new UnprocessableEntityException(String.format("change %s not found", id.get())); - } catch (UnsupportedEncodingException e) { - log.error("cannot resolve change", e); - throw new UnprocessableEntityException("internal server error"); } catch (OrmException e) { log.error("cannot resolve change", e); throw new UnprocessableEntityException("internal server error"); @@ -161,7 +157,7 @@ @Override public Response<?> apply(AccountResource.StarredChange rsrc, EmptyInput in) - throws AuthException, OrmException { + throws AuthException { if (self.get() != rsrc.getUser()) { throw new AuthException("not allowed update starred changes"); }
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 new file mode 100644 index 0000000..35700e6 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/GerritApiImpl.java
@@ -0,0 +1,34 @@ +// 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.api; + +import com.google.gerrit.extensions.api.GerritApi; +import com.google.gerrit.extensions.api.changes.Changes; +import com.google.inject.Inject; +import com.google.inject.Provider; + +class GerritApiImpl implements GerritApi { + private final Provider<Changes> changes; + + @Inject + GerritApiImpl(Provider<Changes> changes) { + this.changes = changes; + } + + @Override + public Changes changes() { + return changes.get(); + } +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/Module.java similarity index 64% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-server/src/main/java/com/google/gerrit/server/api/Module.java index a5371d2..6f82a81 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/Module.java
@@ -12,19 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.server.api; -import com.google.common.collect.Maps; +import com.google.gerrit.extensions.api.GerritApi; +import com.google.inject.AbstractModule; -import java.util.Map; +public class Module extends AbstractModule { + @Override + protected void configure() { + bind(GerritApi.class).to(GerritApiImpl.class); -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; + install(new com.google.gerrit.server.api.changes.Module()); } }
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 new file mode 100644 index 0000000..855b0c1 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
@@ -0,0 +1,142 @@ +// 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.api.changes; + +import com.google.gerrit.common.errors.EmailException; +import com.google.gerrit.extensions.api.changes.AbandonInput; +import com.google.gerrit.extensions.api.changes.ChangeApi; +import com.google.gerrit.extensions.api.changes.Changes; +import com.google.gerrit.extensions.api.changes.RestoreInput; +import com.google.gerrit.extensions.api.changes.RevertInput; +import com.google.gerrit.extensions.api.changes.RevisionApi; +import com.google.gerrit.extensions.restapi.IdString; +import com.google.gerrit.extensions.restapi.RestApiException; +import com.google.gerrit.server.change.Abandon; +import com.google.gerrit.server.change.ChangeResource; +import com.google.gerrit.server.change.Restore; +import com.google.gerrit.server.change.Revert; +import com.google.gerrit.server.change.Revisions; +import com.google.gwtorm.server.OrmException; +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.assistedinject.Assisted; + +import java.io.IOException; + +class ChangeApiImpl implements ChangeApi { + interface Factory { + ChangeApiImpl create(ChangeResource change); + } + + private final Changes changeApi; + private final Revisions revisions; + private final RevisionApiImpl.Factory revisionApi; + private final ChangeResource change; + private final Provider<Abandon> abandon; + private final Provider<Revert> revert; + private final Provider<Restore> restore; + + @Inject + ChangeApiImpl(Changes changeApi, + Revisions revisions, + RevisionApiImpl.Factory revisionApi, + Provider<Abandon> abandon, + Provider<Revert> revert, + Provider<Restore> restore, + @Assisted ChangeResource change) { + this.changeApi = changeApi; + this.revert = revert; + this.revisions = revisions; + this.revisionApi = revisionApi; + this.abandon = abandon; + this.restore = restore; + this.change = change; + } + + @Override + public String id() { + return Integer.toString(change.getChange().getId().get()); + } + + @Override + public RevisionApi current() throws RestApiException { + return revision("current"); + } + + @Override + public RevisionApi revision(int id) throws RestApiException { + return revision(String.valueOf(id)); + } + + @Override + public RevisionApi revision(String id) throws RestApiException { + try { + return revisionApi.create( + revisions.parse(change, IdString.fromDecoded(id))); + } catch (OrmException e) { + throw new RestApiException("Cannot parse revision", e); + } + } + + @Override + public void abandon() throws RestApiException { + abandon(new AbandonInput()); + } + + @Override + public void abandon(AbandonInput in) throws RestApiException { + try { + abandon.get().apply(change, in); + } catch (OrmException e) { + throw new RestApiException("Cannot abandon change", e); + } catch (IOException e) { + throw new RestApiException("Cannot abandon change", e); + } + } + + @Override + public void restore() throws RestApiException { + restore(new RestoreInput()); + } + + @Override + public void restore(RestoreInput in) throws RestApiException { + try { + restore.get().apply(change, in); + } catch (OrmException e) { + throw new RestApiException("Cannot restore change", e); + } catch (IOException e) { + throw new RestApiException("Cannot restore change", e); + } + } + + @Override + public ChangeApi revert() throws RestApiException { + return revert(new RevertInput()); + } + + @Override + public ChangeApi revert(RevertInput in) throws RestApiException { + try { + return changeApi.id(revert.get().apply(change, in)._number); + } catch (OrmException e) { + throw new RestApiException("Cannot revert change", e); + } catch (EmailException e) { + throw new RestApiException("Cannot revert change", e); + } catch (IOException e) { + throw new RestApiException("Cannot revert change", e); + } + } +}
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 new file mode 100644 index 0000000..fdd0817 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangesImpl.java
@@ -0,0 +1,63 @@ +// 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.api.changes; + +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableList; +import com.google.gerrit.extensions.api.changes.ChangeApi; +import com.google.gerrit.extensions.api.changes.Changes; +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.extensions.restapi.Url; +import com.google.gerrit.server.change.ChangesCollection; +import com.google.gwtorm.server.OrmException; +import com.google.inject.Inject; + +class ChangesImpl implements Changes { + private final ChangesCollection changes; + private final ChangeApiImpl.Factory api; + + @Inject + ChangesImpl(ChangesCollection changes, ChangeApiImpl.Factory api) { + this.changes = changes; + this.api = api; + } + + @Override + public ChangeApi id(int id) throws RestApiException { + return id(String.valueOf(id)); + } + + @Override + public ChangeApi id(String project, String branch, String id) + throws RestApiException { + return id(Joiner.on('~').join(ImmutableList.of( + Url.encode(project), + Url.encode(branch), + Url.encode(id)))); + } + + @Override + public ChangeApi id(String id) throws RestApiException { + try { + return api.create(changes.parse( + TopLevelResource.INSTANCE, + IdString.fromUrl(id))); + } catch (OrmException e) { + throw new RestApiException("Cannot parse change", e); + } + } +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/Module.java similarity index 61% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-server/src/main/java/com/google/gerrit/server/api/changes/Module.java index a5371d2..dbf5f27 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/Module.java
@@ -12,19 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.server.api.changes; -import com.google.common.collect.Maps; +import com.google.gerrit.extensions.api.changes.Changes; +import com.google.gerrit.server.config.FactoryModule; -import java.util.Map; +public class Module extends FactoryModule { + @Override + protected void configure() { + bind(Changes.class).to(ChangesImpl.class); -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; + factory(ChangeApiImpl.Factory.class); + factory(RevisionApiImpl.Factory.class); } }
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 new file mode 100644 index 0000000..4e401c0 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/RevisionApiImpl.java
@@ -0,0 +1,108 @@ +// 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.api.changes; + +import com.google.gerrit.common.errors.EmailException; +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.restapi.RestApiException; +import com.google.gerrit.server.change.DeleteDraftPatchSet; +import com.google.gerrit.server.change.PostReview; +import com.google.gerrit.server.change.Rebase; +import com.google.gerrit.server.change.RevisionResource; +import com.google.gerrit.server.change.Submit; +import com.google.gwtorm.server.OrmException; +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.assistedinject.Assisted; + +import java.io.IOException; + +class RevisionApiImpl implements RevisionApi { + interface Factory { + RevisionApiImpl create(RevisionResource r); + } + + private final Provider<DeleteDraftPatchSet> deleteDraft; + private final Provider<Rebase> rebase; + private final Provider<PostReview> review; + private final Provider<Submit> submit; + private final RevisionResource revision; + + @Inject + RevisionApiImpl(Provider<DeleteDraftPatchSet> deleteDraft, + Provider<Rebase> rebase, + Provider<PostReview> review, + Provider<Submit> submit, + @Assisted RevisionResource r) { + this.deleteDraft = deleteDraft; + this.rebase = rebase; + this.review = review; + this.submit = submit; + this.revision = r; + } + + @Override + public void review(ReviewInput in) throws RestApiException { + try { + review.get().apply(revision, in); + } catch (OrmException e) { + throw new RestApiException("Cannot post review", e); + } catch (IOException e) { + throw new RestApiException("Cannot post review", e); + } + } + + @Override + public void submit() throws RestApiException { + SubmitInput in = new SubmitInput(); + in.waitForMerge = true; + submit(in); + } + + @Override + public void submit(SubmitInput in) throws RestApiException { + try { + submit.get().apply(revision, in); + } catch (OrmException e) { + throw new RestApiException("Cannot submit change", e); + } catch (IOException e) { + throw new RestApiException("Cannot submit change", e); + } + } + + @Override + public void delete() throws RestApiException { + try { + deleteDraft.get().apply(revision, null); + } catch (OrmException e) { + throw new RestApiException("Cannot delete draft ps", e); + } catch (IOException e) { + throw new RestApiException("Cannot delete draft ps", e); + } + } + + @Override + public void rebase() throws RestApiException { + try { + rebase.get().apply(revision, null); + } catch (OrmException e) { + throw new RestApiException("Cannot rebase ps", e); + } catch (EmailException e) { + throw new RestApiException("Cannot rebase ps", e); + } + } +}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java index 4959cfb..de0438b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java
@@ -17,9 +17,8 @@ import com.google.common.base.Strings; import com.google.common.util.concurrent.CheckedFuture; import com.google.gerrit.common.ChangeHooks; +import com.google.gerrit.extensions.api.changes.AbandonInput; import com.google.gerrit.extensions.restapi.AuthException; -import com.google.gerrit.extensions.restapi.BadRequestException; -import com.google.gerrit.extensions.restapi.DefaultInput; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.extensions.webui.UiAction; @@ -29,7 +28,6 @@ import com.google.gerrit.server.ApprovalsUtil; import com.google.gerrit.server.ChangeUtil; import com.google.gerrit.server.IdentifiedUser; -import com.google.gerrit.server.change.Abandon.Input; import com.google.gerrit.server.change.ChangeJson.ChangeInfo; import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.mail.AbandonedSender; @@ -46,7 +44,7 @@ import java.io.IOException; import java.util.Collections; -public class Abandon implements RestModifyView<ChangeResource, Input>, +public class Abandon implements RestModifyView<ChangeResource, AbandonInput>, UiAction<ChangeResource> { private static final Logger log = LoggerFactory.getLogger(Abandon.class); @@ -56,11 +54,6 @@ private final ChangeJson json; private final ChangeIndexer indexer; - public static class Input { - @DefaultInput - public String message; - } - @Inject Abandon(ChangeHooks hooks, AbandonedSender.Factory abandonedSenderFactory, @@ -75,9 +68,9 @@ } @Override - public Object apply(ChangeResource req, Input input) - throws BadRequestException, AuthException, - ResourceConflictException, Exception { + public ChangeInfo apply(ChangeResource req, AbandonInput input) + throws AuthException, ResourceConflictException, OrmException, + IOException { ChangeControl control = req.getControl(); IdentifiedUser caller = (IdentifiedUser) control.getCurrentUser(); Change change = req.getChange(); @@ -144,7 +137,7 @@ && resource.getControl().canAbandon()); } - private ChangeMessage newMessage(Input input, IdentifiedUser caller, + private ChangeMessage newMessage(AbandonInput input, IdentifiedUser caller, Change change) throws OrmException { StringBuilder msg = new StringBuilder(); msg.append("Abandoned");
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 5a3ab3b..87229b3 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
@@ -561,10 +561,10 @@ Maps.newHashMapWithExpectedSize(labels.size()); if (detailed) { - for (String name : labels.keySet()) { + for (Map.Entry<String, LabelInfo> entry : labels.entrySet()) { ApprovalInfo ai = approvalInfo(accountId, 0, null); - byLabel.put(name, ai); - labels.get(name).addApproval(ai); + byLabel.put(entry.getKey(), ai); + entry.getValue().addApproval(ai); } } for (PatchSetApproval psa : current.get(accountId)) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java index e93a0d8..b7d8819 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangesCollection.java
@@ -31,7 +31,6 @@ import com.google.inject.Inject; import com.google.inject.Provider; -import java.io.UnsupportedEncodingException; import java.util.Collections; import java.util.List; @@ -69,8 +68,7 @@ @Override public ChangeResource parse(TopLevelResource root, IdString id) - throws ResourceNotFoundException, OrmException, - UnsupportedEncodingException { + throws ResourceNotFoundException, OrmException { List<Change> changes = findChanges(id.encoded()); if (changes.size() != 1) { throw new ResourceNotFoundException(id);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java index 18f45bb..ce0d33e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPick.java
@@ -14,22 +14,29 @@ package com.google.gerrit.server.change; +import com.google.gerrit.common.errors.EmailException; 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.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.extensions.webui.UiAction; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.change.ChangeJson.ChangeInfo; import com.google.gerrit.server.change.CherryPick.Input; import com.google.gerrit.server.git.MergeException; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.InvalidChangeOperationException; +import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.RefControl; +import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; +import java.io.IOException; + class CherryPick implements RestModifyView<RevisionResource, Input>, UiAction<RevisionResource> { private final Provider<ReviewDb> dbProvider; @@ -51,9 +58,9 @@ } @Override - public Object apply(RevisionResource revision, Input input) + public ChangeInfo apply(RevisionResource revision, Input input) throws AuthException, BadRequestException, ResourceConflictException, - Exception { + ResourceNotFoundException, OrmException, IOException, EmailException { final ChangeControl control = revision.getControl(); if (input.message == null || input.message.trim().isEmpty()) { @@ -89,6 +96,8 @@ throw new BadRequestException(e.getMessage()); } catch (MergeException e) { throw new ResourceConflictException(e.getMessage()); + } catch (NoSuchChangeException e) { + throw new ResourceNotFoundException(e.getMessage()); } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraft.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraft.java index 229e072..afd0b85 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraft.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateDraft.java
@@ -16,9 +16,7 @@ import com.google.common.base.Strings; import com.google.gerrit.common.changes.Side; -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.Response; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.extensions.restapi.Url; @@ -44,7 +42,7 @@ @Override public Response<CommentInfo> apply(RevisionResource rsrc, Input in) - throws AuthException, BadRequestException, ResourceConflictException, OrmException { + throws BadRequestException, OrmException { if (Strings.isNullOrEmpty(in.path)) { throw new BadRequestException("path must be non-empty"); } else if (in.message == null || in.message.trim().isEmpty()) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraft.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraft.java index 0d5898e..588c372 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraft.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraft.java
@@ -36,7 +36,8 @@ } @Override - public Object apply(DraftResource rsrc, Input input) throws OrmException { + public Response<CommentInfo> apply(DraftResource rsrc, Input input) + throws OrmException { db.get().patchComments().delete(Collections.singleton(rsrc.getComment())); return Response.none(); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftChange.java index 767d5ee..efdb9cb 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftChange.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftChange.java
@@ -58,7 +58,7 @@ } @Override - public Object apply(ChangeResource rsrc, Input input) + public Response<?> apply(ChangeResource rsrc, Input input) throws ResourceConflictException, AuthException, ResourceNotFoundException, OrmException, IOException { if (rsrc.getChange().getStatus() != Status.DRAFT) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java index 3265c81..ce86721 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteDraftPatchSet.java
@@ -64,9 +64,9 @@ } @Override - public Object apply(RevisionResource rsrc, Input input) - throws ResourceNotFoundException, AuthException, OrmException, - IOException, ResourceConflictException { + public Response<?> apply(RevisionResource rsrc, Input input) + throws AuthException, ResourceNotFoundException, + ResourceConflictException, OrmException, IOException { PatchSet patchSet = rsrc.getPatchSet(); PatchSet.Id patchSetId = patchSet.getId(); Change change = rsrc.getChange();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java index c58fc6c..bc726aa 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/DeleteReviewer.java
@@ -50,7 +50,7 @@ } @Override - public Object apply(ReviewerResource rsrc, Input input) + public Response<?> apply(ReviewerResource rsrc, Input input) throws AuthException, ResourceNotFoundException, OrmException, IOException { ChangeControl control = rsrc.getControl();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/EditMessage.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/EditMessage.java index a634b7c..8bc7a0e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/EditMessage.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/EditMessage.java
@@ -78,8 +78,8 @@ @Override public ChangeInfo apply(RevisionResource rsrc, Input input) - throws BadRequestException, ResourceConflictException, EmailException, - OrmException, ResourceNotFoundException, IOException { + throws BadRequestException, ResourceConflictException, + ResourceNotFoundException, EmailException, OrmException, IOException { if (Strings.isNullOrEmpty(input.message)) { throw new BadRequestException("message must be non-empty"); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/EmailReviewComments.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/EmailReviewComments.java index 11a9edd..c8ff2f0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/EmailReviewComments.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/EmailReviewComments.java
@@ -15,6 +15,7 @@ package com.google.gerrit.server.change; import com.google.common.collect.Lists; +import com.google.gerrit.extensions.api.changes.ReviewInput.NotifyHandling; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.ChangeMessage; @@ -22,7 +23,6 @@ import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.CurrentUser; -import com.google.gerrit.server.change.PostReview.NotifyHandling; import com.google.gerrit.server.git.WorkQueue; import com.google.gerrit.server.mail.CommentSender; import com.google.gerrit.server.patch.PatchSetInfoFactory; @@ -61,7 +61,7 @@ private final SchemaFactory<ReviewDb> schemaFactory; private final ThreadLocalRequestContext requestContext; - private final PostReview.NotifyHandling notify; + private final NotifyHandling notify; private final Change change; private final PatchSet patchSet; private final Account.Id authorId;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java index 98e2ee9..b440ee0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.java
@@ -117,13 +117,12 @@ } @Override - public Object apply(RevisionResource resource) - throws ResourceNotFoundException, OrmException, - PatchListNotAvailableException, BadRequestException, AuthException { + public Response<?> apply(RevisionResource resource) throws AuthException, + BadRequestException, ResourceNotFoundException, OrmException { if (base != null && reviewed) { throw new BadRequestException("cannot combine base and reviewed"); } else if (reviewed) { - return reviewed(resource); + return Response.ok(reviewed(resource)); } PatchSet basePatchSet = null; @@ -132,17 +131,21 @@ resource.getChangeResource(), IdString.fromDecoded(base)); basePatchSet = baseResource.getPatchSet(); } - Response<Map<String, FileInfo>> r = Response.ok(fileInfoJson.toFileInfoMap( - resource.getChange(), - resource.getPatchSet(), - basePatchSet)); - if (resource.isCacheable()) { - r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS)); + try { + Response<Map<String, FileInfo>> r = Response.ok(fileInfoJson.toFileInfoMap( + resource.getChange(), + resource.getPatchSet(), + basePatchSet)); + if (resource.isCacheable()) { + r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS)); + } + return r; + } catch (PatchListNotAvailableException e) { + throw new ResourceNotFoundException(e.getMessage()); } - return r; } - private Object reviewed(RevisionResource resource) + private List<String> reviewed(RevisionResource resource) throws AuthException, OrmException { CurrentUser user = self.get(); if (!(user.isIdentifiedUser())) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetChange.java index 7213a94..8b794f5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetChange.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetChange.java
@@ -18,6 +18,7 @@ import com.google.gerrit.extensions.restapi.CacheControl; import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestReadView; +import com.google.gerrit.server.change.ChangeJson.ChangeInfo; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; @@ -28,7 +29,7 @@ public class GetChange implements RestReadView<ChangeResource> { private final ChangeJson json; - @Option(name = "-o", multiValued = true, usage = "Output options") + @Option(name = "-o", usage = "Output options") void addOption(ListChangesOption o) { json.addOption(o); } @@ -44,15 +45,15 @@ } @Override - public Object apply(ChangeResource rsrc) throws OrmException { + public Response<ChangeInfo> apply(ChangeResource rsrc) throws OrmException { return cache(json.format(rsrc)); } - Object apply(RevisionResource rsrc) throws OrmException { + Response<ChangeInfo> apply(RevisionResource rsrc) throws OrmException { return cache(json.format(rsrc)); } - private Object cache(Object res) { + private Response<ChangeInfo> cache(ChangeInfo res) { return Response.ok(res) .caching(CacheControl.PRIVATE(0, TimeUnit.SECONDS).setMustRevalidate()); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetComment.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetComment.java index 68b0435..3606eed 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetComment.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetComment.java
@@ -29,7 +29,7 @@ } @Override - public Object apply(CommentResource rsrc) throws OrmException { + public CommentInfo apply(CommentResource rsrc) throws OrmException { AccountInfo.Loader accountLoader = accountLoaderFactory.create(true); CommentInfo ci = new CommentInfo(rsrc.getComment(), accountLoader); accountLoader.fill();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java index 7d29449..b17e406 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetCommit.java
@@ -15,6 +15,7 @@ package com.google.gerrit.server.change; import com.google.gerrit.extensions.restapi.CacheControl; +import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.server.change.ChangeJson.CommitInfo; @@ -34,11 +35,16 @@ @Override public Response<CommitInfo> apply(RevisionResource resource) - throws OrmException, PatchSetInfoNotAvailableException { - Response<CommitInfo> r = Response.ok(json.toCommit(resource.getPatchSet())); - if (resource.isCacheable()) { - r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS)); + throws ResourceNotFoundException, OrmException { + try { + Response<CommitInfo> r = + Response.ok(json.toCommit(resource.getPatchSet())); + if (resource.isCacheable()) { + r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS)); + } + return r; + } catch (PatchSetInfoNotAvailableException e) { + throw new ResourceNotFoundException(e.getMessage()); } - return r; } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDetail.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDetail.java index 936edd6..520a09f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDetail.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDetail.java
@@ -15,7 +15,9 @@ package com.google.gerrit.server.change; import com.google.gerrit.common.changes.ListChangesOption; +import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestReadView; +import com.google.gerrit.server.change.ChangeJson.ChangeInfo; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; @@ -24,7 +26,7 @@ public class GetDetail implements RestReadView<ChangeResource> { private final GetChange delegate; - @Option(name = "-o", multiValued = true, usage = "Output options") + @Option(name = "-o", usage = "Output options") void addOption(ListChangesOption o) { delegate.addOption(o); } @@ -44,7 +46,7 @@ } @Override - public Object apply(ChangeResource rsrc) throws OrmException { + public Response<ChangeInfo> apply(ChangeResource rsrc) throws OrmException { return delegate.apply(rsrc); } }
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 753a70b..04136bd 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
@@ -24,6 +24,7 @@ import com.google.gerrit.common.data.PatchScript.FileMode; import com.google.gerrit.extensions.restapi.CacheControl; import com.google.gerrit.extensions.restapi.IdString; +import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestReadView; @@ -38,6 +39,7 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; + import org.eclipse.jgit.diff.Edit; import org.eclipse.jgit.diff.ReplaceEdit; import org.kohsuke.args4j.CmdLineException; @@ -76,8 +78,8 @@ } @Override - public Object apply(FileResource resource) - throws OrmException, NoSuchChangeException, LargeObjectException, ResourceNotFoundException { + public Response<Result> apply(FileResource resource) + throws ResourceConflictException, ResourceNotFoundException, OrmException { PatchSet.Id basePatchSet = null; if (base != null) { RevisionResource baseResource = revisions.get().parse( @@ -89,74 +91,80 @@ prefs.setContext(context); prefs.setIntralineDifference(intraline); - PatchScript ps = patchScriptFactoryFactory.create( - resource.getRevision().getControl(), - resource.getPatchKey().getFileName(), - basePatchSet, - resource.getPatchKey().getParentKey(), - prefs) - .call(); + try { + PatchScript ps = patchScriptFactoryFactory.create( + resource.getRevision().getControl(), + resource.getPatchKey().getFileName(), + basePatchSet, + resource.getPatchKey().getParentKey(), + prefs) + .call(); - Content content = new Content(ps); - for (Edit edit : ps.getEdits()) { - if (edit.getType() == Edit.Type.EMPTY) { - continue; + Content content = new Content(ps); + for (Edit edit : ps.getEdits()) { + if (edit.getType() == Edit.Type.EMPTY) { + continue; + } + content.addCommon(edit.getBeginA()); + + checkState(content.nextA == edit.getBeginA(), + "nextA = %d; want %d", content.nextA, edit.getBeginA()); + checkState(content.nextB == edit.getBeginB(), + "nextB = %d; want %d", content.nextB, edit.getBeginB()); + switch (edit.getType()) { + case DELETE: + case INSERT: + case REPLACE: + List<Edit> internalEdit = edit instanceof ReplaceEdit + ? ((ReplaceEdit) edit).getInternalEdits() + : null; + content.addDiff(edit.getEndA(), edit.getEndB(), internalEdit); + break; + case EMPTY: + default: + throw new IllegalStateException(); + } } - content.addCommon(edit.getBeginA()); + content.addCommon(ps.getA().size()); - checkState(content.nextA == edit.getBeginA(), - "nextA = %d; want %d", content.nextA, edit.getBeginA()); - checkState(content.nextB == edit.getBeginB(), - "nextB = %d; want %d", content.nextB, edit.getBeginB()); - switch (edit.getType()) { - case DELETE: - case INSERT: - case REPLACE: - List<Edit> internalEdit = edit instanceof ReplaceEdit - ? ((ReplaceEdit) edit).getInternalEdits() - : null; - content.addDiff(edit.getEndA(), edit.getEndB(), internalEdit); - break; - case EMPTY: - default: - throw new IllegalStateException(); + 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()); } - } - content.addCommon(ps.getA().size()); - 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()); - } - - if (ps.getDisplayMethodB() != DisplayMethod.NONE) { - result.metaB = new FileMeta(); - result.metaB.name = ps.getNewName(); - result.metaB.setContentType(ps.getFileModeB(), ps.getMimeTypeB()); - } - - if (intraline) { - if (ps.hasIntralineTimeout()) { - result.intralineStatus = IntraLineStatus.TIMEOUT; - } else if (ps.hasIntralineFailure()) { - result.intralineStatus = IntraLineStatus.FAILURE; - } else { - result.intralineStatus = IntraLineStatus.OK; + if (ps.getDisplayMethodB() != DisplayMethod.NONE) { + result.metaB = new FileMeta(); + result.metaB.name = ps.getNewName(); + result.metaB.setContentType(ps.getFileModeB(), ps.getMimeTypeB()); } - } - result.changeType = ps.getChangeType(); - if (ps.getPatchHeader().size() > 0) { - result.diffHeader = ps.getPatchHeader(); + if (intraline) { + if (ps.hasIntralineTimeout()) { + result.intralineStatus = IntraLineStatus.TIMEOUT; + } else if (ps.hasIntralineFailure()) { + result.intralineStatus = IntraLineStatus.FAILURE; + } else { + result.intralineStatus = IntraLineStatus.OK; + } + } + + result.changeType = ps.getChangeType(); + if (ps.getPatchHeader().size() > 0) { + result.diffHeader = ps.getPatchHeader(); + } + result.content = content.lines; + Response<Result> r = Response.ok(result); + if (resource.isCacheable()) { + r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS)); + } + return r; + } catch (NoSuchChangeException e) { + throw new ResourceNotFoundException(e.getMessage()); + } catch (LargeObjectException e) { + throw new ResourceConflictException(e.getMessage()); } - result.content = content.lines; - Response<Result> r = Response.ok(result); - if (resource.isCacheable()) { - r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS)); - } - return r; } static class Result { @@ -193,7 +201,7 @@ enum IntraLineStatus { OK, TIMEOUT, - FAILURE; + FAILURE } private static class Content {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDraft.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDraft.java index 6b36048..c8a2d43 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDraft.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetDraft.java
@@ -14,15 +14,11 @@ package com.google.gerrit.server.change; -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; class GetDraft implements RestReadView<DraftResource> { @Override - public Object apply(DraftResource rsrc) throws AuthException, - BadRequestException, ResourceConflictException, Exception { + public CommentInfo apply(DraftResource rsrc) { return new CommentInfo(rsrc.getComment(), null); } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java index 3776b74..325c932 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetRelated.java
@@ -70,7 +70,7 @@ } @Override - public Object apply(RevisionResource rsrc) + public RelatedInfo apply(RevisionResource rsrc) throws RepositoryNotFoundException, IOException, OrmException { Repository git = gitMgr.openRepository(rsrc.getChange().getProject()); try {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReview.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReview.java index 3676a1e..3440dca 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReview.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReview.java
@@ -15,7 +15,9 @@ package com.google.gerrit.server.change; import com.google.gerrit.common.changes.ListChangesOption; +import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestReadView; +import com.google.gerrit.server.change.ChangeJson.ChangeInfo; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; @@ -30,7 +32,7 @@ } @Override - public Object apply(RevisionResource rsrc) throws OrmException { + public Response<ChangeInfo> apply(RevisionResource rsrc) throws OrmException { return delegate.apply(rsrc); } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReviewer.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReviewer.java index 8c41be8..fac4618 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReviewer.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetReviewer.java
@@ -15,9 +15,12 @@ package com.google.gerrit.server.change; import com.google.gerrit.extensions.restapi.RestReadView; +import com.google.gerrit.server.change.ReviewerJson.ReviewerInfo; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; +import java.util.List; + public class GetReviewer implements RestReadView<ReviewerResource> { private final ReviewerJson json; @@ -27,7 +30,7 @@ } @Override - public Object apply(ReviewerResource rsrc) throws OrmException { + public List<ReviewerInfo> apply(ReviewerResource rsrc) throws OrmException { return json.format(rsrc); } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetTopic.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetTopic.java index 96a5c76..53f71fd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/GetTopic.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/GetTopic.java
@@ -16,11 +16,10 @@ import com.google.common.base.Strings; import com.google.gerrit.extensions.restapi.RestReadView; -import com.google.gwtorm.server.OrmException; class GetTopic implements RestReadView<ChangeResource> { @Override - public Object apply(ChangeResource rsrc) throws OrmException { + public String apply(ChangeResource rsrc) { return Strings.nullToEmpty(rsrc.getChange().getTopic()); } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java index 26e7846..8df6957 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/IncludedIn.java
@@ -47,8 +47,8 @@ } @Override - public Object apply(ChangeResource rsrc) throws OrmException, IOException, - BadRequestException, ResourceConflictException { + public IncludedInInfo apply(ChangeResource rsrc) throws BadRequestException, + ResourceConflictException, OrmException, IOException { ChangeControl ctl = rsrc.getControl(); PatchSet ps = db.patchSets().get(ctl.getChange().currentPatchSetId());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java index 6ecc544..77b8e5f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Index.java
@@ -37,7 +37,7 @@ } @Override - public Object apply(ChangeResource rsrc, Input input) throws IOException { + public Response<?> apply(ChangeResource rsrc, Input input) throws IOException { indexer.index(rsrc.getChange()); return Response.none(); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListDrafts.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListDrafts.java index 97c7694..cb03724 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListDrafts.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListDrafts.java
@@ -19,9 +19,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.gerrit.common.changes.Side; -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.PatchLineComment; import com.google.gerrit.reviewdb.server.ReviewDb; @@ -58,8 +55,8 @@ } @Override - public Object apply(RevisionResource rsrc) throws AuthException, - BadRequestException, ResourceConflictException, Exception { + public Map<String, List<CommentInfo>> apply(RevisionResource rsrc) + throws OrmException { Map<String, List<CommentInfo>> out = Maps.newTreeMap(); AccountInfo.Loader accountLoader = includeAuthorInfo() ? accountLoaderFactory.create(true) : null;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListReviewers.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListReviewers.java index 68cc1b4..7022701 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListReviewers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/ListReviewers.java
@@ -15,16 +15,17 @@ package com.google.gerrit.server.change; import com.google.common.collect.Maps; -import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSetApproval; import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.change.ReviewerJson.ReviewerInfo; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; +import java.util.List; import java.util.Map; class ListReviewers implements RestReadView<ChangeResource> { @@ -42,8 +43,7 @@ } @Override - public Object apply(ChangeResource rsrc) throws BadRequestException, - OrmException { + public List<ReviewerInfo> apply(ChangeResource rsrc) throws OrmException { Map<Account.Id, ReviewerResource> reviewers = Maps.newLinkedHashMap(); ReviewDb db = dbProvider.get(); Change.Id changeId = rsrc.getChange().getId();
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 595e1c8..852b379 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
@@ -35,7 +35,6 @@ import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; -import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; @@ -80,9 +79,8 @@ } @Override - public MergeableInfo apply(RevisionResource resource) - throws ResourceConflictException, BadRequestException, AuthException, - OrmException, RepositoryNotFoundException, IOException { + public MergeableInfo apply(RevisionResource resource) throws AuthException, + ResourceConflictException, BadRequestException, OrmException, IOException { Change change = resource.getChange(); PatchSet ps = resource.getPatchSet(); MergeableInfo result = new MergeableInfo();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java index e4f4f1f..f604e0b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PatchSetInserter.java
@@ -82,11 +82,11 @@ * validation. */ public static enum ValidatePolicy { - GERRIT, RECEIVE_COMMITS, NONE; + GERRIT, RECEIVE_COMMITS, NONE } public static enum ChangeKind { - REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE; + REWORK, TRIVIAL_REBASE, NO_CODE_CHANGE } private final ChangeHooks hooks;
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 367087c..6236dee 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
@@ -23,14 +23,17 @@ import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.Futures; import com.google.gerrit.common.ChangeHooks; -import com.google.gerrit.common.changes.Side; import com.google.gerrit.common.data.LabelType; import com.google.gerrit.common.data.LabelTypes; import com.google.gerrit.common.data.Permission; import com.google.gerrit.common.data.PermissionRange; +import com.google.gerrit.extensions.api.changes.ReviewInput; +import com.google.gerrit.extensions.api.changes.ReviewInput.Comment; +import com.google.gerrit.extensions.api.changes.ReviewInput.DraftHandling; +import com.google.gerrit.extensions.api.changes.ReviewInput.NotifyHandling; +import com.google.gerrit.extensions.api.changes.ReviewInput.Side; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.BadRequestException; -import com.google.gerrit.extensions.restapi.DefaultInput; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.extensions.restapi.Url; @@ -44,7 +47,6 @@ import com.google.gerrit.server.ChangeUtil; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.account.AccountsCollection; -import com.google.gerrit.server.change.PostReview.Input; import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.util.TimeUtil; @@ -62,65 +64,9 @@ import java.util.List; import java.util.Map; -public class PostReview implements RestModifyView<RevisionResource, Input> { +public class PostReview implements RestModifyView<RevisionResource, ReviewInput> { private static final Logger log = LoggerFactory.getLogger(PostReview.class); - public static class Input { - @DefaultInput - public String message; - - public Map<String, Short> labels; - public Map<String, List<Comment>> comments; - - /** - * If true require all labels to be within the user's permitted ranges based - * on access controls, attempting to use a label not granted to the user - * will fail the entire modify operation early. If false the operation will - * execute anyway, but the proposed labels given by the user will be - * modified to be the "best" value allowed by the access controls, or - * ignored if the label does not exist. - */ - public boolean strictLabels = true; - - /** - * How to process draft comments already in the database that were not also - * described in this input request. - */ - public DraftHandling drafts = DraftHandling.DELETE; - - /** Who to send email notifications to after review is stored. */ - public NotifyHandling notify = NotifyHandling.ALL; - - /** - * Account ID, name, email address or username of another user. The review - * will be posted/updated on behalf of this named user instead of the - * caller. Caller must have the labelAs-$NAME permission granted for each - * label that appears in {@link #labels}. This is in addition to the named - * user also needing to have permission to use the labels. - * <p> - * {@link #strictLabels} impacts how labels is processed for the named user, - * not the caller. - */ - public String onBehalfOf; - } - - public static enum DraftHandling { - DELETE, PUBLISH, KEEP; - } - - public static enum NotifyHandling { - NONE, OWNER, OWNER_REVIEWERS, ALL; - } - - public static class Comment { - public String id; - public Side side; - public int line; - public String inReplyTo; - public String message; - public CommentRange range; - } - static class Output { Map<String, Short> labels; } @@ -152,9 +98,9 @@ } @Override - public Object apply(RevisionResource revision, Input input) - throws AuthException, BadRequestException, OrmException, - UnprocessableEntityException, IOException { + public Output apply(RevisionResource revision, ReviewInput input) + throws AuthException, BadRequestException, UnprocessableEntityException, + OrmException, IOException { if (input.onBehalfOf != null) { revision = onBehalfOf(revision, input); } @@ -210,7 +156,7 @@ return output; } - private RevisionResource onBehalfOf(RevisionResource rev, Input in) + private RevisionResource onBehalfOf(RevisionResource rev, ReviewInput in) throws BadRequestException, AuthException, UnprocessableEntityException, OrmException { if (in.labels == null || in.labels.isEmpty()) { @@ -370,7 +316,13 @@ e.setWrittenOn(timestamp); e.setSide(c.side == Side.PARENT ? (short) 0 : (short) 1); e.setMessage(c.message); - e.setRange(c.range); + if (c.range != null) { + e.setRange(new CommentRange( + c.range.startLine, + c.range.startCharacter, + c.range.endLine, + c.range.endCharacter)); + } (create ? ins : upd).add(e); } }
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 13deeb0..de6c123 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
@@ -28,7 +28,6 @@ import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.DefaultInput; -import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.reviewdb.client.Account; @@ -132,8 +131,8 @@ @Override public PostResult apply(ChangeResource rsrc, Input input) - throws BadRequestException, ResourceNotFoundException, AuthException, - UnprocessableEntityException, OrmException, EmailException, IOException { + throws AuthException, BadRequestException, UnprocessableEntityException, + OrmException, EmailException, IOException { if (input.reviewer == null) { throw new BadRequestException("missing reviewer field"); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Publish.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Publish.java index 8b0fe99..f28f342 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Publish.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Publish.java
@@ -59,9 +59,9 @@ } @Override - public Object apply(RevisionResource rsrc, Input input) throws IOException, - ResourceNotFoundException, ResourceConflictException, - OrmException, AuthException { + public Response<?> apply(RevisionResource rsrc, Input input) + throws AuthException, ResourceNotFoundException, + ResourceConflictException, OrmException, IOException { if (!rsrc.getPatchSet().isDraft()) { throw new ResourceConflictException("Patch set is not a draft"); } @@ -148,9 +148,9 @@ } @Override - public Object apply(ChangeResource rsrc, Input input) throws AuthException, - ResourceConflictException, ResourceConflictException, IOException, - OrmException, ResourceNotFoundException, AuthException { + public Response<?> apply(ChangeResource rsrc, Input input) + throws AuthException, ResourceConflictException, + ResourceNotFoundException, IOException, OrmException { PatchSet ps = dbProvider.get().patchSets() .get(rsrc.getChange().currentPatchSetId()); if (ps == null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDraft.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDraft.java index 803af17..f2285f0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDraft.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutDraft.java
@@ -15,15 +15,14 @@ package com.google.gerrit.server.change; import com.google.gerrit.common.changes.Side; -import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.DefaultInput; -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.extensions.restapi.Url; +import com.google.gerrit.reviewdb.client.CommentRange; import com.google.gerrit.reviewdb.client.Patch; import com.google.gerrit.reviewdb.client.PatchLineComment; -import com.google.gerrit.reviewdb.client.CommentRange; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.change.PutDraft.Input; import com.google.gerrit.server.util.TimeUtil; @@ -59,8 +58,8 @@ } @Override - public Object apply(DraftResource rsrc, Input in) throws AuthException, - BadRequestException, ResourceConflictException, OrmException { + public Response<CommentInfo> apply(DraftResource rsrc, Input in) throws + BadRequestException, OrmException { PatchLineComment c = rsrc.getComment(); if (in == null || in.message == null || in.message.trim().isEmpty()) { return delete.get().apply(rsrc, null); @@ -90,7 +89,7 @@ } else { db.get().patchComments().update(Collections.singleton(update(c, in))); } - return new CommentInfo(c, null); + return Response.ok(new CommentInfo(c, null)); } private PatchLineComment update(PatchLineComment e, Input in) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java index acf96e6..84ace98 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java
@@ -18,9 +18,7 @@ import com.google.common.util.concurrent.CheckedFuture; import com.google.gerrit.common.ChangeHooks; import com.google.gerrit.extensions.restapi.AuthException; -import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.DefaultInput; -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.extensions.webui.UiAction; @@ -34,6 +32,7 @@ import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.util.TimeUtil; import com.google.gwtorm.server.AtomicUpdate; +import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; @@ -61,9 +60,8 @@ } @Override - public Object apply(ChangeResource req, Input input) - throws BadRequestException, AuthException, - ResourceConflictException, Exception { + public Response<String> apply(ChangeResource req, Input input) + throws AuthException, OrmException, IOException { if (input == null) { input = new Input(); } @@ -123,8 +121,8 @@ indexFuture.checkedGet(); } return Strings.isNullOrEmpty(newTopicName) - ? Response.none() - : newTopicName; + ? Response.<String>none() + : Response.ok(newTopicName); } @Override
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java index d31d1f0..58494c4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java
@@ -17,8 +17,8 @@ import com.google.common.base.Strings; import com.google.common.util.concurrent.CheckedFuture; import com.google.gerrit.common.ChangeHooks; +import com.google.gerrit.extensions.api.changes.RestoreInput; import com.google.gerrit.extensions.restapi.AuthException; -import com.google.gerrit.extensions.restapi.DefaultInput; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.extensions.webui.UiAction; @@ -30,7 +30,6 @@ import com.google.gerrit.server.ChangeUtil; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.change.ChangeJson.ChangeInfo; -import com.google.gerrit.server.change.Restore.Input; import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.mail.ReplyToChangeSender; import com.google.gerrit.server.mail.RestoredSender; @@ -46,7 +45,7 @@ import java.io.IOException; import java.util.Collections; -public class Restore implements RestModifyView<ChangeResource, Input>, +public class Restore implements RestModifyView<ChangeResource, RestoreInput>, UiAction<ChangeResource> { private static final Logger log = LoggerFactory.getLogger(Restore.class); @@ -56,11 +55,6 @@ private final ChangeJson json; private final ChangeIndexer indexer; - public static class Input { - @DefaultInput - public String message; - } - @Inject Restore(ChangeHooks hooks, RestoredSender.Factory restoredSenderFactory, @@ -75,8 +69,9 @@ } @Override - public Object apply(ChangeResource req, Input input) - throws Exception { + public ChangeInfo apply(ChangeResource req, RestoreInput input) + throws AuthException, ResourceConflictException, OrmException, + IOException { ChangeControl control = req.getControl(); IdentifiedUser caller = (IdentifiedUser) control.getCurrentUser(); Change change = req.getChange(); @@ -143,7 +138,7 @@ && resource.getControl().canRestore()); } - private ChangeMessage newMessage(Input input, IdentifiedUser caller, + private ChangeMessage newMessage(RestoreInput input, IdentifiedUser caller, Change change) throws OrmException { StringBuilder msg = new StringBuilder(); msg.append("Restored");
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java index 73a6b03..5d2ddde 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Revert.java
@@ -16,9 +16,12 @@ import com.google.common.base.Strings; import com.google.gerrit.common.ChangeHooks; +import com.google.gerrit.common.errors.EmailException; +import com.google.gerrit.extensions.api.changes.RevertInput; 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.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.extensions.webui.UiAction; import com.google.gerrit.reviewdb.client.Change; @@ -27,21 +30,25 @@ import com.google.gerrit.server.ChangeUtil; import com.google.gerrit.server.GerritPersonIdent; import com.google.gerrit.server.IdentifiedUser; -import com.google.gerrit.server.change.Revert.Input; +import com.google.gerrit.server.change.ChangeJson.ChangeInfo; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.validators.CommitValidators; import com.google.gerrit.server.mail.RevertedSender; import com.google.gerrit.server.patch.PatchSetInfoFactory; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.InvalidChangeOperationException; +import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.ssh.NoSshInfo; +import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Repository; -public class Revert implements RestModifyView<ChangeResource, Input>, +import java.io.IOException; + +public class Revert implements RestModifyView<ChangeResource, RevertInput>, UiAction<ChangeResource> { private final ChangeHooks hooks; private final RevertedSender.Factory revertedSenderFactory; @@ -53,10 +60,6 @@ private final PatchSetInfoFactory patchSetInfoFactory; private final ChangeInserter.Factory changeInserterFactory; - public static class Input { - public String message; - } - @Inject Revert(ChangeHooks hooks, RevertedSender.Factory revertedSenderFactory, @@ -79,7 +82,9 @@ } @Override - public Object apply(ChangeResource req, Input input) throws Exception { + public ChangeInfo apply(ChangeResource req, RevertInput input) + throws AuthException, BadRequestException, ResourceConflictException, + ResourceNotFoundException, IOException, OrmException, EmailException { ChangeControl control = req.getControl(); Change change = req.getChange(); if (!control.canAddPatchSet()) { @@ -104,6 +109,8 @@ return json.format(revertedChangeId); } catch (InvalidChangeOperationException e) { throw new BadRequestException(e.getMessage()); + } catch (NoSuchChangeException e) { + throw new ResourceNotFoundException(e.getMessage()); } finally { git.close(); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewed.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewed.java index 022f178..dd27139 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewed.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Reviewed.java
@@ -38,7 +38,7 @@ } @Override - public Object apply(FileResource resource, Input input) + public Response<String> apply(FileResource resource, Input input) throws OrmException { ReviewDb db = dbProvider.get(); AccountPatchReview apr = getExisting(db, resource); @@ -66,7 +66,7 @@ } @Override - public Object apply(FileResource resource, Input input) + public Response<?> apply(FileResource resource, Input input) throws OrmException { ReviewDb db = dbProvider.get(); AccountPatchReview apr = getExisting(db, resource);
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 a507096..3851265 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
@@ -21,6 +21,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.gerrit.common.data.SubmitRecord; +import com.google.gerrit.extensions.api.changes.SubmitInput; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.RestModifyView; @@ -34,7 +35,7 @@ import com.google.gerrit.server.ChangeUtil; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.ProjectUtil; -import com.google.gerrit.server.change.Submit.Input; +import com.google.gerrit.server.change.ChangeJson.ChangeInfo; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.MergeQueue; import com.google.gerrit.server.index.ChangeIndexer; @@ -53,14 +54,14 @@ import java.util.Collections; import java.util.List; -public class Submit implements RestModifyView<RevisionResource, Input>, +public class Submit implements RestModifyView<RevisionResource, SubmitInput>, UiAction<RevisionResource> { public static class Input { public boolean waitForMerge; } public enum Status { - SUBMITTED, MERGED; + SUBMITTED, MERGED } public static class Output { @@ -90,9 +91,9 @@ } @Override - public Output apply(RevisionResource rsrc, Input input) throws AuthException, - ResourceConflictException, RepositoryNotFoundException, IOException, - OrmException { + public Output apply(RevisionResource rsrc, SubmitInput input) + throws AuthException, ResourceConflictException, + RepositoryNotFoundException, IOException, OrmException { ChangeControl control = rsrc.getControl(); IdentifiedUser caller = (IdentifiedUser) control.getCurrentUser(); Change change = rsrc.getChange(); @@ -317,7 +318,7 @@ } public static class CurrentRevision implements - RestModifyView<ChangeResource, Input> { + RestModifyView<ChangeResource, SubmitInput> { private final Provider<ReviewDb> dbProvider; private final Submit submit; private final ChangeJson json; @@ -332,9 +333,9 @@ } @Override - public Object apply(ChangeResource rsrc, Input input) throws AuthException, - ResourceConflictException, RepositoryNotFoundException, IOException, - OrmException { + public ChangeInfo apply(ChangeResource rsrc, SubmitInput input) + throws AuthException, ResourceConflictException, + RepositoryNotFoundException, IOException, OrmException { PatchSet ps = dbProvider.get().patchSets() .get(rsrc.getChange().currentPatchSetId()); if (ps == null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java index db18f0d..ab16360 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/TestSubmitRule.java
@@ -47,7 +47,7 @@ public class TestSubmitRule implements RestModifyView<RevisionResource, Input> { public enum Filters { - RUN, SKIP; + RUN, SKIP } public static class Input { @@ -72,8 +72,8 @@ } @Override - public Object apply(RevisionResource rsrc, Input input) throws OrmException, - BadRequestException, AuthException { + public List<Record> apply(RevisionResource rsrc, Input input) + throws AuthException, BadRequestException, OrmException { if (input == null) { input = new Input(); }
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 5a4f9e2..f8c1d80 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
@@ -28,7 +28,6 @@ import com.google.gerrit.server.project.RuleEvalException; import com.google.gerrit.server.project.SubmitRuleEvaluator; import com.google.gerrit.server.query.change.ChangeData; -import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.googlecode.prolog_cafe.lang.SymbolTerm; @@ -54,7 +53,7 @@ @Override public SubmitType apply(RevisionResource rsrc, Input input) - throws OrmException, BadRequestException, AuthException { + throws AuthException, BadRequestException { if (input == null) { input = new Input(); } @@ -120,7 +119,7 @@ @Override public SubmitType apply(RevisionResource resource) - throws BadRequestException, OrmException, AuthException { + throws AuthException, BadRequestException { return test.apply(resource, null); } }
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 0b414f2..6d01e7c5 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
@@ -197,7 +197,7 @@ } /** Whether git-over-http should use Gerrit basic authentication scheme. */ - public boolean isGitBasichAuth() { + public boolean isGitBasicAuth() { return gitBasicAuth; }
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 6a90165..87f5271 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
@@ -67,6 +67,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.documentation.QueryDocumentationExecutor; import com.google.gerrit.server.events.EventFactory; import com.google.gerrit.server.extensions.events.GitReferenceUpdated; import com.google.gerrit.server.git.ChangeCache; @@ -110,6 +111,7 @@ import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.project.SectionSortCache; import com.google.gerrit.server.query.change.ChangeQueryBuilder; +import com.google.gerrit.server.query.change.ConflictsCacheImpl; import com.google.gerrit.server.ssh.SshAddressesModule; import com.google.gerrit.server.tools.ToolsCatalog; import com.google.gerrit.server.util.IdGenerator; @@ -135,19 +137,21 @@ protected void configure() { bind(EmailExpander.class).toProvider(EmailExpanderProvider.class).in( SINGLETON); + bind(QueryDocumentationExecutor.class).in(SINGLETON); bind(IdGenerator.class); bind(RulesCache.class); install(authModule); install(AccountByEmailCacheImpl.module()); install(AccountCacheImpl.module()); + install(ChangeCache.module()); + install(ConflictsCacheImpl.module()); install(GroupCacheImpl.module()); install(GroupIncludeCacheImpl.module()); install(PatchListCacheImpl.module()); install(ProjectCacheImpl.module()); install(SectionSortCache.module()); install(TagCache.module()); - install(ChangeCache.module()); install(new AccessControlModule()); install(new CmdLineParserModule()); @@ -224,6 +228,7 @@ install(new AuditModule()); install(new com.google.gerrit.server.access.Module()); install(new com.google.gerrit.server.account.Module()); + install(new com.google.gerrit.server.api.Module()); install(new com.google.gerrit.server.change.Module()); install(new com.google.gerrit.server.config.Module()); install(new com.google.gerrit.server.group.Module());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCapabilities.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCapabilities.java index c64f786..88616e1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCapabilities.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListCapabilities.java
@@ -19,9 +19,6 @@ import com.google.gerrit.common.data.GlobalCapability; import com.google.gerrit.extensions.config.CapabilityDefinition; import com.google.gerrit.extensions.registration.DynamicMap; -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.inject.Inject; import com.google.inject.Provider; @@ -43,9 +40,7 @@ @Override public Map<String, CapabilityInfo> apply(ConfigResource resource) - throws AuthException, BadRequestException, ResourceConflictException, - IllegalArgumentException, SecurityException, IllegalAccessException, - NoSuchFieldException { + throws IllegalAccessException, NoSuchFieldException { Map<String, CapabilityInfo> output = Maps.newTreeMap(); collectCoreCapabilities(output); collectPluginCapabilities(output);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTopMenus.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTopMenus.java index 68ae5c1..c8e9d1e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTopMenus.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/ListTopMenus.java
@@ -31,7 +31,7 @@ } @Override - public Object apply(ConfigResource resource) { + public List<TopMenu.MenuEntry> apply(ConfigResource resource) { List<TopMenu.MenuEntry> entries = Lists.newArrayList(); for (TopMenu extension : extensions) { entries.addAll(extension.getEntries());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java index 294d8a5..8df7073 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java
@@ -14,27 +14,45 @@ package com.google.gerrit.server.config; +import com.google.common.collect.Maps; import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.server.git.ProjectLevelConfig; import com.google.gerrit.server.project.NoSuchProjectException; import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.project.ProjectState; import com.google.inject.Inject; import com.google.inject.Singleton; +import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.util.FS; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.util.Map; @Singleton public class PluginConfigFactory { + private static final Logger log = + LoggerFactory.getLogger(PluginConfigFactory.class); + + private final SitePaths site; private final Config cfg; private final ProjectCache projectCache; private final ProjectState.Factory projectStateFactory; + private final Map<String, Config> pluginConfigs; @Inject - PluginConfigFactory(@GerritServerConfig Config cfg, + PluginConfigFactory(SitePaths site, @GerritServerConfig Config cfg, ProjectCache projectCache, ProjectState.Factory projectStateFactory) { + this.site = site; this.cfg = cfg; this.projectCache = projectCache; this.projectStateFactory = projectStateFactory; + this.pluginConfigs = Maps.newHashMap(); } /** @@ -128,4 +146,96 @@ return getFromProjectConfig(projectName, pluginName).withInheritance( projectStateFactory); } + + /** + * Returns the configuration for the specified plugin that is stored in the + * plugin configuration file 'etc/<plugin-name>.config'. + * + * The plugin configuration is only loaded once and is then cached. + * + * @param pluginName the name of the plugin for which the configuration should + * be returned + * @return the plugin configuration from the 'etc/<plugin-name>.config' file + */ + public Config getGlobalPluginConfig(String pluginName) { + if (pluginConfigs.containsKey(pluginName)) { + return pluginConfigs.get(pluginName); + } + + File pluginConfigFile = new File(site.etc_dir, pluginName + ".config"); + FileBasedConfig cfg = new FileBasedConfig(pluginConfigFile, FS.DETECTED); + pluginConfigs.put(pluginName, cfg); + if (!cfg.getFile().exists()) { + log.info("No " + pluginConfigFile.getAbsolutePath() + "; assuming defaults"); + return cfg; + } + + try { + cfg.load(); + } catch (IOException e) { + log.warn("Failed to load " + pluginConfigFile.getAbsolutePath(), e); + } catch (ConfigInvalidException e) { + log.warn("Failed to load " + pluginConfigFile.getAbsolutePath(), e); + } + + return cfg; + } + + /** + * Returns the configuration for the specified plugin that is stored in the + * '<plugin-name>.config' file in the 'refs/meta/config' branch of the + * specified project. + * + * @param projectName the name of the project for which the plugin + * configuration should be returned + * @param pluginName the name of the plugin for which the configuration should + * be returned + * @return the plugin configuration from the '<plugin-name>.config' file of + * the specified project + * @throws NoSuchProjectException thrown if the specified project does not + * exist + */ + public Config getProjectPluginConfig(Project.NameKey projectName, + String pluginName) throws NoSuchProjectException { + return getPluginConfig(projectName, pluginName).get(); + } + + /** + * Returns the configuration for the specified plugin that is stored in the + * '<plugin-name>.config' file in the 'refs/meta/config' branch of the + * specified project. Parameters which are not set in the + * '<plugin-name>.config' of this project are inherited from the parent + * project's '<plugin-name>.config' files. + * + * E.g.: child project: [mySection "mySubsection"] myKey = childValue + * + * parent project: [mySection "mySubsection"] myKey = parentValue anotherKey = + * someValue + * + * return: [mySection "mySubsection"] myKey = childValue anotherKey = + * someValue + * + * @param projectName the name of the project for which the plugin + * configuration should be returned + * @param pluginName the name of the plugin for which the configuration should + * be returned + * @return the plugin configuration from the '<plugin-name>.config' file of + * the specified project with inheriting non-set parameters from the + * parent projects + * @throws NoSuchProjectException thrown if the specified project does not + * exist + */ + public Config getProjectPluginConfigWithInheritance(Project.NameKey projectName, + String pluginName) throws NoSuchProjectException { + return getPluginConfig(projectName, pluginName).getWithInheritance(); + } + + private ProjectLevelConfig getPluginConfig(Project.NameKey projectName, + String pluginName) throws NoSuchProjectException { + ProjectState projectState = projectCache.get(projectName); + if (projectState == null) { + throw new NoSuchProjectException(projectName); + } + return projectState.getConfig(pluginName); + } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/data/ChangeAttribute.java b/gerrit-server/src/main/java/com/google/gerrit/server/data/ChangeAttribute.java index 7339829..5f5fd33 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/data/ChangeAttribute.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/data/ChangeAttribute.java
@@ -43,4 +43,5 @@ public List<DependencyAttribute> dependsOn; public List<DependencyAttribute> neededBy; public List<SubmitRecordAttribute> submitRecords; + public List<AccountAttribute> allReviewers; }
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/Constants.java similarity index 63% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-server/src/main/java/com/google/gerrit/server/documentation/Constants.java index a5371d2..bfa2de2 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/Constants.java
@@ -12,19 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.server.documentation; -import com.google.common.collect.Maps; +public class Constants { -import java.util.Map; + public static final String DOC_FIELD = "doc"; + public static final String TITLE_FIELD = "title"; + public static final String URL_FIELD = "url"; -public class ReviewInput { - Map<String, Integer> labels; - - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; - } + private Constants() {} }
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 new file mode 100644 index 0000000..576ed9f --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/documentation/QueryDocumentationExecutor.java
@@ -0,0 +1,152 @@ +// 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.documentation; + +import com.google.common.collect.Lists; +import com.google.inject.Inject; + +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.index.DirectoryReader; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.queryparser.classic.ParseException; +import org.apache.lucene.queryparser.classic.QueryParser; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.ScoreDoc; +import org.apache.lucene.search.TopDocs; +import org.apache.lucene.store.Directory; +import org.apache.lucene.store.IndexOutput; +import org.apache.lucene.store.RAMDirectory; +import org.apache.lucene.util.Version; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +public class QueryDocumentationExecutor { + private static final Logger log = + LoggerFactory.getLogger(QueryDocumentationExecutor.class); + + private static final String INDEX_PATH = "index.zip"; + private static final Version LUCENE_VERSION = Version.LUCENE_44; + + private IndexSearcher searcher; + private QueryParser parser; + + public static class DocResult { + public String title; + public String url; + public String content; + } + + @Inject + public QueryDocumentationExecutor() { + try { + Directory dir = readIndexDirectory(); + if (dir == null) { + searcher = null; + parser = null; + return; + } + IndexReader reader = DirectoryReader.open(dir); + searcher = new IndexSearcher(reader); + StandardAnalyzer analyzer = new StandardAnalyzer(LUCENE_VERSION); + parser = new QueryParser(LUCENE_VERSION, Constants.DOC_FIELD, analyzer); + } catch (IOException e) { + log.error("Cannot initialize documentation full text index", e); + searcher = null; + parser = null; + } + } + + public List<DocResult> doQuery(String q) throws DocQueryException { + if (parser == null || searcher == null) { + throw new DocQueryException("Documentation search not available"); + } + try { + Query query = parser.parse(q); + // TODO(fishywang): Currently as we don't have much documentation, we just use MAX_VALUE here + // and skipped paging. Maybe add paging later. + TopDocs results = searcher.search(query, Integer.MAX_VALUE); + ScoreDoc[] hits = results.scoreDocs; + int totalHits = results.totalHits; + + List<DocResult> out = Lists.newArrayListWithCapacity(totalHits); + for (int i = 0; i < totalHits; i++) { + DocResult result = new DocResult(); + Document doc = searcher.doc(hits[i].doc); + result.url = doc.get(Constants.URL_FIELD); + result.title = doc.get(Constants.TITLE_FIELD); + out.add(result); + } + return out; + } catch (IOException e) { + throw new DocQueryException(e); + } catch (ParseException e) { + throw new DocQueryException(e); + } + } + + protected Directory readIndexDirectory() throws IOException { + Directory dir = new RAMDirectory(); + byte[] buffer = new byte[4096]; + InputStream index = + QueryDocumentationExecutor.class.getClassLoader() + .getResourceAsStream(INDEX_PATH); + if (index == null) { + log.warn("No index available"); + return null; + } + ZipInputStream zip = new ZipInputStream(index); + try { + ZipEntry entry; + while ((entry = zip.getNextEntry()) != null) { + IndexOutput out = dir.createOutput(entry.getName(), null); + int count; + while ((count = zip.read(buffer)) != -1) { + out.writeBytes(buffer, count); + } + out.close(); + } + } finally { + zip.close(); + } + // We must NOT call dir.close() here, as DirectoryReader.open() expects an opened directory. + return dir; + } + + @SuppressWarnings("serial") + public static class DocQueryException extends Exception { + DocQueryException() { + } + + DocQueryException(String msg) { + super(msg); + } + + DocQueryException(String msg, Throwable e) { + super(msg, e); + } + + DocQueryException(Throwable e) { + super(e); + } + } +}
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 98e803f..58d16dc 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
@@ -14,6 +14,8 @@ package com.google.gerrit.server.events; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import com.google.gerrit.common.Nullable; import com.google.gerrit.common.data.LabelType; import com.google.gerrit.common.data.LabelTypes; @@ -69,6 +71,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; @Singleton public class EventFactory { @@ -158,6 +161,29 @@ } /** + * Add allReviewers to an existing ChangeAttribute. + * + * @param a + * @param change + */ + public void addAllReviewers(ChangeAttribute a, Change change) + throws OrmException { + List<PatchSetApproval> approvals = + db.get().patchSetApprovals().byChange(change.getId()).toList(); + if (!approvals.isEmpty()) { + a.allReviewers = Lists.newArrayList(); + Set<Account.Id> seen = Sets.newHashSet(); + for (PatchSetApproval psa : approvals) { + Account.Id id = psa.getAccountId(); + if (!seen.contains(id)) { + seen.add(id); + a.allReviewers.add(asAccountAttribute(id)); + } + } + } + } + + /** * Add submitRecords to an existing ChangeAttribute. * * @param ca
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 c51a6ec..43e0156 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
@@ -19,7 +19,6 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.SitePaths; -import com.google.inject.AbstractModule; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -62,17 +61,11 @@ private static final String UNNAMED = "Unnamed repository; edit this file to name it for gitweb."; - public static class Module extends AbstractModule { + public static class Module extends LifecycleModule { @Override protected void configure() { bind(GitRepositoryManager.class).to(LocalDiskRepositoryManager.class); - - install(new LifecycleModule() { - @Override - protected void configure() { - listener().to(LocalDiskRepositoryManager.Lifecycle.class); - } - }); + listener().to(LocalDiskRepositoryManager.Lifecycle.class); } }
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 aa334f3..40addac 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
@@ -951,7 +951,7 @@ } private enum RetryStatus { - UNSUBMIT, RETRY_NO_MESSAGE, RETRY_ADD_MESSAGE; + UNSUBMIT, RETRY_NO_MESSAGE, RETRY_ADD_MESSAGE } private RetryStatus getRetryStatus(
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/NotifyConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/NotifyConfig.java index 3a0c278..abc53f4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/NotifyConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/NotifyConfig.java
@@ -25,7 +25,7 @@ public class NotifyConfig implements Comparable<NotifyConfig> { public static enum Header { - TO, CC, BCC; + TO, CC, BCC } private String name;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectLevelConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectLevelConfig.java new file mode 100644 index 0000000..fc95608 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectLevelConfig.java
@@ -0,0 +1,97 @@ +// 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.git; + +import com.google.common.collect.Iterables; +import com.google.gerrit.server.project.ProjectState; + +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.CommitBuilder; +import org.eclipse.jgit.lib.Config; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Set; + +/** Configuration file in the projects refs/meta/config branch. */ +public class ProjectLevelConfig extends VersionedMetaData { + private final String fileName; + private final ProjectState project; + private Config cfg; + + public ProjectLevelConfig(String fileName, ProjectState project) { + this.fileName = fileName; + this.project = project; + } + + @Override + protected String getRefName() { + return GitRepositoryManager.REF_CONFIG; + } + + @Override + protected void onLoad() throws IOException, ConfigInvalidException { + cfg = readConfig(fileName); + } + + public Config get() { + if (cfg == null) { + cfg = new Config(); + } + return cfg; + } + + public Config getWithInheritance() { + Config cfgWithInheritance = new Config(); + try { + cfgWithInheritance.fromText(get().toText()); + } catch (ConfigInvalidException e) { + // cannot happen + } + ProjectState parent = Iterables.getFirst(project.parents(), null); + if (parent != null) { + Config parentCfg = parent.getConfig(fileName).getWithInheritance(); + for (String section : parentCfg.getSections()) { + Set<String> allNames = get().getNames(section); + for (String name : parentCfg.getNames(section)) { + if (!allNames.contains(name)) { + cfgWithInheritance.setStringList(section, null, name, + Arrays.asList(parentCfg.getStringList(section, null, name))); + } + } + + for (String subsection : parentCfg.getSubsections(section)) { + allNames = get().getNames(section, subsection); + for (String name : parentCfg.getNames(section, subsection)) { + if (!allNames.contains(name)) { + cfgWithInheritance.setStringList(section, subsection, name, + Arrays.asList(parentCfg.getStringList(section, subsection, name))); + } + } + } + } + } + return cfgWithInheritance; + } + + @Override + protected void onSave(CommitBuilder commit) throws IOException, + ConfigInvalidException { + if (commit.getMessage() == null || "".equals(commit.getMessage())) { + commit.setMessage("Updated configuration\n"); + } + saveConfig(fileName, cfg); + } +}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/QueueProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/QueueProvider.java index b539416..c7d925c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/QueueProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/QueueProvider.java
@@ -16,7 +16,7 @@ public interface QueueProvider { public static enum QueueType { - INTERACTIVE, BATCH; + INTERACTIVE, BATCH } public WorkQueue.Executor getQueue(QueueType type);
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 ac1929b..09c970e 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
@@ -64,7 +64,7 @@ n.statusCode = CommitMergeStatus.MISSING_DEPENDENCY; n.missing = new ArrayList<CodeReviewCommit>(); } - n.missing.add((CodeReviewCommit) c); + n.missing.add(c); } else { contents.add(c); }
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 06e88e4..48ad01a 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
@@ -328,7 +328,7 @@ final ChangeCache changeCache, final ChangeInserter.Factory changeInserterFactory, final CommitValidators.Factory commitValidatorsFactory, - @CanonicalWebUrl @Nullable final String canonicalWebUrl, + @CanonicalWebUrl final String canonicalWebUrl, @GerritPersonIdent final PersonIdent gerritIdent, final TrackingFooters trackingFooters, final WorkQueue workQueue, @@ -404,9 +404,10 @@ if (allRefs == null) { try { allRefs = rp.getRepository().getRefDatabase().getRefs(ALL); + } catch (ServiceMayNotContinueException e) { + throw e; } catch (IOException e) { - ServiceMayNotContinueException ex = - new ServiceMayNotContinueException(e.getMessage()); + ServiceMayNotContinueException ex = new ServiceMayNotContinueException(); ex.initCause(e); throw ex; } @@ -591,22 +592,42 @@ return input.created; } }); - if (!Iterables.isEmpty(created) && canonicalWebUrl != null) { - final String url = canonicalWebUrl; + if (!Iterables.isEmpty(created)) { addMessage(""); addMessage("New Changes:"); for (CreateRequest c : created) { - StringBuilder m = new StringBuilder() - .append(" ") - .append(url) - .append(c.change.getChangeId()); - if (c.change.getStatus() == Change.Status.DRAFT) { - m.append(" [DRAFT]"); - } - addMessage(m.toString()); + addMessage(formatChangeUrl(canonicalWebUrl, c.change)); } addMessage(""); } + + Iterable<ReplaceRequest> updated = + Iterables.filter(replaceByChange.values(), + new Predicate<ReplaceRequest>() { + @Override + public boolean apply(ReplaceRequest input) { + return !input.skip; + } + }); + if (!Iterables.isEmpty(updated)) { + addMessage(""); + addMessage("Updated Changes:"); + for (ReplaceRequest u : updated) { + addMessage(formatChangeUrl(canonicalWebUrl, u.change)); + } + addMessage(""); + } + } + + private static String formatChangeUrl(String url, Change change) { + StringBuilder m = new StringBuilder() + .append(" ") + .append(url) + .append(change.getChangeId()); + if (change.getStatus() == Change.Status.DRAFT) { + m.append(" [DRAFT]"); + } + return m.toString(); } private void insertChangesAndPatchSets() { @@ -960,10 +981,10 @@ RefControl ctl; Set<Account.Id> reviewer = Sets.newLinkedHashSet(); Set<Account.Id> cc = Sets.newLinkedHashSet(); - RevCommit baseCommit; + List<RevCommit> baseCommit; @Option(name = "--base", metaVar = "BASE", usage = "merge base of changes") - ObjectId base; + List<ObjectId> base; @Option(name = "--topic", metaVar = "NAME", usage = "attach topic to changes") String topic; @@ -1114,20 +1135,24 @@ RevWalk walk = rp.getRevWalk(); if (magicBranch.base != null) { - try { - magicBranch.baseCommit = walk.parseCommit(magicBranch.base); - } catch (IncorrectObjectTypeException notCommit) { - reject(cmd, "base must be a commit"); - return; - } catch (MissingObjectException e) { - reject(cmd, "base not found"); - return; - } catch (IOException e) { - log.warn(String.format( - "Project %s cannot read %s", - project.getName(), magicBranch.base.name()), e); - reject(cmd, "internal server error"); - return; + magicBranch.baseCommit = Lists.newArrayListWithCapacity( + magicBranch.base.size()); + for (ObjectId id : magicBranch.base) { + try { + magicBranch.baseCommit.add(walk.parseCommit(id)); + } catch (IncorrectObjectTypeException notCommit) { + reject(cmd, "base must be a commit"); + return; + } catch (MissingObjectException e) { + reject(cmd, "base not found"); + return; + } catch (IOException e) { + log.warn(String.format( + "Project %s cannot read %s", + project.getName(), id.name()), e); + reject(cmd, "internal server error"); + return; + } } } @@ -1267,7 +1292,9 @@ Set<ObjectId> existing = Sets.newHashSet(); walk.markStart(walk.parseCommit(magicBranch.cmd.getNewId())); if (magicBranch.baseCommit != null) { - walk.markUninteresting(magicBranch.baseCommit); + for (RevCommit c : magicBranch.baseCommit) { + walk.markUninteresting(c); + } assert magicBranch.ctl != null; Ref targetRef = allRefs.get(magicBranch.ctl.getRefName()); if (targetRef != null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java index 530a388..f34ce8b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java
@@ -68,9 +68,10 @@ if (oldRefs == null) { try { oldRefs = rp.getRepository().getRefDatabase().getRefs(ALL); + } catch (ServiceMayNotContinueException e) { + throw e; } catch (IOException e) { - ServiceMayNotContinueException ex = - new ServiceMayNotContinueException(e.getMessage()); + ServiceMayNotContinueException ex = new ServiceMayNotContinueException(); ex.initCause(e); throw ex; }
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 8c65b1a..14aae94 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
@@ -127,9 +127,10 @@ RevWalk revWalk) throws ServiceMayNotContinueException { try { return filter(repository.getRefDatabase().getRefs(RefDatabase.ALL)); + } catch (ServiceMayNotContinueException e) { + throw e; } catch (IOException e) { - ServiceMayNotContinueException ex = - new ServiceMayNotContinueException(e.getMessage()); + ServiceMayNotContinueException ex = new ServiceMayNotContinueException(); ex.initCause(e); throw ex; }
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 64210a0..ab145e6 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
@@ -241,7 +241,7 @@ // prefer to see tasks sorted in: done before running, // running before ready, ready before sleeping. // - DONE, CANCELLED, RUNNING, READY, SLEEPING, OTHER; + DONE, CANCELLED, RUNNING, READY, SLEEPING, OTHER } private final Runnable runnable;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddIncludedGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddIncludedGroups.java index 195ea1c..c417dfc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddIncludedGroups.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddIncludedGroups.java
@@ -20,7 +20,6 @@ import com.google.common.collect.Maps; import com.google.gerrit.common.data.GroupDescription; import com.google.gerrit.extensions.restapi.AuthException; -import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.DefaultInput; import com.google.gerrit.extensions.restapi.MethodNotAllowedException; import com.google.gerrit.extensions.restapi.RestModifyView; @@ -87,7 +86,7 @@ @Override public List<GroupInfo> apply(GroupResource resource, Input input) - throws MethodNotAllowedException, AuthException, BadRequestException, + throws MethodNotAllowedException, AuthException, UnprocessableEntityException, OrmException { AccountGroup group = resource.toAccountGroup(); if (group == null) { @@ -149,7 +148,7 @@ @Override public GroupInfo apply(GroupResource resource, Input input) - throws MethodNotAllowedException, AuthException, BadRequestException, + throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException { AddIncludedGroups.Input in = new AddIncludedGroups.Input(); in.groups = ImmutableList.of(id); @@ -173,8 +172,8 @@ } @Override - public Object apply(IncludedGroupResource resource, - PutIncludedGroup.Input input) throws MethodNotAllowedException, OrmException { + public GroupInfo apply(IncludedGroupResource resource, + PutIncludedGroup.Input input) throws OrmException { // Do nothing, the group is already included. return get.get().apply(resource); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java index 5ebf504..8ec6a3f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java
@@ -200,7 +200,7 @@ } @Override - public Object apply(GroupResource resource, PutMember.Input input) + public AccountInfo apply(GroupResource resource, PutMember.Input input) throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException { AddMembers.Input in = new AddMembers.Input(); @@ -225,7 +225,7 @@ } @Override - public Object apply(MemberResource resource, PutMember.Input input) + public AccountInfo apply(MemberResource resource, PutMember.Input input) throws OrmException { // Do nothing, the user is already a member. return get.get().apply(resource);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/CreateGroup.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/CreateGroup.java index 6914cf2..cf8d9d0 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/CreateGroup.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/CreateGroup.java
@@ -24,6 +24,7 @@ import com.google.gerrit.extensions.annotations.RequiresCapability; 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.RestModifyView; import com.google.gerrit.extensions.restapi.TopLevelResource; import com.google.gerrit.extensions.restapi.UnprocessableEntityException; @@ -79,7 +80,7 @@ @Override public GroupInfo apply(TopLevelResource resource, Input input) throws AuthException, BadRequestException, UnprocessableEntityException, - NameAlreadyUsedException, OrmException { + ResourceConflictException, OrmException { if (input == null) { input = new Input(); } @@ -101,6 +102,8 @@ null); } catch (PermissionDeniedException e) { throw new AuthException(e.getMessage()); + } catch (NameAlreadyUsedException e) { + throw new ResourceConflictException(e.getMessage()); } return json.format(GroupDescriptions.forAccountGroup(group)); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteIncludedGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteIncludedGroups.java index c5d95b0..04dcda3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteIncludedGroups.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteIncludedGroups.java
@@ -19,7 +19,6 @@ import com.google.common.collect.Maps; import com.google.gerrit.common.data.GroupDescription; import com.google.gerrit.extensions.restapi.AuthException; -import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.MethodNotAllowedException; import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestModifyView; @@ -59,8 +58,8 @@ } @Override - public Object apply(GroupResource resource, Input input) - throws MethodNotAllowedException, AuthException, BadRequestException, + public Response<?> apply(GroupResource resource, Input input) + throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException { AccountGroup internalGroup = resource.toAccountGroup(); if (internalGroup == null) { @@ -143,8 +142,8 @@ } @Override - public Object apply(IncludedGroupResource resource, Input input) - throws MethodNotAllowedException, AuthException, BadRequestException, + public Response<?> apply(IncludedGroupResource resource, Input input) + throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException { AddIncludedGroups.Input in = new AddIncludedGroups.Input(); in.groups = ImmutableList.of(resource.getMember().get());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteMembers.java index 186d4b6..fd1b8f4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteMembers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/DeleteMembers.java
@@ -16,7 +16,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.google.gerrit.common.errors.NoSuchGroupException; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.MethodNotAllowedException; import com.google.gerrit.extensions.restapi.Response; @@ -57,7 +56,7 @@ } @Override - public Object apply(GroupResource resource, Input input) + public Response<?> apply(GroupResource resource, Input input) throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException { AccountGroup internalGroup = resource.toAccountGroup(); @@ -141,9 +140,9 @@ } @Override - public Object apply(MemberResource resource, Input input) + public Response<?> apply(MemberResource resource, Input input) throws AuthException, MethodNotAllowedException, - UnprocessableEntityException, OrmException, NoSuchGroupException { + UnprocessableEntityException, OrmException { AddMembers.Input in = new AddMembers.Input(); in._oneMember = resource.getMember().getAccountId().toString(); return delete.get().apply(resource, in);
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 03ec067..76e54b6 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
@@ -23,9 +23,6 @@ import com.google.gerrit.common.data.GroupReference; import com.google.gerrit.common.errors.NoSuchGroupException; import com.google.gerrit.common.groups.ListGroupsOption; -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.extensions.restapi.TopLevelResource; import com.google.gerrit.extensions.restapi.Url; @@ -96,7 +93,7 @@ @Option(name = "-m", metaVar = "MATCH", usage = "match group substring") private String matchSubstring; - @Option(name = "-o", multiValued = true, usage = "Output options per group") + @Option(name = "-o", usage = "Output options per group") public void addOption(ListGroupsOption o) { options.add(o); } @@ -132,8 +129,7 @@ } @Override - public Object apply(TopLevelResource resource) throws AuthException, - BadRequestException, ResourceConflictException, Exception { + public Object apply(TopLevelResource resource) throws OrmException { final Map<String, GroupInfo> output = Maps.newTreeMap(); for (GroupInfo info : get()) { output.put(Objects.firstNonNull(
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutDescription.java index dcc0a76..d17a8b6 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutDescription.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutDescription.java
@@ -15,7 +15,6 @@ package com.google.gerrit.server.group; import com.google.common.base.Strings; -import com.google.gerrit.common.errors.NoSuchGroupException; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.DefaultInput; import com.google.gerrit.extensions.restapi.MethodNotAllowedException; @@ -47,8 +46,8 @@ } @Override - public Object apply(GroupResource resource, Input input) - throws MethodNotAllowedException, AuthException, NoSuchGroupException, + public Response<String> apply(GroupResource resource, Input input) + throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException { if (input == null) { input = new Input(); // Delete would set description to null. @@ -71,7 +70,7 @@ groupCache.evict(group); return Strings.isNullOrEmpty(input.description) - ? Response.none() - : input.description; + ? Response.<String>none() + : Response.ok(input.description); } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutGroup.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutGroup.java index 9cbed6c..4d3d6be 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/PutGroup.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/PutGroup.java
@@ -15,12 +15,13 @@ package com.google.gerrit.server.group; 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.group.CreateGroup.Input; public class PutGroup implements RestModifyView<GroupResource, Input> { @Override - public Object apply(GroupResource resource, Input input) + public Response<?> apply(GroupResource resource, Input input) throws ResourceConflictException { throw new ResourceConflictException("Group already exists"); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java index 2cfc93d..4d285f1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexModule.java
@@ -37,7 +37,7 @@ */ public class IndexModule extends LifecycleModule { public enum IndexType { - SQL, LUCENE, SOLR; + SQL, LUCENE, SOLR } /** Type of secondary index. */
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 cd6409e..cb92b0f 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
@@ -17,13 +17,13 @@ import com.google.common.base.Strings; import com.google.common.collect.Ordering; import com.google.gerrit.common.errors.EmailException; +import com.google.gerrit.extensions.api.changes.ReviewInput.NotifyHandling; import com.google.gerrit.reviewdb.client.AccountProjectWatch.NotifyType; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.CommentRange; 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.server.change.PostReview.NotifyHandling; import com.google.gerrit.server.patch.PatchFile; import com.google.gerrit.server.patch.PatchList; import com.google.gerrit.server.patch.PatchListNotAvailableException;
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 89fc6b9..b32e7f4 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
@@ -51,7 +51,7 @@ } public static enum Encryption { - NONE, SSL, TLS; + NONE, SSL, TLS } private final boolean enabled;
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 e1294e0..b71d04a 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,8 +311,8 @@ MergeFormatter fmt = new MergeFormatter(); Map<String, MergeResult<? extends Sequence>> r = m.getMergeResults(); Map<String, ObjectId> resolved = new HashMap<String, ObjectId>(); - for (String path : r.keySet()) { - MergeResult<? extends Sequence> p = r.get(path); + for (Map.Entry<String, MergeResult<? extends Sequence>> entry : r.entrySet()) { + MergeResult<? extends Sequence> p = entry.getValue(); TemporaryBuffer buf = new TemporaryBuffer.LocalFile(10 * 1024 * 1024); try { fmt.formatMerge(buf, p, "BASE", oursName, theirsName, "UTF-8"); @@ -320,7 +320,7 @@ InputStream in = buf.openInputStream(); try { - resolved.put(path, ins.insert(Constants.OBJ_BLOB, buf.length(), in)); + resolved.put(entry.getKey(), ins.insert(Constants.OBJ_BLOB, buf.length(), in)); } finally { in.close(); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/DisablePlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/DisablePlugin.java index cae5ce6..d6dfa3c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/DisablePlugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/DisablePlugin.java
@@ -19,6 +19,7 @@ import com.google.gerrit.extensions.annotations.RequiresCapability; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.server.plugins.DisablePlugin.Input; +import com.google.gerrit.server.plugins.ListPlugins.PluginInfo; import com.google.inject.Inject; @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER) @@ -34,9 +35,9 @@ } @Override - public Object apply(PluginResource resource, Input input) { + public PluginInfo apply(PluginResource resource, Input input) { String name = resource.getName(); loader.disablePlugins(ImmutableSet.of(name)); - return new ListPlugins.PluginInfo(loader.get(name)); + return new PluginInfo(loader.get(name)); } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/EnablePlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/EnablePlugin.java index f33d814..ebe6d1a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/EnablePlugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/EnablePlugin.java
@@ -20,6 +20,7 @@ import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.server.plugins.EnablePlugin.Input; +import com.google.gerrit.server.plugins.ListPlugins.PluginInfo; import com.google.inject.Inject; import java.io.PrintWriter; @@ -38,7 +39,7 @@ } @Override - public Object apply(PluginResource resource, Input input) + public PluginInfo apply(PluginResource resource, Input input) throws ResourceConflictException { String name = resource.getName(); try { @@ -51,6 +52,6 @@ pw.flush(); throw new ResourceConflictException(buf.toString()); } - return new ListPlugins.PluginInfo(loader.get(name)); + return new PluginInfo(loader.get(name)); } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/GetStatus.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/GetStatus.java index 2207d34..7651506 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/GetStatus.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/GetStatus.java
@@ -15,10 +15,11 @@ package com.google.gerrit.server.plugins; import com.google.gerrit.extensions.restapi.RestReadView; +import com.google.gerrit.server.plugins.ListPlugins.PluginInfo; class GetStatus implements RestReadView<PluginResource> { @Override - public Object apply(PluginResource resource) { - return new ListPlugins.PluginInfo(resource.getPlugin()); + public PluginInfo apply(PluginResource resource) { + return new PluginInfo(resource.getPlugin()); } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/InstallPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/InstallPlugin.java index 6684bfb..f9bdb48 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/InstallPlugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/InstallPlugin.java
@@ -23,6 +23,7 @@ import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.extensions.restapi.TopLevelResource; import com.google.gerrit.server.plugins.InstallPlugin.Input; +import com.google.gerrit.server.plugins.ListPlugins.PluginInfo; import com.google.inject.Inject; import java.io.IOException; @@ -52,7 +53,7 @@ } @Override - public Response<ListPlugins.PluginInfo> apply(TopLevelResource resource, + public Response<PluginInfo> apply(TopLevelResource resource, Input input) throws BadRequestException, IOException { try { InputStream in; @@ -101,7 +102,7 @@ } @Override - public Response<ListPlugins.PluginInfo> apply(PluginResource resource, + public Response<PluginInfo> apply(PluginResource resource, Input input) throws BadRequestException, IOException { return new InstallPlugin(loader, resource.getName(), false) .apply(TopLevelResource.INSTANCE, input);
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/JarPlugin.java index 6adc677..1568997 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/JarPlugin.java
@@ -17,6 +17,7 @@ import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.gerrit.common.Nullable; +import com.google.gerrit.extensions.annotations.PluginCanonicalWebUrl; import com.google.gerrit.extensions.annotations.PluginData; import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.extensions.registration.RegistrationHandle; @@ -59,6 +60,7 @@ private final JarFile jarFile; private final Manifest manifest; private final File dataDir; + private final String pluginCanonicalWebUrl; private final ClassLoader classLoader; private Class<? extends Module> sysModule; private Class<? extends Module> sshModule; @@ -71,6 +73,7 @@ private List<ReloadableRegistrationHandle<?>> reloadableHandles; public JarPlugin(String name, + String pluginCanonicalWebUrl, PluginUser pluginUser, File srcJar, FileSnapshot snapshot, @@ -83,6 +86,7 @@ @Nullable Class<? extends Module> sshModule, @Nullable Class<? extends Module> httpModule) { super(name, srcJar, pluginUser, snapshot, apiType); + this.pluginCanonicalWebUrl = pluginCanonicalWebUrl; this.jarFile = jarFile; this.manifest = manifest; this.dataDir = dataDir; @@ -193,6 +197,9 @@ bind(String.class) .annotatedWith(PluginName.class) .toInstance(getName()); + bind(String.class) + .annotatedWith(PluginCanonicalWebUrl.class) + .toInstance(pluginCanonicalWebUrl); bind(File.class) .annotatedWith(PluginData.class)
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java index ca0f7ae..08c95b2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ListPlugins.java
@@ -19,9 +19,6 @@ import com.google.common.collect.Maps; import com.google.gerrit.common.data.GlobalCapability; import com.google.gerrit.extensions.annotations.RequiresCapability; -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.extensions.restapi.TopLevelResource; import com.google.gerrit.extensions.restapi.Url; @@ -69,8 +66,8 @@ } @Override - public Object apply(TopLevelResource resource) throws AuthException, - BadRequestException, ResourceConflictException, Exception { + public Object apply(TopLevelResource resource) + throws UnsupportedEncodingException { format = OutputFormat.JSON; return display(null); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java index d9a2c0f..9bf4085 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/Plugin.java
@@ -34,7 +34,7 @@ public abstract class Plugin { public static enum ApiType { - EXTENSION, PLUGIN, JS; + EXTENSION, PLUGIN, JS } /** Unique key that changes whenever a plugin reloads. */
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 7569744..4682d2b 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
@@ -14,6 +14,7 @@ package com.google.gerrit.server.plugins; +import com.google.common.base.CharMatcher; import com.google.common.base.Joiner; import com.google.common.base.Objects; import com.google.common.base.Predicate; @@ -30,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.config.CanonicalWebUrl; import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.SitePaths; @@ -86,6 +88,7 @@ private final Queue<Plugin> toCleanup; private final Provider<PluginCleanerTask> cleaner; private final PluginScannerThread scanner; + private final Provider<String> urlProvider; @Inject public PluginLoader(SitePaths sitePaths, @@ -93,7 +96,8 @@ ServerInformationImpl sii, PluginUser.Factory puf, Provider<PluginCleanerTask> pct, - @GerritServerConfig Config cfg) { + @GerritServerConfig Config cfg, + @CanonicalWebUrl Provider<String> provider) { pluginsDir = sitePaths.plugins_dir; dataDir = sitePaths.data_dir; tmpDir = sitePaths.tmp_dir; @@ -106,6 +110,7 @@ toCleanup = Queues.newArrayDeque(); cleanupHandles = Maps.newConcurrentMap(); cleaner = pct; + urlProvider = provider; long checkFrequency = ConfigUtil.getTimeUnit(cfg, "plugins", null, "checkFrequency", @@ -344,8 +349,9 @@ syncDisabledPlugins(jars); Map<String, File> activePlugins = filterDisabled(jars); - for (String name : activePlugins.keySet()) { - File jar = activePlugins.get(name); + for (Map.Entry<String, File> entry : activePlugins.entrySet()) { + String name = entry.getKey(); + File jar = entry.getValue(); FileSnapshot brokenTime = broken.get(name); if (brokenTime != null && !brokenTime.isModified(jar)) { continue; @@ -504,7 +510,13 @@ Class<? extends Module> sysModule = load(sysName, pluginLoader); Class<? extends Module> sshModule = load(sshName, pluginLoader); Class<? extends Module> httpModule = load(httpName, pluginLoader); - Plugin plugin = new JarPlugin(name, pluginUserFactory.create(name), + + String url = String.format("%s/plugins/%s/", + CharMatcher.is('/').trimTrailingFrom(urlProvider.get()), + name); + + Plugin plugin = new JarPlugin(name, url, + pluginUserFactory.create(name), srcJar, snapshot, jarFile, manifest, new File(dataDir, name), type, pluginLoader,
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginModule.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginModule.java index bd1c3c8..055baf1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginModule.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginModule.java
@@ -16,9 +16,8 @@ import com.google.gerrit.extensions.systemstatus.ServerInformation; import com.google.gerrit.lifecycle.LifecycleModule; -import com.google.inject.AbstractModule; -public class PluginModule extends AbstractModule { +public class PluginModule extends LifecycleModule { @Override protected void configure() { bind(ServerInformationImpl.class); @@ -28,11 +27,6 @@ bind(PluginGuiceEnvironment.class); bind(PluginLoader.class); bind(CopyConfigModule.class); - install(new LifecycleModule() { - @Override - protected void configure() { - listener().to(PluginLoader.class); - } - }); + listener().to(PluginLoader.class); } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPlugin.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPlugin.java index 9f9ef2db..32e8b24 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPlugin.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/ReloadPlugin.java
@@ -19,6 +19,7 @@ import com.google.gerrit.extensions.annotations.RequiresCapability; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.RestModifyView; +import com.google.gerrit.server.plugins.ListPlugins.PluginInfo; import com.google.gerrit.server.plugins.ReloadPlugin.Input; import com.google.inject.Inject; @@ -38,7 +39,7 @@ } @Override - public Object apply(PluginResource resource, Input input) throws ResourceConflictException { + public PluginInfo apply(PluginResource resource, Input input) throws ResourceConflictException { String name = resource.getName(); try { loader.reload(ImmutableList.of(name)); @@ -52,6 +53,6 @@ pw.flush(); throw new ResourceConflictException(buf.toString()); } - return new ListPlugins.PluginInfo(loader.get(name)); + return new PluginInfo(loader.get(name)); } }
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 698a0ac..5c40d16 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
@@ -166,6 +166,19 @@ } } + /** + * Exception thrown when the label term of a submit record + * unexpectedly didn't contain a user term. + */ + private static class UserTermExpected extends Exception { + private static final long serialVersionUID = 1L; + + public UserTermExpected(SubmitRecord.Label label) { + super(String.format("A label with the status %s must contain a user.", + label.toString())); + } + } + private final RefControl refControl; private final Change change; @@ -504,25 +517,29 @@ lbl.label = state.arg(0).name(); Term status = state.arg(1); - if ("ok".equals(status.name())) { - lbl.status = SubmitRecord.Label.Status.OK; - appliedBy(lbl, status); + try { + if ("ok".equals(status.name())) { + lbl.status = SubmitRecord.Label.Status.OK; + appliedBy(lbl, status); - } else if ("reject".equals(status.name())) { - lbl.status = SubmitRecord.Label.Status.REJECT; - appliedBy(lbl, status); + } else if ("reject".equals(status.name())) { + lbl.status = SubmitRecord.Label.Status.REJECT; + appliedBy(lbl, status); - } else if ("need".equals(status.name())) { - lbl.status = SubmitRecord.Label.Status.NEED; + } else if ("need".equals(status.name())) { + lbl.status = SubmitRecord.Label.Status.NEED; - } else if ("may".equals(status.name())) { - lbl.status = SubmitRecord.Label.Status.MAY; + } else if ("may".equals(status.name())) { + lbl.status = SubmitRecord.Label.Status.MAY; - } else if ("impossible".equals(status.name())) { - lbl.status = SubmitRecord.Label.Status.IMPOSSIBLE; + } else if ("impossible".equals(status.name())) { + lbl.status = SubmitRecord.Label.Status.IMPOSSIBLE; - } else { - return logInvalidResult(submitRule, submitRecord); + } else { + return logInvalidResult(submitRule, submitRecord); + } + } catch (UserTermExpected e) { + return logInvalidResult(submitRule, submitRecord, e.getMessage()); } } @@ -593,9 +610,14 @@ } } - private List<SubmitRecord> logInvalidResult(Term rule, Term record) { + private List<SubmitRecord> logInvalidResult(Term rule, Term record, String reason) { return logRuleError("Submit rule " + rule + " for change " + change.getId() - + " of " + getProject().getName() + " output invalid result: " + record); + + " of " + getProject().getName() + " output invalid result: " + record + + (reason == null ? "" : ". Reason: " + reason)); + } + + private List<SubmitRecord> logInvalidResult(Term rule, Term record) { + return logInvalidResult(rule, record, null); } private List<SubmitRecord> logRuleError(String err, Exception e) { @@ -638,11 +660,14 @@ return rec; } - private void appliedBy(SubmitRecord.Label label, Term status) { + private void appliedBy(SubmitRecord.Label label, Term status) + throws UserTermExpected { if (status.isStructure() && status.arity() == 1) { Term who = status.arg(0); if (isUser(who)) { label.appliedBy = new Account.Id(((IntegerTerm) who.arg(0)).intValue()); + } else { + throw new UserTermExpected(label); } } }
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 0d4f336..58f6b15 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
@@ -32,6 +32,7 @@ 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.inject.Inject; import com.google.inject.Provider; import com.google.inject.assistedinject.Assisted; @@ -82,7 +83,7 @@ } @Override - public Object apply(TopLevelResource resource, Input input) + public Response<ProjectInfo> apply(TopLevelResource resource, Input input) throws BadRequestException, UnprocessableEntityException, ProjectCreationFailedException, IOException { if (input == null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java index a41c197..600f65d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteBranch.java
@@ -59,7 +59,7 @@ } @Override - public Object apply(BranchResource rsrc, Input input) throws AuthException, + public Response<?> apply(BranchResource rsrc, Input input) throws AuthException, ResourceConflictException, OrmException, IOException { if (!rsrc.getControl().controlForRef(rsrc.getBranchKey()).canDelete()) { throw new AuthException("Cannot delete branch");
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteDashboard.java index da1e46b..669f024 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteDashboard.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/DeleteDashboard.java
@@ -18,11 +18,16 @@ import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.MethodNotAllowedException; import com.google.gerrit.extensions.restapi.ResourceConflictException; +import com.google.gerrit.extensions.restapi.ResourceNotFoundException; +import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestModifyView; +import com.google.gerrit.server.project.DashboardsCollection.DashboardInfo; import com.google.gerrit.server.project.DeleteDashboard.Input; import com.google.inject.Inject; import com.google.inject.Provider; +import java.io.IOException; + class DeleteDashboard implements RestModifyView<DashboardResource, Input> { static class Input { String commitMessage; @@ -36,9 +41,9 @@ } @Override - public Object apply(DashboardResource resource, Input input) + public Response<DashboardInfo> apply(DashboardResource resource, Input input) throws AuthException, BadRequestException, ResourceConflictException, - Exception { + ResourceNotFoundException, MethodNotAllowedException, IOException { if (resource.isProjectDefault()) { SetDashboard.Input in = new SetDashboard.Input(); in.commitMessage = input != null ? input.commitMessage : null;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java index ca7f6f0..b98cb8b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GarbageCollect.java
@@ -20,6 +20,7 @@ import com.google.gerrit.extensions.annotations.RequiresCapability; import com.google.gerrit.extensions.restapi.BinaryResult; import com.google.gerrit.extensions.restapi.RestModifyView; +import com.google.gerrit.extensions.webui.UiAction; import com.google.gerrit.server.git.GarbageCollection; import com.google.gerrit.server.project.GarbageCollect.Input; import com.google.inject.Inject; @@ -31,8 +32,10 @@ import java.util.Collections; @RequiresCapability(GlobalCapability.RUN_GC) -public class GarbageCollect implements RestModifyView<ProjectResource, Input> { +public class GarbageCollect implements RestModifyView<ProjectResource, Input>, + UiAction<ProjectResource> { public static class Input { + public boolean showProgress; } private GarbageCollection.Factory garbageCollectionFactory; @@ -43,7 +46,7 @@ } @Override - public BinaryResult apply(final ProjectResource rsrc, Input input) { + public BinaryResult apply(final ProjectResource rsrc, final Input input) { return new BinaryResult() { @Override public void writeTo(OutputStream out) throws IOException { @@ -56,10 +59,10 @@ }; try { GarbageCollectionResult result = garbageCollectionFactory.create().run( - Collections.singletonList(rsrc.getNameKey()), writer); + Collections.singletonList(rsrc.getNameKey()), input.showProgress ? writer : null); + String msg = "garbage collection was successfully done"; if (result.hasErrors()) { for (GarbageCollectionResult.Error e : result.getErrors()) { - String msg; switch (e.getType()) { case REPOSITORY_NOT_FOUND: msg = "error: project \"" + e.getProjectName() + "\" not found"; @@ -76,9 +79,9 @@ msg = "error: garbage collection for project \"" + e.getProjectName() + "\" failed: " + e.getType(); } - writer.println(msg); } } + writer.println(msg); } finally { writer.flush(); } @@ -87,4 +90,11 @@ .setCharacterEncoding(Charsets.UTF_8.name()) .disableGzip(); } + + @Override + public UiAction.Description getDescription(ProjectResource rsrc) { + return new UiAction.Description() + .setLabel("Run GC") + .setTitle("Triggers the Git Garbage Collection for this project."); + } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDashboard.java index 51d6191..fcd2284 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDashboard.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDashboard.java
@@ -20,6 +20,7 @@ import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.gerrit.extensions.restapi.IdString; +import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.RestReadView; import com.google.gerrit.extensions.restapi.Url; @@ -45,7 +46,7 @@ @Override public DashboardInfo apply(DashboardResource resource) - throws ResourceNotFoundException, IOException, ConfigInvalidException { + throws ResourceNotFoundException, ResourceConflictException, IOException { if (inherited && !resource.isProjectDefault()) { // inherited flag can only be used with default. throw new ResourceNotFoundException("inherited"); @@ -54,7 +55,11 @@ String project = resource.getControl().getProject().getName(); if (resource.isProjectDefault()) { // The default is not resolved to a definition yet. - resource = defaultOf(resource.getControl()); + try { + resource = defaultOf(resource.getControl()); + } catch (ConfigInvalidException e) { + throw new ResourceConflictException(e.getMessage()); + } } return DashboardsCollection.parse(
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDescription.java index d8fabab..aeff72f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDescription.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetDescription.java
@@ -20,7 +20,7 @@ class GetDescription implements RestReadView<ProjectResource> { @Override - public Object apply(ProjectResource resource) { + public String apply(ProjectResource resource) { Project project = resource.getControl().getProject(); return Strings.nullToEmpty(project.getDescription()); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetParent.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetParent.java index 1cebd87..f790b7e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/GetParent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/GetParent.java
@@ -28,7 +28,7 @@ } @Override - public Object apply(ProjectResource resource) { + public String apply(ProjectResource resource) { Project project = resource.getControl().getProject(); Project.NameKey parentName = project.getParent(allProjectsName); return parentName != null ? parentName.get() : "";
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 a482278..961f7b2 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
@@ -15,6 +15,7 @@ package com.google.gerrit.server.project; 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> { @@ -27,7 +28,7 @@ } @Override - public Object apply(ProjectResource rsrc) { + public ProjectInfo apply(ProjectResource rsrc) { return json.format(rsrc); } }
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 d4b84dd..58abe40 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
@@ -47,6 +47,10 @@ this.projectNodeFactory = projectNodeFactory; } + public void setRecursive(boolean recursive) { + this.recursive = recursive; + } + @Override public List<ProjectInfo> apply(ProjectResource rsrc) { if (recursive) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java index c063618..e3247fc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ListDashboards.java
@@ -53,7 +53,7 @@ } @Override - public Object apply(ProjectResource resource) + public List<?> apply(ProjectResource resource) throws ResourceNotFoundException, IOException { ProjectControl ctl = resource.getControl(); String project = ctl.getProject().getName();
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 59b544a..e79912e 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
@@ -109,7 +109,7 @@ @Option(name = "--format", usage = "(deprecated) output format") private OutputFormat format = OutputFormat.TEXT; - @Option(name = "--show-branch", aliases = {"-b"}, multiValued = true, + @Option(name = "--show-branch", aliases = {"-b"}, usage = "displays the sha of each project in the specified branch") public void addShowBranch(String branch) { showBranch.add(branch); @@ -271,6 +271,7 @@ info.name = parentState.getProject().getName(); info.description = Strings.emptyToNull( parentState.getProject().getDescription()); + info.state = parentState.getProject().getState(); } else { rejected.add(parentState.getProject().getName()); continue; @@ -313,6 +314,8 @@ info.description = Strings.emptyToNull(e.getProject().getDescription()); } + info.state = e.getProject().getState(); + try { if (!showBranch.isEmpty()) { Repository git = repoManager.openRepository(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 c111c02..8ab3311 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
@@ -506,8 +506,8 @@ } catch (IncorrectObjectTypeException e) { continue; } - if (rw.isMergedInto(commit, tip) - && controlForRef(entry.getKey()).canPerform(Permission.READ)) { + if (controlForRef(entry.getKey()).canPerform(Permission.READ) + && rw.isMergedInto(commit, tip)) { return true; } }
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 8db5cbb..72910a3 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
@@ -41,6 +41,7 @@ Project.NameKey parentName = p.getParent(allProjects); info.parent = parentName != null ? parentName.get() : null; info.description = Strings.emptyToNull(p.getDescription()); + info.state = p.getState(); info.finish(); return info; } @@ -51,6 +52,7 @@ public String name; public String parent; public String description; + public Project.State state; public Map<String, String> branches; void finish() {
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 f4449f0..459e392 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
@@ -41,6 +41,10 @@ return control.getProject().getNameKey(); } + public Project.State getState() { + return control.getProject().getState(); + } + public ProjectControl getControl() { return control; }
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 800fa6e..2e79e2f 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
@@ -40,12 +40,14 @@ import com.google.gerrit.server.config.SitePaths; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.ProjectConfig; +import com.google.gerrit.server.git.ProjectLevelConfig; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; import com.googlecode.prolog_cafe.compiler.CompileException; import com.googlecode.prolog_cafe.lang.PrologMachineCopy; +import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.slf4j.Logger; @@ -83,6 +85,7 @@ private final List<CommentLinkInfo> commentLinks; private final ProjectConfig config; + private final Map<String, ProjectLevelConfig> configs; private final Set<AccountGroup.UUID> localOwners; /** Prolog rule state. */ @@ -121,6 +124,7 @@ this.rulesCache = rulesCache; this.commentLinks = commentLinks; this.config = config; + this.configs = Maps.newHashMap(); this.capabilities = isAllProjects ? new CapabilityCollection(config.getAccessSection(AccessSection.GLOBAL_CAPABILITIES)) : null; @@ -216,6 +220,29 @@ return config; } + public ProjectLevelConfig getConfig(String fileName) { + if (configs.containsKey(fileName)) { + return configs.get(fileName); + } + + ProjectLevelConfig cfg = new ProjectLevelConfig(fileName, this); + try { + Repository git = gitMgr.openRepository(getProject().getNameKey()); + try { + cfg.load(git); + } finally { + git.close(); + } + } catch (IOException e) { + log.warn("Failed to load " + fileName + " for " + getProject().getName(), e); + } catch (ConfigInvalidException e) { + log.warn("Failed to load " + fileName + " for " + getProject().getName(), e); + } + + configs.put(fileName, cfg); + return cfg; + } + public long getMaxObjectSizeLimit() { return config.getMaxObjectSizeLimit(); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java index f7dd3cb..58db203 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutDescription.java
@@ -17,7 +17,6 @@ import com.google.common.base.Objects; import com.google.common.base.Strings; import com.google.gerrit.extensions.restapi.AuthException; -import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.DefaultInput; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; @@ -57,8 +56,8 @@ } @Override - public Object apply(ProjectResource resource, Input input) - throws AuthException, BadRequestException, ResourceConflictException, + public Response<String> apply(ProjectResource resource, Input input) + throws AuthException, ResourceConflictException, ResourceNotFoundException, IOException { if (input == null) { input = new Input(); // Delete would set description to null. @@ -92,8 +91,8 @@ project.getDescription()); return Strings.isNullOrEmpty(project.getDescription()) - ? Response.none() - : project.getDescription(); + ? Response.<String>none() + : Response.ok(project.getDescription()); } finally { md.close(); }
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 0a96cb5..836899a2 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
@@ -15,12 +15,13 @@ package com.google.gerrit.server.project; 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> { @Override - public Object apply(ProjectResource resource, Input input) + public Response<?> apply(ProjectResource resource, Input input) throws ResourceConflictException { throw new ResourceConflictException("Project \"" + resource.getName() + "\" already exists");
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java index 930da12..8319bbd 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDashboard.java
@@ -19,11 +19,14 @@ import com.google.gerrit.extensions.restapi.DefaultInput; import com.google.gerrit.extensions.restapi.MethodNotAllowedException; import com.google.gerrit.extensions.restapi.ResourceConflictException; +import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.server.project.SetDashboard.Input; import com.google.inject.Inject; import com.google.inject.Provider; +import java.io.IOException; + class SetDashboard implements RestModifyView<DashboardResource, Input> { static class Input { @DefaultInput @@ -41,7 +44,7 @@ @Override public Object apply(DashboardResource resource, Input input) throws AuthException, BadRequestException, ResourceConflictException, - Exception { + MethodNotAllowedException, ResourceNotFoundException, IOException { if (resource.isProjectDefault()) { return defaultSetter.get().apply(resource, input); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDefaultDashboard.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDefaultDashboard.java index 3f70bc2..a323ec8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDefaultDashboard.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetDefaultDashboard.java
@@ -36,6 +36,8 @@ import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.kohsuke.args4j.Option; +import java.io.IOException; + class SetDefaultDashboard implements RestModifyView<DashboardResource, Input> { private final ProjectCache cache; private final MetaDataUpdate.Server updateFactory; @@ -57,9 +59,9 @@ } @Override - public Object apply(DashboardResource resource, Input input) + public Response<DashboardInfo> apply(DashboardResource resource, Input input) throws AuthException, BadRequestException, ResourceConflictException, - Exception { + ResourceNotFoundException, IOException { if (input == null) { input = new Input(); // Delete would set input to null. } @@ -79,6 +81,8 @@ IdString.fromUrl(input.id)); } catch (ResourceNotFoundException e) { throw new BadRequestException("dashboard " + input.id + " not found"); + } catch (ConfigInvalidException e) { + throw new ResourceConflictException(e.getMessage()); } } @@ -109,7 +113,7 @@ if (target != null) { DashboardInfo info = get.get().apply(target); info.isDefault = true; - return info; + return Response.ok(info); } return Response.none(); } finally { @@ -136,14 +140,13 @@ } @Override - public Object apply(ProjectResource resource, Input input) + public Response<DashboardInfo> apply(ProjectResource resource, Input input) throws AuthException, BadRequestException, ResourceConflictException, - Exception { + ResourceNotFoundException, IOException { SetDefaultDashboard set = setDefault.get(); set.inherited = inherited; - return Response.created(set.apply( - DashboardResource.projectDefault(resource.getControl()), - input)); + return set.apply( + DashboardResource.projectDefault(resource.getControl()), input); } } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java index 999358c..337c6f4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetParent.java
@@ -19,7 +19,6 @@ import com.google.common.base.Strings; import com.google.common.collect.Iterables; import com.google.gerrit.extensions.restapi.AuthException; -import com.google.gerrit.extensions.restapi.BadRequestException; import com.google.gerrit.extensions.restapi.DefaultInput; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; @@ -38,7 +37,7 @@ import java.io.IOException; -class SetParent implements RestModifyView<ProjectResource, Input> { +public class SetParent implements RestModifyView<ProjectResource, Input> { static class Input { @DefaultInput String parent; @@ -59,45 +58,18 @@ } @Override - public String apply(final ProjectResource rsrc, Input input) throws AuthException, - BadRequestException, ResourceConflictException, + public String apply(final ProjectResource rsrc, Input input) + throws AuthException, ResourceConflictException, ResourceNotFoundException, UnprocessableEntityException, IOException { ProjectControl ctl = rsrc.getControl(); + validateParentUpdate(ctl, input.parent); IdentifiedUser user = (IdentifiedUser) ctl.getCurrentUser(); - if (!user.getCapabilities().canAdministrateServer()) { - throw new AuthException("not administrator"); - } - - if (rsrc.getNameKey().equals(allProjects)) { - throw new ResourceConflictException("cannot set parent of " - + allProjects.get()); - } - - input.parent = Strings.emptyToNull(input.parent); - if (input.parent != null) { - ProjectState parent = cache.get(new Project.NameKey(input.parent)); - if (parent == null) { - throw new UnprocessableEntityException("parent project " + input.parent - + " not found"); - } - - if (Iterables.tryFind(parent.tree(), new Predicate<ProjectState>() { - @Override - public boolean apply(ProjectState input) { - return input.getProject().getNameKey().equals(rsrc.getNameKey()); - } - }).isPresent()) { - throw new ResourceConflictException("cycle exists between " - + rsrc.getName() + " and " + parent.getProject().getName()); - } - } - try { MetaDataUpdate md = updateFactory.create(rsrc.getNameKey()); try { ProjectConfig config = ProjectConfig.read(md); Project project = config.getProject(); - project.setParentName(input.parent); + project.setParentName(Strings.emptyToNull(input.parent)); String msg = Strings.emptyToNull(input.commitMessage); if (msg == null) { @@ -124,4 +96,39 @@ "invalid project.config: %s", e.getMessage())); } } + + public void validateParentUpdate(final ProjectControl ctl, String newParent) + throws AuthException, ResourceConflictException, + UnprocessableEntityException { + IdentifiedUser user = (IdentifiedUser) ctl.getCurrentUser(); + if (!user.getCapabilities().canAdministrateServer()) { + throw new AuthException("not administrator"); + } + + if (ctl.getProject().getNameKey().equals(allProjects)) { + throw new ResourceConflictException("cannot set parent of " + + allProjects.get()); + } + + newParent = Strings.emptyToNull(newParent); + if (newParent != null) { + ProjectState parent = cache.get(new Project.NameKey(newParent)); + if (parent == null) { + throw new UnprocessableEntityException("parent project " + newParent + + " not found"); + } + + if (Iterables.tryFind(parent.tree(), new Predicate<ProjectState>() { + @Override + public boolean apply(ProjectState input) { + return input.getProject().getNameKey() + .equals(ctl.getProject().getNameKey()); + } + }).isPresent()) { + throw new ResourceConflictException("cycle exists between " + + ctl.getProject().getName() + " and " + + parent.getProject().getName()); + } + } + } }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BasicChangeRewrites.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BasicChangeRewrites.java index f81b0ca..d1d2cae 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BasicChangeRewrites.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/BasicChangeRewrites.java
@@ -33,8 +33,8 @@ new ChangeQueryBuilder.Arguments( // new InvalidProvider<ReviewDb>(), // new InvalidProvider<ChangeQueryRewriter>(), // - null, null, null, null, null, // - null, null, null, null, null), null); + null, null, null, null, null, null, null, // + null, null, null, null, null, null, null), null); static Schema<ChangeData> schema(@Nullable IndexCollection indexes) { ChangeIndex index = indexes != null ? indexes.getSearchIndex() : null;
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 9fc3dbf..86c0d38 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
@@ -32,11 +32,13 @@ import com.google.gerrit.server.account.GroupBackends; import com.google.gerrit.server.config.AllProjectsName; import com.google.gerrit.server.git.GitRepositoryManager; +import com.google.gerrit.server.git.SubmitStrategyFactory; import com.google.gerrit.server.index.ChangeIndex; import com.google.gerrit.server.index.IndexCollection; import com.google.gerrit.server.index.Schema; import com.google.gerrit.server.patch.PatchListCache; import com.google.gerrit.server.project.ChangeControl; +import com.google.gerrit.server.project.ListChildProjects; import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.IntPredicate; import com.google.gerrit.server.query.Predicate; @@ -84,6 +86,7 @@ public static final String FIELD_CHANGE = "change"; public static final String FIELD_COMMENT = "comment"; public static final String FIELD_COMMIT = "commit"; + public static final String FIELD_CONFLICTS = "conflicts"; public static final String FIELD_DRAFTBY = "draftby"; public static final String FIELD_FILE = "file"; public static final String FIELD_IS = "is"; @@ -93,6 +96,7 @@ public static final String FIELD_MESSAGE = "message"; public static final String FIELD_OWNER = "owner"; public static final String FIELD_OWNERIN = "ownerin"; + public static final String FIELD_PARENTPROJECT = "parentproject"; public static final String FIELD_PROJECT = "project"; public static final String FIELD_REF = "ref"; public static final String FIELD_REVIEWER = "reviewer"; @@ -139,6 +143,7 @@ final Provider<ReviewDb> dbProvider; final Provider<ChangeQueryRewriter> rewriter; final IdentifiedUser.GenericFactory userFactory; + final Provider<CurrentUser> self; final CapabilityControl.Factory capabilityControlFactory; final ChangeControl.GenericFactory changeControlGenericFactory; final AccountResolver accountResolver; @@ -147,13 +152,17 @@ final PatchListCache patchListCache; final GitRepositoryManager repoManager; final ProjectCache projectCache; + final Provider<ListChildProjects> listChildProjects; final IndexCollection indexes; + final SubmitStrategyFactory submitStrategyFactory; + final ConflictsCache conflictsCache; @Inject @VisibleForTesting public Arguments(Provider<ReviewDb> dbProvider, Provider<ChangeQueryRewriter> rewriter, IdentifiedUser.GenericFactory userFactory, + Provider<CurrentUser> self, CapabilityControl.Factory capabilityControlFactory, ChangeControl.GenericFactory changeControlGenericFactory, AccountResolver accountResolver, @@ -162,10 +171,14 @@ PatchListCache patchListCache, GitRepositoryManager repoManager, ProjectCache projectCache, - IndexCollection indexes) { + Provider<ListChildProjects> listChildProjects, + IndexCollection indexes, + SubmitStrategyFactory submitStrategyFactory, + ConflictsCache conflictsCache) { this.dbProvider = dbProvider; this.rewriter = rewriter; this.userFactory = userFactory; + this.self = self; this.capabilityControlFactory = capabilityControlFactory; this.changeControlGenericFactory = changeControlGenericFactory; this.accountResolver = accountResolver; @@ -174,7 +187,10 @@ this.patchListCache = patchListCache; this.repoManager = repoManager; this.projectCache = projectCache; + this.listChildProjects = listChildProjects; this.indexes = indexes; + this.submitStrategyFactory = submitStrategyFactory; + this.conflictsCache = conflictsCache; } } @@ -218,10 +234,7 @@ .parse(query)); } else if (PAT_CHANGE_ID.matcher(query).matches()) { - if (query.charAt(0) == 'i') { - query = "I" + query.substring(1); - } - return new ChangeIdPredicate(args.dbProvider, query); + return new ChangeIdPredicate(args.dbProvider, parseChangeId(query)); } throw new IllegalArgumentException(); @@ -308,6 +321,16 @@ } @Operator + public Predicate<ChangeData> conflicts(String value) throws OrmException, + QueryParseException { + requireIndex(FIELD_CONFLICTS, value); + return new ConflictsPredicate(args.dbProvider, args.patchListCache, + args.submitStrategyFactory, args.changeControlGenericFactory, + args.userFactory, args.repoManager, args.projectCache, + args.conflictsCache, value, parseChange(value)); + } + + @Operator public Predicate<ChangeData> project(String name) { if (name.startsWith("^")) return new RegexProjectPredicate(args.dbProvider, name); @@ -315,6 +338,12 @@ } @Operator + public Predicate<ChangeData> parentproject(String name) { + return new ParentProjectPredicate(args.dbProvider, args.projectCache, + args.listChildProjects, args.self, name); + } + + @Operator public Predicate<ChangeData> branch(String name) { if (name.startsWith("^")) return ref("^" + branchToRef(name.substring(1))); @@ -665,6 +694,31 @@ return g; } + private List<Change> parseChange(String value) throws OrmException, + QueryParseException { + if (PAT_LEGACY_ID.matcher(value).matches()) { + return Collections.singletonList(args.dbProvider.get().changes() + .get(Change.Id.parse(value))); + } else if (PAT_CHANGE_ID.matcher(value).matches()) { + Change.Key a = new Change.Key(parseChangeId(value)); + List<Change> changes = + args.dbProvider.get().changes().byKeyRange(a, a.max()).toList(); + if (changes.isEmpty()) { + throw error("Change " + value + " not found"); + } + return changes; + } + + throw error("Change " + value + " not found"); + } + + private static String parseChangeId(String value) { + if (value.charAt(0) == 'i') { + value = "I" + value.substring(1); + } + return value; + } + private Account.Id self() { if (currentUser.isIdentifiedUser()) { return ((IdentifiedUser) currentUser).getAccountId();
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 new file mode 100644 index 0000000..e177e37 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictKey.java
@@ -0,0 +1,78 @@ +// 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.query.change; + +import com.google.common.base.Objects; +import com.google.gerrit.reviewdb.client.Project.SubmitType; + +import org.eclipse.jgit.lib.ObjectId; + +import java.io.Serializable; + +public class ConflictKey implements Serializable { + private static final long serialVersionUID = 1L; + + private final ObjectId commit; + private final ObjectId otherCommit; + private final SubmitType submitType; + private final boolean contentMerge; + + public ConflictKey(ObjectId commit, ObjectId otherCommit, + SubmitType submitType, boolean contentMerge) { + if (SubmitType.FAST_FORWARD_ONLY.equals(submitType) + || commit.compareTo(otherCommit) < 0) { + this.commit = commit; + this.otherCommit = otherCommit; + } else { + this.commit = otherCommit; + this.otherCommit = commit; + } + this.submitType = submitType; + this.contentMerge = contentMerge; + } + + public ObjectId getCommit() { + return commit; + } + + public ObjectId getOtherCommit() { + return otherCommit; + } + + public SubmitType getSubmitType() { + return submitType; + } + + public boolean isContentMerge() { + return contentMerge; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof ConflictKey)) { + return false; + } + ConflictKey other = (ConflictKey)o; + return commit.equals(other.commit) + && otherCommit.equals(other.otherCommit) + && submitType.equals(other.submitType) + && contentMerge == other.contentMerge; + } + + @Override + public int hashCode() { + return Objects.hashCode(commit, otherCommit, submitType, contentMerge); + } +}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCache.java similarity index 63% copy from gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java copy to gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCache.java index a5371d2..bf7a5dd 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/ReviewInput.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCache.java
@@ -12,19 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.gerrit.acceptance.rest.change; +package com.google.gerrit.server.query.change; -import com.google.common.collect.Maps; +import com.google.gerrit.common.Nullable; -import java.util.Map; +public interface ConflictsCache { -public class ReviewInput { - Map<String, Integer> labels; + public void put(ConflictKey key, Boolean value); - public static ReviewInput approve() { - ReviewInput in = new ReviewInput(); - in.labels = Maps.newHashMap(); - in.labels.put("Code-Review", 2); - return in; - } + @Nullable + public Boolean getIfPresent(ConflictKey key); }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java new file mode 100644 index 0000000..1b3473e --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsCacheImpl.java
@@ -0,0 +1,56 @@ +// 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.query.change; + +import com.google.common.cache.Cache; +import com.google.gerrit.server.cache.CacheModule; +import com.google.inject.Inject; +import com.google.inject.Module; +import com.google.inject.Singleton; +import com.google.inject.name.Named; + +@Singleton +public class ConflictsCacheImpl implements ConflictsCache { + public final static String NAME = "conflicts"; + + public static Module module() { + return new CacheModule() { + @Override + protected void configure() { + persist(NAME, ConflictKey.class, Boolean.class) + .maximumWeight(37400); + bind(ConflictsCache.class).to(ConflictsCacheImpl.class); + } + }; + } + + private final Cache<ConflictKey, Boolean> conflictsCache; + + @Inject + public ConflictsCacheImpl( + @Named(NAME) Cache<ConflictKey, Boolean> conflictsCache) { + this.conflictsCache = conflictsCache; + } + + @Override + public void put(ConflictKey key, Boolean value) { + conflictsCache.put(key, value); + } + + @Override + public Boolean getIfPresent(ConflictKey key) { + return conflictsCache.getIfPresent(key); + } +}
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 new file mode 100644 index 0000000..cd94930 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ConflictsPredicate.java
@@ -0,0 +1,268 @@ +// 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.query.change; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.google.gerrit.common.data.SubmitTypeRecord; +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.IdentifiedUser; +import com.google.gerrit.server.git.CodeReviewCommit; +import com.google.gerrit.server.git.GitRepositoryManager; +import com.google.gerrit.server.git.MergeException; +import com.google.gerrit.server.git.SubmitStrategy; +import com.google.gerrit.server.git.SubmitStrategyFactory; +import com.google.gerrit.server.patch.PatchListCache; +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.ProjectCache; +import com.google.gerrit.server.project.ProjectState; +import com.google.gerrit.server.query.OperatorPredicate; +import com.google.gerrit.server.query.OrPredicate; +import com.google.gerrit.server.query.Predicate; +import com.google.gwtorm.server.OrmException; +import com.google.inject.Provider; + +import org.eclipse.jgit.errors.IncorrectObjectTypeException; +import org.eclipse.jgit.lib.AnyObjectId; +import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevFlag; +import org.eclipse.jgit.revwalk.RevWalk; + +import java.io.IOException; +import java.util.List; +import java.util.Set; + +class ConflictsPredicate extends OrPredicate<ChangeData> { + private final String value; + + ConflictsPredicate(Provider<ReviewDb> db, PatchListCache plc, + SubmitStrategyFactory submitStrategyFactory, + ChangeControl.GenericFactory changeControlFactory, + IdentifiedUser.GenericFactory identifiedUserFactory, + GitRepositoryManager repoManager, ProjectCache projectCache, + ConflictsCache conflictsCache, String value, List<Change> changes) + throws OrmException { + super(predicates(db, plc, submitStrategyFactory, changeControlFactory, + identifiedUserFactory, repoManager, projectCache, conflictsCache, + value, changes)); + this.value = value; + } + + private static List<Predicate<ChangeData>> predicates( + final Provider<ReviewDb> db, final PatchListCache plc, + final SubmitStrategyFactory submitStrategyFactory, + final ChangeControl.GenericFactory changeControlFactory, + final IdentifiedUser.GenericFactory identifiedUserFactory, + final GitRepositoryManager repoManager, final ProjectCache projectCache, + final ConflictsCache conflictsCache, final String value, + List<Change> changes) throws OrmException { + List<Predicate<ChangeData>> changePredicates = + Lists.newArrayListWithCapacity(changes.size()); + for (final Change c : changes) { + final ChangeDataCache changeDataCache = new ChangeDataCache(c, db, projectCache); + List<String> files = new ChangeData(c).currentFilePaths(db, plc); + List<Predicate<ChangeData>> filePredicates = + Lists.newArrayListWithCapacity(files.size()); + for (String file : files) { + filePredicates.add(new EqualsFilePredicate(db, plc, file)); + } + + List<Predicate<ChangeData>> predicatesForOneChange = + Lists.newArrayListWithCapacity(5); + predicatesForOneChange.add( + not(new LegacyChangeIdPredicate(db, c.getId()))); + predicatesForOneChange.add( + new ProjectPredicate(db, c.getProject().get())); + predicatesForOneChange.add( + new RefPredicate(db, c.getDest().get())); + predicatesForOneChange.add(or(filePredicates)); + predicatesForOneChange.add(new OperatorPredicate<ChangeData>( + ChangeQueryBuilder.FIELD_CONFLICTS, value) { + + @Override + public boolean match(ChangeData object) throws OrmException { + Change otherChange = object.change(db); + if (otherChange == null) { + return false; + } + if (!otherChange.getDest().equals(c.getDest())) { + return false; + } + SubmitType submitType = getSubmitType(otherChange, object); + if (submitType == null) { + return false; + } + ObjectId other = ObjectId.fromString( + object.currentPatchSet(db).getRevision().get()); + ConflictKey conflictsKey = + new ConflictKey(changeDataCache.getTestAgainst(), other, submitType, + changeDataCache.getProjectState().isUseContentMerge()); + Boolean conflicts = conflictsCache.getIfPresent(conflictsKey); + if (conflicts != null) { + return conflicts; + } + try { + Repository repo = + repoManager.openRepository(otherChange.getProject()); + try { + RevWalk rw = new RevWalk(repo) { + @Override + protected RevCommit createCommit(AnyObjectId id) { + return new CodeReviewCommit(id); + } + }; + try { + RevFlag canMergeFlag = rw.newFlag("CAN_MERGE"); + CodeReviewCommit commit = + (CodeReviewCommit) rw.parseCommit(changeDataCache.getTestAgainst()); + SubmitStrategy strategy = + submitStrategyFactory.create(submitType, + db.get(), repo, rw, null, canMergeFlag, + getAlreadyAccepted(repo, rw, commit), + otherChange.getDest()); + CodeReviewCommit otherCommit = + (CodeReviewCommit) rw.parseCommit(other); + otherCommit.add(canMergeFlag); + conflicts = !strategy.dryRun(commit, otherCommit); + conflictsCache.put(conflictsKey, conflicts); + return conflicts; + } catch (MergeException e) { + throw new IllegalStateException(e); + } catch (NoSuchProjectException e) { + throw new IllegalStateException(e); + } finally { + rw.release(); + } + } finally { + repo.close(); + } + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + @Override + public int getCost() { + return 5; + } + + private SubmitType getSubmitType(Change change, ChangeData cd) throws OrmException { + try { + final SubmitTypeRecord r = + changeControlFactory.controlFor(change, + identifiedUserFactory.create(change.getOwner())) + .getSubmitTypeRecord(db.get(), cd.currentPatchSet(db), cd); + if (r.status != SubmitTypeRecord.Status.OK) { + return null; + } + return r.type; + } catch (NoSuchChangeException e) { + return null; + } + } + + private Set<RevCommit> getAlreadyAccepted(Repository repo, RevWalk rw, + CodeReviewCommit tip) throws MergeException { + Set<RevCommit> alreadyAccepted = Sets.newHashSet(); + + if (tip != null) { + alreadyAccepted.add(tip); + } + + try { + for (ObjectId id : changeDataCache.getAlreadyAccepted(repo)) { + try { + alreadyAccepted.add(rw.parseCommit(id)); + } catch (IncorrectObjectTypeException iote) { + // Not a commit? Skip over it. + } + } + } catch (IOException e) { + throw new MergeException( + "Failed to determine already accepted commits.", e); + } + + return alreadyAccepted; + } + }); + changePredicates.add(and(predicatesForOneChange)); + } + return changePredicates; + } + + @Override + public String toString() { + return ChangeQueryBuilder.FIELD_CONFLICTS + ":" + value; + } + + private static class ChangeDataCache { + private final Change change; + private final Provider<ReviewDb> db; + private final ProjectCache projectCache; + + private ObjectId testAgainst; + private ProjectState projectState; + private Set<ObjectId> alreadyAccepted; + + ChangeDataCache(Change change, Provider<ReviewDb> db, ProjectCache projectCache) { + this.change = change; + this.db = db; + this.projectCache = projectCache; + } + + ObjectId getTestAgainst() + throws OrmException { + if (testAgainst == null) { + testAgainst = ObjectId.fromString( + new ChangeData(change).currentPatchSet(db).getRevision().get()); + } + return testAgainst; + } + + ProjectState getProjectState() { + if (projectState == null) { + projectState = projectCache.get(change.getProject()); + if (projectState == null) { + throw new IllegalStateException( + new NoSuchProjectException(change.getProject())); + } + } + return projectState; + } + + Set<ObjectId> getAlreadyAccepted(Repository repo) { + if (alreadyAccepted == null) { + alreadyAccepted = Sets.newHashSet(); + for (Ref r : repo.getAllRefs().values()) { + if (r.getName().startsWith(Constants.R_HEADS) + || r.getName().startsWith(Constants.R_TAGS)) { + if (r.getObjectId() != null) { + alreadyAccepted.add(r.getObjectId()); + } + } + } + } + return alreadyAccepted; + } + } +}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsVisibleToPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsVisibleToPredicate.java index 8992318..27b4994 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsVisibleToPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/IsVisibleToPredicate.java
@@ -30,7 +30,7 @@ return ((IdentifiedUser) user).getAccountId().toString(); } if (user instanceof SingleGroupUser) { - return "group:" + ((SingleGroupUser) user).getEffectiveGroups().getKnownGroups() // + return "group:" + user.getEffectiveGroups().getKnownGroups() // .iterator().next().toString(); } return user.toString();
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 new file mode 100644 index 0000000..2f63f5e --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ParentProjectPredicate.java
@@ -0,0 +1,67 @@ +// 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.query.change; + +import com.google.common.collect.Lists; +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; +import com.google.gerrit.server.query.Predicate; +import com.google.inject.Provider; + +import java.util.Collections; +import java.util.List; + +class ParentProjectPredicate extends OrPredicate<ChangeData> { + private final String value; + + ParentProjectPredicate(Provider<ReviewDb> dbProvider, + ProjectCache projectCache, Provider<ListChildProjects> listChildProjects, + Provider<CurrentUser> self, String value) { + super(predicates(dbProvider, projectCache, listChildProjects, self, value)); + this.value = value; + } + + private static List<Predicate<ChangeData>> predicates( + Provider<ReviewDb> dbProvider, ProjectCache projectCache, + Provider<ListChildProjects> listChildProjects, + Provider<CurrentUser> self, String value) { + ProjectState projectState = projectCache.get(new Project.NameKey(value)); + if (projectState == null) { + return Collections.emptyList(); + } + + List<Predicate<ChangeData>> r = Lists.newArrayList(); + r.add(new ProjectPredicate(dbProvider, projectState.getProject().getName())); + ListChildProjects children = listChildProjects.get(); + children.setRecursive(true); + for (ProjectInfo p : children.apply(new ProjectResource( + projectState.controlFor(self.get())))) { + r.add(new ProjectPredicate(dbProvider, p.name)); + } + return r; + } + + @Override + public String toString() { + return ChangeQueryBuilder.FIELD_PARENTPROJECT + ":" + value; + } +}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java index 4b6a5a6..6ba9e6d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/QueryChanges.java
@@ -45,7 +45,7 @@ private boolean reverse; private EnumSet<ListChangesOption> options; - @Option(name = "--query", aliases = {"-q"}, metaVar = "QUERY", multiValued = true, usage = "Query string") + @Option(name = "--query", aliases = {"-q"}, metaVar = "QUERY", usage = "Query string") private List<String> queries; @Option(name = "--limit", aliases = {"-n"}, metaVar = "CNT", usage = "Maximum number of results to return") @@ -53,7 +53,7 @@ imp.setLimit(limit); } - @Option(name = "-o", multiValued = true, usage = "Output options per change") + @Option(name = "-o", usage = "Output options per change") public void addOption(ListChangesOption o) { options.add(o); }
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 2f3fe54..f6fb4c5 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
@@ -86,7 +86,7 @@ }; public static enum OutputFormat { - TEXT, JSON; + TEXT, JSON } private final Gson gson = new Gson(); @@ -114,6 +114,7 @@ private boolean includeCommitMessage; private boolean includeDependencies; private boolean includeSubmitRecords; + private boolean includeAllReviewers; private OutputStream outputStream = DisabledOutputStream.INSTANCE; private PrintWriter out; @@ -202,6 +203,10 @@ includeSubmitRecords = on; } + public void setIncludeAllReviewers(boolean on) { + includeAllReviewers = on; + } + public void setOutput(OutputStream out, OutputFormat fmt) { this.outputStream = out; this.outputFormat = fmt; @@ -309,6 +314,10 @@ eventFactory.extend(c, d.getChange()); eventFactory.addTrackingIds(c, d.trackingIds(db)); + if (includeAllReviewers) { + eventFactory.addAllReviewers(c, d.getChange()); + } + if (includeSubmitRecords) { PatchSet.Id psId = d.getChange().currentPatchSetId(); PatchSet patchSet = db.get().patchSets().get(psId);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java index c96ed42..a6e3488 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java
@@ -84,7 +84,7 @@ } public static enum Context { - SINGLE_USER, MULTI_USER; + SINGLE_USER, MULTI_USER } private DataSource open(final SitePaths site, final Config cfg,
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 254a780..12c80f4 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
@@ -37,7 +37,7 @@ static final ScriptRunner NOOP = new ScriptRunner(null, null) { void run(final ReviewDb db) { - }; + } }; ScriptRunner(final String scriptName, final InputStream script) {
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 dd874b2..a2b0ad1 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
@@ -140,7 +140,7 @@ /** A file served out of the tools root directory. */ public static class Entry { public static enum Type { - DIR, FILE; + DIR, FILE } private final Type type;
diff --git a/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java b/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java index 0d0ab1a..07e278a 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/rules/GerritCommonTest.java
@@ -29,6 +29,8 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.Project; import com.google.inject.AbstractModule; +import org.junit.Before; +import org.junit.Test; import java.util.Arrays; @@ -46,9 +48,8 @@ private ProjectConfig local; private Util util; - @Override + @Before public void setUp() throws Exception { - super.setUp(); util = new Util(); load("gerrit", "gerrit_common_test.pl", new AbstractModule() { @Override @@ -86,6 +87,7 @@ env.set(StoredValues.CHANGE_CONTROL, util.user(local).controlFor(change)); } + @Test public void testGerritCommon() { runPrologBasedTests(); }
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 df39003..19edaf4 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
@@ -29,8 +29,6 @@ import com.googlecode.prolog_cafe.lang.Term; import com.googlecode.prolog_cafe.lang.VariableTerm; -import junit.framework.TestCase; - import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; @@ -41,9 +39,13 @@ import java.util.Arrays; import java.util.List; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + /** Base class for any tests written in Prolog. */ -public abstract class PrologTestCase extends TestCase { +public abstract class PrologTestCase { private static final SymbolTerm test_1 = SymbolTerm.intern("test", 1); private String pkg;
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/StringUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/StringUtilTest.java index 24f3386..0bbec8a 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/StringUtilTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/StringUtilTest.java
@@ -14,13 +14,16 @@ package com.google.gerrit.server; -import junit.framework.TestCase; +import org.junit.Test; -public class StringUtilTest extends TestCase { +import static org.junit.Assert.assertEquals; + +public class StringUtilTest { /** * Test the boundary condition that the first character of a string * should be escaped. */ + @Test public void testEscapeFirstChar() { assertEquals(StringUtil.escapeString("\tLeading tab"), "\\tLeading tab"); } @@ -29,6 +32,7 @@ * Test the boundary condition that the last character of a string * should be escaped. */ + @Test public void testEscapeLastChar() { assertEquals(StringUtil.escapeString("Trailing tab\t"), "Trailing tab\\t"); } @@ -37,6 +41,7 @@ * Test that various forms of input strings are escaped (or left as-is) * in the expected way. */ + @Test public void testEscapeString() { final String[] testPairs = { "", "",
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 18b3c98..d15210d 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
@@ -18,6 +18,9 @@ import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.replay; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; import com.google.common.base.Objects; import com.google.common.collect.ImmutableMap; @@ -46,9 +49,9 @@ import com.google.inject.Injector; import com.google.inject.TypeLiteral; -import junit.framework.TestCase; - import org.easymock.IAnswer; +import org.junit.Before; +import org.junit.Test; import java.sql.Timestamp; import java.util.ArrayList; @@ -56,7 +59,7 @@ import java.util.List; import java.util.Map; -public class CommentsTest extends TestCase { +public class CommentsTest { private Injector injector; private RevisionResource revRes1; @@ -65,8 +68,8 @@ private PatchLineComment plc2; private PatchLineComment plc3; - @Override - protected void setUp() throws Exception { + @Before + public void setUp() throws Exception { @SuppressWarnings("unchecked") final DynamicMap<RestView<CommentResource>> views = createMock(DynamicMap.class); @@ -130,6 +133,7 @@ injector = Guice.createInjector(mod); } + @Test public void testListComments() throws Exception { // test ListComments for patch set 1 assertListComments(injector, revRes1, ImmutableMap.of( @@ -140,6 +144,7 @@ Collections.<String, ArrayList<PatchLineComment>>emptyMap()); } + @Test public void testGetComment() throws Exception { // test GetComment for existing comment assertGetComment(injector, revRes1, plc1, plc1.getKey().get()); @@ -186,9 +191,9 @@ assertNotNull(actual); assertEquals(expected.size(), actual.size()); assertEquals(expected.keySet(), actual.keySet()); - for (String filename : expected.keySet()) { - List<PatchLineComment> expectedComments = expected.get(filename); - List<CommentInfo> actualComments = actual.get(filename); + for (Map.Entry<String, ArrayList<PatchLineComment>> entry : expected.entrySet()) { + List<PatchLineComment> expectedComments = entry.getValue(); + List<CommentInfo> actualComments = actual.get(entry.getKey()); assertNotNull(actualComments); assertEquals(expectedComments.size(), actualComments.size()); for (int i = 0; i < expectedComments.size(); i++) {
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/ConfigUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/ConfigUtilTest.java index 5d72916..cc19811 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/config/ConfigUtilTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/config/ConfigUtilTest.java
@@ -14,17 +14,19 @@ package com.google.gerrit.server.config; +import org.junit.Test; + import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; - -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; import java.util.concurrent.TimeUnit; -public class ConfigUtilTest extends TestCase { +public class ConfigUtilTest { + @Test public void testTimeUnit() { assertEquals(ms(0, MILLISECONDS), parse("0")); assertEquals(ms(2, MILLISECONDS), parse("2ms"));
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java index 0087df6..5fdecf0 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/config/SitePathsTest.java
@@ -14,15 +14,23 @@ package com.google.gerrit.server.config; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + import com.google.gerrit.server.util.HostPlatform; -import junit.framework.TestCase; +import org.junit.Test; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; -public class SitePathsTest extends TestCase { +public class SitePathsTest { + @Test public void testCreate_NotExisting() throws IOException { final File root = random(); final SitePaths site = new SitePaths(root); @@ -31,6 +39,7 @@ assertEquals(new File(root, "etc"), site.etc_dir); } + @Test public void testCreate_Empty() throws IOException { final File root = random(); try { @@ -44,6 +53,7 @@ } } + @Test public void testCreate_NonEmpty() throws IOException { final File root = random(); final File txt = new File(root, "test.txt"); @@ -60,6 +70,7 @@ } } + @Test public void testCreate_NotDirectory() throws IOException { final File root = random(); try { @@ -75,6 +86,7 @@ } } + @Test public void testResolve() throws IOException { final File root = random(); final SitePaths site = new SitePaths(root);
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 63e62a0..c94186c 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
@@ -26,7 +26,7 @@ new FakeQueryBuilder.Definition<ChangeData, FakeQueryBuilder>( FakeQueryBuilder.class), new ChangeQueryBuilder.Arguments(null, null, null, null, null, null, - null, null, null, null, null, indexes), + null, null, null, null, null, null, null, indexes, null, null), null); }
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/IndexRewriteTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/IndexRewriteTest.java index d9016e9..f9eb18f 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/index/IndexRewriteTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/IndexRewriteTest.java
@@ -19,6 +19,9 @@ import static com.google.gerrit.reviewdb.client.Change.Status.MERGED; import static com.google.gerrit.reviewdb.client.Change.Status.NEW; import static com.google.gerrit.reviewdb.client.Change.Status.SUBMITTED; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; import com.google.common.collect.ImmutableList; import com.google.gerrit.reviewdb.client.Change; @@ -31,22 +34,21 @@ import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.OrSource; import com.google.gerrit.server.query.change.SqlRewriterImpl; - -import junit.framework.TestCase; +import org.junit.Before; +import org.junit.Test; import java.util.EnumSet; import java.util.Set; @SuppressWarnings("unchecked") -public class IndexRewriteTest extends TestCase { +public class IndexRewriteTest { private FakeIndex index; private IndexCollection indexes; private ChangeQueryBuilder queryBuilder; private IndexRewriteImpl rewrite; - @Override + @Before public void setUp() throws Exception { - super.setUp(); index = new FakeIndex(FakeIndex.V2); indexes = new IndexCollection(); indexes.setSearchIndex(index); @@ -58,26 +60,31 @@ new SqlRewriterImpl(null)); } + @Test public void testIndexPredicate() throws Exception { Predicate<ChangeData> in = parse("file:a"); assertEquals(query(in), rewrite(in)); } + @Test public void testNonIndexPredicate() throws Exception { Predicate<ChangeData> in = parse("foo:a"); assertSame(in, rewrite(in)); } + @Test public void testIndexPredicates() throws Exception { Predicate<ChangeData> in = parse("file:a file:b"); assertEquals(query(in), rewrite(in)); } + @Test public void testNonIndexPredicates() throws Exception { Predicate<ChangeData> in = parse("foo:a OR foo:b"); assertEquals(in, rewrite(in)); } + @Test public void testOneIndexPredicate() throws Exception { Predicate<ChangeData> in = parse("foo:a file:b"); Predicate<ChangeData> out = rewrite(in); @@ -87,6 +94,7 @@ out.getChildren()); } + @Test public void testThreeLevelTreeWithAllIndexPredicates() throws Exception { Predicate<ChangeData> in = parse("-status:abandoned (status:open OR status:merged)"); @@ -95,6 +103,7 @@ rewrite.rewrite(in)); } + @Test public void testThreeLevelTreeWithSomeIndexPredicates() throws Exception { Predicate<ChangeData> in = parse("-foo:a (file:b OR file:c)"); Predicate<ChangeData> out = rewrite(in); @@ -104,6 +113,7 @@ out.getChildren()); } + @Test public void testMultipleIndexPredicates() throws Exception { Predicate<ChangeData> in = parse("file:a OR foo:b OR file:c OR foo:d"); @@ -115,6 +125,7 @@ out.getChildren()); } + @Test public void testIndexAndNonIndexPredicates() throws Exception { Predicate<ChangeData> in = parse("status:new bar:p file:a"); Predicate<ChangeData> out = rewrite(in); @@ -125,6 +136,7 @@ out.getChildren()); } + @Test public void testDuplicateCompoundNonIndexOnlyPredicates() throws Exception { Predicate<ChangeData> in = parse("(status:new OR status:draft) bar:p file:a"); @@ -136,6 +148,7 @@ out.getChildren()); } + @Test public void testDuplicateCompoundIndexOnlyPredicates() throws Exception { Predicate<ChangeData> in = parse("(status:new OR file:a) bar:p file:b"); @@ -147,6 +160,7 @@ out.getChildren()); } + @Test public void testLimit() throws Exception { Predicate<ChangeData> in = parse("file:a limit:3"); Predicate<ChangeData> out = rewrite(in); @@ -157,6 +171,7 @@ out.getChildren()); } + @Test public void testGetPossibleStatus() throws Exception { assertEquals(EnumSet.allOf(Change.Status.class), status("file:a")); assertEquals(EnumSet.of(NEW), status("is:new")); @@ -173,6 +188,7 @@ status("(is:new is:draft) OR (is:merged OR is:submitted)")); } + @Test public void testUnsupportedIndexOperator() throws Exception { Predicate<ChangeData> in = parse("status:merged file:a"); assertEquals(query(in), rewrite(in)); @@ -186,6 +202,7 @@ out.getChildren()); } + @Test public void testNoChangeIndexUsesSqlRewrites() throws Exception { Predicate<ChangeData> in = parse("status:open project:p ref:b"); Predicate<ChangeData> out;
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/IndexedChangeQueryTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/IndexedChangeQueryTest.java index 81518f5..3d21902 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/index/IndexedChangeQueryTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/IndexedChangeQueryTest.java
@@ -15,32 +15,35 @@ package com.google.gerrit.server.index; import static com.google.gerrit.server.index.IndexedChangeQuery.replaceSortKeyPredicates; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; import com.google.gerrit.server.query.Predicate; import com.google.gerrit.server.query.QueryParseException; import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeQueryBuilder; +import org.junit.Before; +import org.junit.Test; -import junit.framework.TestCase; - -public class IndexedChangeQueryTest extends TestCase { +public class IndexedChangeQueryTest { private FakeIndex index; private ChangeQueryBuilder queryBuilder; - @Override + @Before public void setUp() throws Exception { - super.setUp(); index = new FakeIndex(FakeIndex.V2); IndexCollection indexes = new IndexCollection(); indexes.setSearchIndex(index); queryBuilder = new FakeQueryBuilder(indexes); } + @Test public void testReplaceSortKeyPredicate_NoSortKey() throws Exception { Predicate<ChangeData> p = parse("foo:a bar:b OR (foo:b bar:a)"); assertSame(p, replaceSortKeyPredicates(p, "1234")); } + @Test public void testReplaceSortKeyPredicate_TopLevelSortKey() throws Exception { Predicate<ChangeData> p; p = parse("foo:a bar:b sortkey_before:1234 OR (foo:b bar:a)"); @@ -51,6 +54,7 @@ replaceSortKeyPredicates(p, "5678")); } + @Test public void testReplaceSortKeyPredicate_NestedSortKey() throws Exception { Predicate<ChangeData> p; p = parse("foo:a bar:b OR (foo:b bar:a AND sortkey_before:1234)");
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/BasicSerializationTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/BasicSerializationTest.java index 9b6b0df..622b31e 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/BasicSerializationTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/BasicSerializationTest.java
@@ -14,27 +14,31 @@ package com.google.gerrit.server.ioutil; +import org.junit.Test; + import static com.google.gerrit.server.ioutil.BasicSerialization.readFixInt64; import static com.google.gerrit.server.ioutil.BasicSerialization.readString; import static com.google.gerrit.server.ioutil.BasicSerialization.readVarInt32; import static com.google.gerrit.server.ioutil.BasicSerialization.writeFixInt64; import static com.google.gerrit.server.ioutil.BasicSerialization.writeString; import static com.google.gerrit.server.ioutil.BasicSerialization.writeVarInt32; - -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -public class BasicSerializationTest extends TestCase { +public class BasicSerializationTest { + @Test public void testReadVarInt32() throws IOException { assertEquals(0x00000000, readVarInt32(r(b(0)))); assertEquals(0x00000003, readVarInt32(r(b(3)))); assertEquals(0x000000ff, readVarInt32(r(b(0x80 | 0x7f, 0x01)))); } + @Test public void testWriteVarInt32() throws IOException { ByteArrayOutputStream out; @@ -51,6 +55,7 @@ assertOutput(b(0x80 | 0x7f, 0x01), out); } + @Test public void testReadFixInt64() throws IOException { assertEquals(0L, readFixInt64(r(b(0, 0, 0, 0, 0, 0, 0, 0)))); assertEquals(3L, readFixInt64(r(b(0, 0, 0, 0, 0, 0, 0, 3)))); @@ -71,6 +76,7 @@ 0xff, 0xff, 0xff, 0xff)))); } + @Test public void testWriteFixInt64() throws IOException { ByteArrayOutputStream out; @@ -99,6 +105,7 @@ assertOutput(b(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff), out); } + @Test public void testReadString() throws IOException { assertNull(readString(r(b(0)))); assertEquals("a", readString(r(b(1, 'a')))); @@ -106,6 +113,7 @@ readString(r(b(7, 'c', 'o', 'f', 'f', 'e', 'e', '4')))); } + @Test public void testWriteString() throws IOException { ByteArrayOutputStream out;
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/ColumnFormatterTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/ColumnFormatterTest.java index 3b4005c..02d0582 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/ColumnFormatterTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/ioutil/ColumnFormatterTest.java
@@ -14,12 +14,13 @@ package com.google.gerrit.server.ioutil; -import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; import java.io.PrintWriter; import java.io.StringWriter; -public class ColumnFormatterTest extends TestCase { +public class ColumnFormatterTest { /** * Holds an in-memory {@link java.io.PrintWriter} object and allows * comparisons of its contents to a supplied string via an assert statement. @@ -35,7 +36,7 @@ public void assertEquals(String str) { printWriter.flush(); - TestCase.assertEquals(stringWriter.toString(), str); + Assert.assertEquals(stringWriter.toString(), str); } public PrintWriter getPrintWriter() { @@ -46,6 +47,7 @@ /** * Test that only lines with at least one column of text emit output. */ + @Test public void testEmptyLine() { final PrintWriterComparator comparator = new PrintWriterComparator(); final ColumnFormatter formatter = @@ -64,6 +66,7 @@ /** * Test that there is no output if no columns are ever added. */ + @Test public void testEmptyOutput() { final PrintWriterComparator comparator = new PrintWriterComparator(); final ColumnFormatter formatter = @@ -78,6 +81,7 @@ * Test that there is no output (nor any exceptions) if we finalize * the output immediately after the creation of the {@link ColumnFormatter}. */ + @Test public void testNoNextLine() { final PrintWriterComparator comparator = new PrintWriterComparator(); final ColumnFormatter formatter = @@ -90,6 +94,7 @@ * Test that the text in added columns is escaped while the column separator * (which of course shouldn't be escaped) is left alone. */ + @Test public void testEscapingTakesPlace() { final PrintWriterComparator comparator = new PrintWriterComparator(); final ColumnFormatter formatter = @@ -106,6 +111,7 @@ * Test that we get the correct output with multi-line input where the number * of columns in each line varies. */ + @Test public void testMultiLineDifferentColumnCount() { final PrintWriterComparator comparator = new PrintWriterComparator(); final ColumnFormatter formatter = @@ -124,6 +130,7 @@ /** * Test that we get the correct output with a single column of input. */ + @Test public void testOneColumn() { final PrintWriterComparator comparator = new PrintWriterComparator(); final ColumnFormatter formatter =
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java index fbbd72b..02ebf51 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/AddressTest.java
@@ -14,53 +14,65 @@ package com.google.gerrit.server.mail; -import junit.framework.TestCase; +import org.junit.Test; import java.io.UnsupportedEncodingException; -public class AddressTest extends TestCase { +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; + +public class AddressTest { + @Test public void testParse_NameEmail1() { final Address a = Address.parse("A U Thor <author@example.com>"); assertEquals("A U Thor", a.name); assertEquals("author@example.com", a.email); } + @Test public void testParse_NameEmail2() { final Address a = Address.parse("A <a@b>"); assertEquals("A", a.name); assertEquals("a@b", a.email); } + @Test public void testParse_NameEmail3() { final Address a = Address.parse("<a@b>"); assertNull(a.name); assertEquals("a@b", a.email); } + @Test public void testParse_NameEmail4() { final Address a = Address.parse("A U Thor<author@example.com>"); assertEquals("A U Thor", a.name); assertEquals("author@example.com", a.email); } + @Test public void testParse_NameEmail5() { final Address a = Address.parse("A U Thor <author@example.com>"); assertEquals("A U Thor", a.name); assertEquals("author@example.com", a.email); } + @Test public void testParse_Email1() { final Address a = Address.parse("author@example.com"); assertNull(a.name); assertEquals("author@example.com", a.email); } + @Test public void testParse_Email2() { final Address a = Address.parse("a@b"); assertNull(a.name); assertEquals("a@b", a.email); } + @Test public void testParseInvalid() { assertInvalid(""); assertInvalid("a"); @@ -88,34 +100,42 @@ } } + @Test public void testToHeaderString_NameEmail1() { assertEquals("A <a@a>", format("A", "a@a")); } + @Test public void testToHeaderString_NameEmail2() { assertEquals("A B <a@a>", format("A B", "a@a")); } + @Test public void testToHeaderString_NameEmail3() { assertEquals("\"A B. C\" <a@a>", format("A B. C", "a@a")); } + @Test public void testToHeaderString_NameEmail4() { assertEquals("\"A B, C\" <a@a>", format("A B, C", "a@a")); } + @Test public void testToHeaderString_NameEmail5() { assertEquals("\"A \\\" C\" <a@a>", format("A \" C", "a@a")); } + @Test public void testToHeaderString_NameEmail6() { assertEquals("=?UTF-8?Q?A_=E2=82=AC_B?= <a@a>", format("A \u20ac B", "a@a")); } + @Test public void testToHeaderString_Email1() { assertEquals("a@a", format(null, "a@a")); } + @Test public void testToHeaderString_Email2() { assertEquals("<a,b@a>", format(null, "a,b@a")); }
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/mail/FromAddressGeneratorProviderTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/mail/FromAddressGeneratorProviderTest.java index 721059c..af31eaf 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/mail/FromAddressGeneratorProviderTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/mail/FromAddressGeneratorProviderTest.java
@@ -19,6 +19,9 @@ import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.AccountExternalId; @@ -27,21 +30,20 @@ import com.google.gerrit.server.account.AccountState; import com.google.gerrit.server.util.TimeUtil; -import junit.framework.TestCase; - import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.PersonIdent; +import org.junit.Before; +import org.junit.Test; import java.util.Collections; -public class FromAddressGeneratorProviderTest extends TestCase { +public class FromAddressGeneratorProviderTest { private Config config; private PersonIdent ident; private AccountCache accountCache; - @Override - protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() throws Exception { config = new Config(); ident = new PersonIdent("NAME", "e@email", 0, 0); accountCache = createStrictMock(AccountCache.class); @@ -56,10 +58,12 @@ config.setString("sendemail", null, "from", newFrom); } + @Test public void testDefaultIsMIXED() { assertTrue(create() instanceof FromAddressGeneratorProvider.PatternGen); } + @Test public void testSelectUSER() { setFrom("USER"); assertTrue(create() instanceof FromAddressGeneratorProvider.UserGen); @@ -71,6 +75,7 @@ assertTrue(create() instanceof FromAddressGeneratorProvider.UserGen); } + @Test public void testUSER_FullyConfiguredUser() { setFrom("USER"); @@ -86,6 +91,7 @@ verify(accountCache); } + @Test public void testUSER_NoFullNameUser() { setFrom("USER"); @@ -100,6 +106,7 @@ verify(accountCache); } + @Test public void testUSER_NoPreferredEmailUser() { setFrom("USER"); @@ -114,6 +121,7 @@ verify(accountCache); } + @Test public void testUSER_NullUser() { setFrom("USER"); replay(accountCache); @@ -124,6 +132,7 @@ verify(accountCache); } + @Test public void testSelectSERVER() { setFrom("SERVER"); assertTrue(create() instanceof FromAddressGeneratorProvider.ServerGen); @@ -135,6 +144,7 @@ assertTrue(create() instanceof FromAddressGeneratorProvider.ServerGen); } + @Test public void testSERVER_FullyConfiguredUser() { setFrom("SERVER"); @@ -150,6 +160,7 @@ verify(accountCache); } + @Test public void testSERVER_NullUser() { setFrom("SERVER"); replay(accountCache); @@ -160,6 +171,7 @@ verify(accountCache); } + @Test public void testSelectMIXED() { setFrom("MIXED"); assertTrue(create() instanceof FromAddressGeneratorProvider.PatternGen); @@ -171,6 +183,7 @@ assertTrue(create() instanceof FromAddressGeneratorProvider.PatternGen); } + @Test public void testMIXED_FullyConfiguredUser() { setFrom("MIXED"); @@ -186,6 +199,7 @@ verify(accountCache); } + @Test public void testMIXED_NoFullNameUser() { setFrom("MIXED"); @@ -200,6 +214,7 @@ verify(accountCache); } + @Test public void testMIXED_NoPreferredEmailUser() { setFrom("MIXED"); @@ -214,6 +229,7 @@ verify(accountCache); } + @Test public void testMIXED_NullUser() { setFrom("MIXED"); replay(accountCache); @@ -224,6 +240,7 @@ verify(accountCache); } + @Test public void testCUSTOM_FullyConfiguredUser() { setFrom("A ${user} B <my.server@email.address>"); @@ -239,6 +256,7 @@ verify(accountCache); } + @Test public void testCUSTOM_NoFullNameUser() { setFrom("A ${user} B <my.server@email.address>"); @@ -253,6 +271,7 @@ verify(accountCache); } + @Test public void testCUSTOM_NullUser() { setFrom("A ${user} B <my.server@email.address>");
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListEntryTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListEntryTest.java index 7df0696..af60ea8 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListEntryTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/patch/PatchListEntryTest.java
@@ -12,14 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. - package com.google.gerrit.server.patch; import com.google.gerrit.reviewdb.client.Patch; +import org.junit.Test; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; -public class PatchListEntryTest extends TestCase { +public class PatchListEntryTest { + @Test public void testEmpty1() { final String name = "empty-file"; final PatchListEntry e = PatchListEntry.empty(name);
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java index 8f4e058..79929fc 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/project/RefControlTest.java
@@ -26,6 +26,8 @@ import static com.google.gerrit.server.project.Util.DEVS; import static com.google.gerrit.server.project.Util.grant; import static com.google.gerrit.server.project.Util.doNotInherit; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import com.google.gerrit.common.data.Capable; import com.google.gerrit.common.data.PermissionRange; @@ -33,10 +35,10 @@ import com.google.gerrit.reviewdb.client.AccountGroup; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.ProjectConfig; +import org.junit.Before; +import org.junit.Test; -import junit.framework.TestCase; - -public class RefControlTest extends TestCase { +public class RefControlTest { private static void assertOwner(String ref, ProjectControl u) { assertTrue("OWN " + ref, u.controlForRef(ref).isOwner()); } @@ -54,14 +56,14 @@ util = new Util(); } - @Override + @Before public void setUp() throws Exception { - super.setUp(); local = new ProjectConfig(localKey); local.createInMemory(); util.add(local); } + @Test public void testOwnerProject() { grant(local, OWNER, ADMIN, "refs/*"); @@ -72,6 +74,7 @@ assertTrue("is owner", uAdmin.isOwner()); } + @Test public void testBranchDelegation1() { grant(local, OWNER, ADMIN, "refs/*"); grant(local, OWNER, DEVS, "refs/heads/x/*"); @@ -88,6 +91,7 @@ assertNotOwner("refs/heads/master", uDev); } + @Test public void testBranchDelegation2() { grant(local, OWNER, ADMIN, "refs/*"); grant(local, OWNER, DEVS, "refs/heads/x/*"); @@ -116,6 +120,7 @@ assertNotOwner("refs/heads/master", uFix); } + @Test public void testInheritRead_SingleBranchDeniesUpload() { grant(util.getParentConfig(), READ, REGISTERED, "refs/*"); grant(util.getParentConfig(), PUSH, REGISTERED, "refs/for/refs/*"); @@ -133,6 +138,7 @@ u.controlForRef("refs/heads/foobar").canUpload()); } + @Test public void testInheritRead_SingleBranchDoesNotOverrideInherited() { grant(util.getParentConfig(), READ, REGISTERED, "refs/*"); grant(util.getParentConfig(), PUSH, REGISTERED, "refs/for/refs/*"); @@ -148,6 +154,7 @@ u.controlForRef("refs/heads/foobar").canUpload()); } + @Test public void testInheritDuplicateSections() { grant(util.getParentConfig(), READ, ADMIN, "refs/*"); grant(local, READ, DEVS, "refs/heads/*"); @@ -160,6 +167,7 @@ assertTrue("d can read", util.user(local, "d", DEVS).isVisible()); } + @Test public void testInheritRead_OverrideWithDeny() { grant(util.getParentConfig(), READ, REGISTERED, "refs/*"); grant(local, READ, REGISTERED, "refs/*").setDeny(); @@ -168,6 +176,7 @@ assertFalse("can't read", u.isVisible()); } + @Test public void testInheritRead_AppendWithDenyOfRef() { grant(util.getParentConfig(), READ, REGISTERED, "refs/*"); grant(local, READ, REGISTERED, "refs/heads/*").setDeny(); @@ -179,6 +188,7 @@ assertTrue("no master", u.controlForRef("refs/heads/master").isVisible()); } + @Test public void testInheritRead_OverridesAndDeniesOfRef() { grant(util.getParentConfig(), READ, REGISTERED, "refs/*"); grant(local, READ, REGISTERED, "refs/*").setDeny(); @@ -191,6 +201,7 @@ assertTrue("can read", u.controlForRef("refs/heads/foobar").isVisible()); } + @Test public void testInheritSubmit_OverridesAndDeniesOfRef() { grant(util.getParentConfig(), SUBMIT, REGISTERED, "refs/*"); grant(local, SUBMIT, REGISTERED, "refs/*").setDeny(); @@ -202,6 +213,7 @@ assertTrue("can submit", u.controlForRef("refs/heads/foobar").canSubmit()); } + @Test public void testCannotUploadToAnyRef() { grant(util.getParentConfig(), READ, REGISTERED, "refs/*"); grant(local, READ, DEVS, "refs/heads/*"); @@ -213,6 +225,7 @@ u.controlForRef("refs/heads/master").canUpload()); } + @Test public void testUsernamePatternNonRegex() { grant(local, READ, DEVS, "refs/sb/${username}/heads/*"); @@ -221,6 +234,7 @@ assertTrue("d can read", d.controlForRef("refs/sb/d/heads/foobar").isVisible()); } + @Test public void testUsernamePatternWithRegex() { grant(local, READ, DEVS, "^refs/sb/${username}/heads/.*"); @@ -229,6 +243,7 @@ assertTrue("d can read", d.controlForRef("refs/sb/dev/heads/foobar").isVisible()); } + @Test public void testSortWithRegex() { grant(local, READ, DEVS, "^refs/heads/.*"); grant(util.getParentConfig(), READ, ANONYMOUS, "^refs/heads/.*-QA-.*"); @@ -238,6 +253,7 @@ assertTrue("d can read", d.controlForRef("refs/heads/foo-QA-bar").isVisible()); } + @Test public void testBlockRule_ParentBlocksChild() { grant(local, PUSH, DEVS, "refs/tags/*"); grant(util.getParentConfig(), PUSH, ANONYMOUS, "refs/tags/*").setBlock(); @@ -246,6 +262,7 @@ assertFalse("u can't force update tag", u.controlForRef("refs/tags/V10").canForceUpdate()); } + @Test public void testBlockLabelRange_ParentBlocksChild() { grant(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*"); grant(util.getParentConfig(), LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*").setBlock(); @@ -259,6 +276,7 @@ assertFalse("u can't vote 2", range.contains(2)); } + @Test public void testUnblockNoForce() { grant(local, PUSH, ANONYMOUS, "refs/heads/*").setBlock(); grant(local, PUSH, DEVS, "refs/heads/*"); @@ -267,6 +285,7 @@ assertTrue("u can push", u.controlForRef("refs/heads/master").canUpdate()); } + @Test public void testUnblockForce() { PermissionRule r = grant(local, PUSH, ANONYMOUS, "refs/heads/*"); r.setBlock(); @@ -277,6 +296,7 @@ assertTrue("u can force push", u.controlForRef("refs/heads/master").canForceUpdate()); } + @Test public void testUnblockForceWithAllowNoForce_NotPossible() { PermissionRule r = grant(local, PUSH, ANONYMOUS, "refs/heads/*"); r.setBlock(); @@ -287,6 +307,7 @@ assertFalse("u can't force push", u.controlForRef("refs/heads/master").canForceUpdate()); } + @Test public void testUnblockMoreSpecificRef_Fails() { grant(local, PUSH, ANONYMOUS, "refs/heads/*").setBlock(); grant(local, PUSH, DEVS, "refs/heads/master"); @@ -295,6 +316,7 @@ assertFalse("u can't push", u.controlForRef("refs/heads/master").canUpdate()); } + @Test public void testUnblockLargerScope_Fails() { grant(local, PUSH, ANONYMOUS, "refs/heads/master").setBlock(); grant(local, PUSH, DEVS, "refs/heads/*"); @@ -303,6 +325,7 @@ assertFalse("u can't push", u.controlForRef("refs/heads/master").canUpdate()); } + @Test public void testUnblockInLocal_Fails() { grant(util.getParentConfig(), PUSH, ANONYMOUS, "refs/heads/*").setBlock(); grant(local, PUSH, fixers, "refs/heads/*"); @@ -311,6 +334,7 @@ assertFalse("u can't push", f.controlForRef("refs/heads/master").canUpdate()); } + @Test public void testUnblockInParentBlockInLocal() { grant(util.getParentConfig(), PUSH, ANONYMOUS, "refs/heads/*").setBlock(); grant(util.getParentConfig(), PUSH, DEVS, "refs/heads/*"); @@ -320,6 +344,7 @@ assertFalse("u can't push", d.controlForRef("refs/heads/master").canUpdate()); } + @Test public void testUnblockVisibilityByREGISTEREDUsers() { grant(local, READ, ANONYMOUS, "refs/heads/*").setBlock(); grant(local, READ, REGISTERED, "refs/heads/*"); @@ -328,6 +353,7 @@ assertTrue("u can read", u.controlForRef("refs/heads/master").isVisibleByRegisteredUsers()); } + @Test public void testUnblockInLocalVisibilityByRegisteredUsers_Fails() { grant(util.getParentConfig(), READ, ANONYMOUS, "refs/heads/*").setBlock(); grant(local, READ, REGISTERED, "refs/heads/*"); @@ -336,6 +362,7 @@ assertFalse("u can't read", u.controlForRef("refs/heads/master").isVisibleByRegisteredUsers()); } + @Test public void testUnblockForceEditTopicName() { grant(local, EDIT_TOPIC_NAME, ANONYMOUS, "refs/heads/*").setBlock(); grant(local, EDIT_TOPIC_NAME, DEVS, "refs/heads/*").setForce(true); @@ -345,6 +372,7 @@ .canForceEditTopicName()); } + @Test public void testUnblockInLocalForceEditTopicName_Fails() { grant(util.getParentConfig(), EDIT_TOPIC_NAME, ANONYMOUS, "refs/heads/*") .setBlock(); @@ -355,6 +383,7 @@ .canForceEditTopicName()); } + @Test public void testUnblockRange() { grant(local, LABEL + "Code-Review", -1, +1, ANONYMOUS, "refs/heads/*").setBlock(); grant(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*"); @@ -365,6 +394,7 @@ assertTrue("u can vote +2", range.contains(2)); } + @Test public void testUnblockRangeOnMoreSpecificRef_Fails() { grant(local, LABEL + "Code-Review", -1, +1, ANONYMOUS, "refs/heads/*").setBlock(); grant(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/master"); @@ -375,6 +405,7 @@ assertFalse("u can't vote +2", range.contains(-2)); } + @Test public void testUnblockRangeOnLargerScope_Fails() { grant(local, LABEL + "Code-Review", -1, +1, ANONYMOUS, "refs/heads/master").setBlock(); grant(local, LABEL + "Code-Review", -2, +2, DEVS, "refs/heads/*"); @@ -385,6 +416,7 @@ assertFalse("u can't vote +2", range.contains(-2)); } + @Test public void testUnblockInLocalRange_Fails() { grant(util.getParentConfig(), LABEL + "Code-Review", -1, 1, ANONYMOUS, "refs/heads/*").setBlock();
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 a99eba1..c6e621a 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
@@ -54,12 +54,12 @@ import java.util.Set; public class Util { - public static AccountGroup.UUID ANONYMOUS = AccountGroup.ANONYMOUS_USERS; - public static AccountGroup.UUID REGISTERED = AccountGroup.REGISTERED_USERS; - public static AccountGroup.UUID ADMIN = new AccountGroup.UUID("test.admin"); - public static AccountGroup.UUID DEVS = new AccountGroup.UUID("test.devs"); + public static final AccountGroup.UUID ANONYMOUS = AccountGroup.ANONYMOUS_USERS; + public static final AccountGroup.UUID REGISTERED = AccountGroup.REGISTERED_USERS; + public static final AccountGroup.UUID ADMIN = new AccountGroup.UUID("test.admin"); + public static final AccountGroup.UUID DEVS = new AccountGroup.UUID("test.devs"); - public static LabelType CR = category("Code-Review", + public static final LabelType CR = category("Code-Review", value(2, "Looks good to me, approved"), value(1, "Looks good to me, but someone else must approve"), value(0, "No score"),
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/AndPredicateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/AndPredicateTest.java index 0ec23d5..9b3a331 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/AndPredicateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/AndPredicateTest.java
@@ -15,14 +15,19 @@ package com.google.gerrit.server.query; import static com.google.gerrit.server.query.Predicate.and; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; -import junit.framework.TestCase; +import org.junit.Test; import java.util.Arrays; import java.util.Collections; import java.util.List; -public class AndPredicateTest extends TestCase { +public class AndPredicateTest { private static final class TestPredicate extends OperatorPredicate<String> { private TestPredicate(String name, String value) { super(name, value); @@ -43,6 +48,7 @@ return new TestPredicate(name, value); } + @Test @SuppressWarnings("unchecked") public void testChildren() { final TestPredicate a = f("author", "alice"); @@ -53,6 +59,7 @@ assertSame(b, n.getChild(1)); } + @Test @SuppressWarnings("unchecked") public void testChildrenUnmodifiable() { final TestPredicate a = f("author", "alice"); @@ -83,6 +90,7 @@ assertEquals(o + " did not affect child", l, p.getChildren()); } + @Test @SuppressWarnings("unchecked") public void testToString() { final TestPredicate a = f("q", "alice"); @@ -92,6 +100,7 @@ assertEquals("(q:alice q:bob q:charlie)", and(a, b, c).toString()); } + @Test @SuppressWarnings("unchecked") public void testEquals() { final TestPredicate a = f("author", "alice"); @@ -107,6 +116,7 @@ assertFalse(and(a, c).equals(a)); } + @Test @SuppressWarnings("unchecked") public void testHashCode() { final TestPredicate a = f("author", "alice"); @@ -118,6 +128,7 @@ assertFalse(and(a, c).hashCode() == and(a, b).hashCode()); } + @Test @SuppressWarnings("unchecked") public void testCopy() { final TestPredicate a = f("author", "alice");
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/FieldPredicateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/FieldPredicateTest.java index a37a336..e31caaf 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/FieldPredicateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/FieldPredicateTest.java
@@ -14,11 +14,16 @@ package com.google.gerrit.server.query; -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; import java.util.Collections; -public class FieldPredicateTest extends TestCase { +public class FieldPredicateTest { private static final class TestPredicate extends OperatorPredicate<String> { private TestPredicate(String name, String value) { super(name, value); @@ -39,12 +44,14 @@ return new TestPredicate(name, value); } + @Test public void testToString() { assertEquals("author:bob", f("author", "bob").toString()); assertEquals("author:\"\"", f("author", "").toString()); assertEquals("owner:\"A U Thor\"", f("owner", "A U Thor").toString()); } + @Test public void testEquals() { assertTrue(f("author", "bob").equals(f("author", "bob"))); assertFalse(f("author", "bob").equals(f("author", "alice"))); @@ -52,11 +59,13 @@ assertFalse(f("author", "bob").equals("author")); } + @Test public void testHashCode() { assertTrue(f("a", "bob").hashCode() == f("a", "bob").hashCode()); assertFalse(f("a", "bob").hashCode() == f("a", "alice").hashCode()); } + @Test public void testNameValue() { final String name = "author"; final String value = "alice"; @@ -66,6 +75,7 @@ assertEquals(0, f.getChildren().size()); } + @Test public void testCopy() { final OperatorPredicate<String> f = f("author", "alice"); assertSame(f, f.copy(Collections.<Predicate<String>> emptyList()));
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/NotPredicateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/NotPredicateTest.java index 90b9ca7..9df906c 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/NotPredicateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/NotPredicateTest.java
@@ -16,13 +16,18 @@ import static com.google.gerrit.server.query.Predicate.and; import static com.google.gerrit.server.query.Predicate.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; -import junit.framework.TestCase; +import org.junit.Test; import java.util.Collections; import java.util.List; -public class NotPredicateTest extends TestCase { +public class NotPredicateTest { private static final class TestPredicate extends OperatorPredicate<String> { private TestPredicate(String name, String value) { super(name, value); @@ -43,6 +48,7 @@ return new TestPredicate(name, value); } + @Test public void testNotNot() { final TestPredicate p = f("author", "bob"); final Predicate<String> n = not(p); @@ -51,6 +57,7 @@ assertSame(p, not(n)); } + @Test public void testChildren() { final TestPredicate p = f("author", "bob"); final Predicate<String> n = not(p); @@ -58,6 +65,7 @@ assertSame(p, n.getChild(0)); } + @Test public void testChildrenUnmodifiable() { final TestPredicate p = f("author", "bob"); final Predicate<String> n = not(p); @@ -87,10 +95,12 @@ assertSame(o + " did not affect child", c, p.getChild(0)); } + @Test public void testToString() { assertEquals("-author:bob", not(f("author", "bob")).toString()); } + @Test public void testEquals() { assertTrue(not(f("author", "bob")).equals(not(f("author", "bob")))); assertFalse(not(f("author", "bob")).equals(not(f("author", "alice")))); @@ -98,11 +108,13 @@ assertFalse(not(f("author", "bob")).equals("author")); } + @Test public void testHashCode() { assertTrue(not(f("a", "b")).hashCode() == not(f("a", "b")).hashCode()); assertFalse(not(f("a", "b")).hashCode() == not(f("a", "a")).hashCode()); } + @Test @SuppressWarnings({"rawtypes", "unchecked"}) public void testCopy() { final TestPredicate a = f("author", "alice");
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/OrPredicateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/OrPredicateTest.java index 7f3ce50..27696bb 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/OrPredicateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/OrPredicateTest.java
@@ -15,14 +15,19 @@ package com.google.gerrit.server.query; import static com.google.gerrit.server.query.Predicate.or; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; -import junit.framework.TestCase; +import org.junit.Test; import java.util.Arrays; import java.util.Collections; import java.util.List; -public class OrPredicateTest extends TestCase { +public class OrPredicateTest { private static final class TestPredicate extends OperatorPredicate<String> { private TestPredicate(String name, String value) { super(name, value); @@ -43,6 +48,7 @@ return new TestPredicate(name, value); } + @Test @SuppressWarnings("unchecked") public void testChildren() { final TestPredicate a = f("author", "alice"); @@ -53,6 +59,7 @@ assertSame(b, n.getChild(1)); } + @Test @SuppressWarnings("unchecked") public void testChildrenUnmodifiable() { final TestPredicate a = f("author", "alice"); @@ -83,6 +90,7 @@ assertEquals(o + " did not affect child", l, p.getChildren()); } + @Test @SuppressWarnings("unchecked") public void testToString() { final TestPredicate a = f("q", "alice"); @@ -92,6 +100,7 @@ assertEquals("(q:alice OR q:bob OR q:charlie)", or(a, b, c).toString()); } + @Test @SuppressWarnings("unchecked") public void testEquals() { final TestPredicate a = f("author", "alice"); @@ -107,6 +116,7 @@ assertFalse(or(a, c).equals(a)); } + @Test @SuppressWarnings("unchecked") public void testHashCode() { final TestPredicate a = f("author", "alice"); @@ -118,6 +128,7 @@ assertFalse(or(a, c).hashCode() == or(a, b).hashCode()); } + @Test @SuppressWarnings("unchecked") public void testCopy() { final TestPredicate a = f("author", "alice");
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/QueryParserTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/QueryParserTest.java index 9534d2b..0eca069 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/QueryParserTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/QueryParserTest.java
@@ -13,13 +13,13 @@ // limitations under the License. package com.google.gerrit.server.query; - - -import junit.framework.TestCase; - import org.antlr.runtime.tree.Tree; +import org.junit.Test; -public class QueryParserTest extends TestCase { +import static org.junit.Assert.assertEquals; + +public class QueryParserTest { + @Test public void testProjectBare() throws QueryParseException { Tree r;
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractIndexQueryChangesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractIndexQueryChangesTest.java index 5dacd49..5099d10 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractIndexQueryChangesTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/AbstractIndexQueryChangesTest.java
@@ -18,10 +18,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.gerrit.extensions.api.changes.ReviewInput; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.server.change.ChangeInserter; import com.google.gerrit.server.change.ChangeResource; -import com.google.gerrit.server.change.PostReview; import com.google.gerrit.server.change.RevisionResource; import com.google.gerrit.server.project.ChangeControl; @@ -70,13 +70,13 @@ Change change = ins.insert(); ChangeControl ctl = changeControlFactory.controlFor(change, user); - PostReview.Input input = new PostReview.Input(); + ReviewInput input = new ReviewInput(); input.message = "toplevel"; - PostReview.Comment comment = new PostReview.Comment(); + ReviewInput.Comment comment = new ReviewInput.Comment(); comment.line = 1; comment.message = "inline"; - input.comments = ImmutableMap.<String, List<PostReview.Comment>> of( - "Foo.java", ImmutableList.<PostReview.Comment> of(comment)); + input.comments = ImmutableMap.<String, List<ReviewInput.Comment>> of( + "Foo.java", ImmutableList.<ReviewInput.Comment> of(comment)); postReview.apply(new RevisionResource( new ChangeResource(ctl), ins.getPatchSet()), input);
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 1e8b87a..2edb955 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
@@ -26,6 +26,7 @@ import com.google.common.collect.Lists; 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.restapi.TopLevelResource; import com.google.gerrit.lifecycle.LifecycleManager; import com.google.gerrit.reviewdb.client.Account; @@ -359,7 +360,7 @@ Change change = ins.insert(); ChangeControl ctl = changeControlFactory.controlFor(change, user); - PostReview.Input input = new PostReview.Input(); + ReviewInput input = new ReviewInput(); input.message = "toplevel"; input.labels = ImmutableMap.<String, Short> of("Code-Review", (short) 1); postReview.apply(new RevisionResource( @@ -476,7 +477,7 @@ assertResultEquals(change2, results.get(0)); assertResultEquals(change1, results.get(1)); - PostReview.Input input = new PostReview.Input(); + ReviewInput input = new ReviewInput(); input.message = "toplevel"; postReview.apply(new RevisionResource( new ChangeResource(ctl1), ins1.getPatchSet()), input); @@ -509,7 +510,7 @@ assertResultEquals(change2, results.get(0)); assertResultEquals(change1, results.get(1)); - PostReview.Input input = new PostReview.Input(); + ReviewInput input = new ReviewInput(); input.message = "toplevel"; postReview.apply(new RevisionResource( new ChangeResource(ctl1), ins1.getPatchSet()), input);
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexFilePredicateTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexFilePredicateTest.java index 1500272..85b0311 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexFilePredicateTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/query/change/RegexFilePredicateTest.java
@@ -16,12 +16,15 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gwtorm.server.OrmException; - -import junit.framework.TestCase; +import org.junit.Test; import java.util.Arrays; -public class RegexFilePredicateTest extends TestCase { +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class RegexFilePredicateTest { + @Test public void testPrefixOnlyOptimization() throws OrmException { RegexFilePredicate p = predicate("^a/b/.*"); assertTrue(p.match(change("a/b/source.c"))); @@ -31,6 +34,7 @@ assertFalse(p.match(change("a/bb/source.c"))); } + @Test public void testPrefixReducesSearchSpace() throws OrmException { RegexFilePredicate p = predicate("^a/b/.*\\.[ch]"); assertTrue(p.match(change("a/b/source.c"))); @@ -40,6 +44,7 @@ assertTrue(p.match(change("a/b/a.a", "a/b/a.d", "a/b/a.h"))); } + @Test public void testFileExtension_Constant() throws OrmException { RegexFilePredicate p = predicate("^.*\\.res"); assertTrue(p.match(change("test.res"))); @@ -47,6 +52,7 @@ assertFalse(p.match(change("test.res.bar"))); } + @Test public void testFileExtension_CharacterGroup() throws OrmException { RegexFilePredicate p = predicate("^.*\\.[ch]"); assertTrue(p.match(change("test.c"))); @@ -54,6 +60,7 @@ assertFalse(p.match(change("test.C"))); } + @Test public void testEndOfString() throws OrmException { assertTrue(predicate("^a$").match(change("a"))); assertFalse(predicate("^a$").match(change("a$"))); @@ -62,6 +69,7 @@ assertTrue(predicate("^a\\$").match(change("a$"))); } + @Test public void testExactMatch() throws OrmException { RegexFilePredicate p = predicate("^foo.c"); assertTrue(p.match(change("foo.c")));
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 e58266f..4756390 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
@@ -14,6 +14,11 @@ package com.google.gerrit.server.schema; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; @@ -29,9 +34,10 @@ import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; -import junit.framework.TestCase; - import org.eclipse.jgit.lib.Repository; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; import java.io.File; import java.io.IOException; @@ -40,7 +46,7 @@ import java.util.Arrays; import java.util.List; -public class SchemaCreatorTest extends TestCase { +public class SchemaCreatorTest { @Inject private AllProjectsName allProjects; @@ -50,18 +56,17 @@ @Inject private InMemoryDatabase db; - @Override - protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() throws Exception { new InMemoryModule().inject(this); } - @Override - protected void tearDown() throws Exception { + @After + public void tearDown() throws Exception { InMemoryDatabase.drop(db); - super.tearDown(); } + @Test public void testGetCauses_CreateSchema() throws OrmException, SQLException, IOException { // Initially the schema should be empty. @@ -109,6 +114,7 @@ } } + @Test public void testCreateSchema_LabelTypes() throws Exception { List<String> labels = Lists.newArrayList(); for (LabelType label : getLabelTypes().getLabelTypes()) { @@ -117,6 +123,7 @@ assertEquals(ImmutableList.of("Code-Review"), labels); } + @Test public void testCreateSchema_Label_CodeReview() throws Exception { LabelType codeReview = getLabelTypes().byLabel("Code-Review"); assertNotNull(codeReview);
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 5039cc2..e6b7a3f 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
@@ -34,10 +34,11 @@ import com.google.inject.Guice; import com.google.inject.TypeLiteral; -import junit.framework.TestCase; - import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.PersonIdent; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; import java.io.File; import java.io.FileNotFoundException; @@ -45,21 +46,22 @@ import java.util.List; import java.util.UUID; -public class SchemaUpdaterTest extends TestCase { +import static org.junit.Assert.assertEquals; + +public class SchemaUpdaterTest { private InMemoryDatabase db; - @Override - protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() throws Exception { db = InMemoryDatabase.newDatabase(); } - @Override - protected void tearDown() throws Exception { + @After + public void tearDown() throws Exception { InMemoryDatabase.drop(db); - super.tearDown(); } + @Test public void testUpdate() throws OrmException, FileNotFoundException, IOException { db.create();
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 1f50fa2..5546410 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
@@ -14,11 +14,15 @@ package com.google.gerrit.server.util; -import junit.framework.TestCase; +import org.junit.Test; import java.util.HashSet; -public class IdGeneratorTest extends TestCase { +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class IdGeneratorTest { + @Test public void test1234() { final HashSet<Integer> seen = new HashSet<Integer>(); for (int i = 0; i < 1 << 16; i++) { @@ -32,6 +36,7 @@ assertEquals(0x0b966b11, IdGenerator.unmix(IdGenerator.mix(0x0b966b11))); } + @Test public void testFormat() { assertEquals("0000000f", IdGenerator.format(0xf)); assertEquals("801234ab", IdGenerator.format(0x801234ab));
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/util/SocketUtilTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/util/SocketUtilTest.java index 9e66046..5ce8882 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/util/SocketUtilTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/util/SocketUtilTest.java
@@ -20,8 +20,12 @@ import static com.google.gerrit.server.util.SocketUtil.resolve; import static java.net.InetAddress.getByName; import static java.net.InetSocketAddress.createUnresolved; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; -import junit.framework.TestCase; +import org.junit.Test; import java.net.Inet4Address; import java.net.Inet6Address; @@ -29,7 +33,8 @@ import java.net.InetSocketAddress; import java.net.UnknownHostException; -public class SocketUtilTest extends TestCase { +public class SocketUtilTest { + @Test public void testIsIPv6() throws UnknownHostException { final InetAddress ipv6 = getByName("1:2:3:4:5:6:7:8"); assertTrue(ipv6 instanceof Inet6Address); @@ -40,12 +45,14 @@ assertFalse(isIPv6(ipv4)); } + @Test public void testHostname() { assertEquals("*", hostname(new InetSocketAddress(80))); assertEquals("localhost", hostname(new InetSocketAddress("localhost", 80))); assertEquals("foo", hostname(createUnresolved("foo", 80))); } + @Test public void testFormat() throws UnknownHostException { assertEquals("*:1234", SocketUtil.format(new InetSocketAddress(1234), 80)); assertEquals("*", SocketUtil.format(new InetSocketAddress(80), 80)); @@ -64,6 +71,7 @@ SocketUtil. format(new InetSocketAddress("localhost", 80), 80)); } + @Test public void testParse() { assertEquals(new InetSocketAddress(1234), parse("*:1234", 80)); assertEquals(new InetSocketAddress(80), parse("*", 80)); @@ -100,6 +108,7 @@ } } + @Test public void testResolve() throws UnknownHostException { assertEquals(new InetSocketAddress(1234), resolve("*:1234", 80)); assertEquals(new InetSocketAddress(80), resolve("*", 80));
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 299a245..ed86031 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
@@ -200,8 +200,9 @@ expect(bbc.getSubsections("submodule")) .andReturn(sectionsToReturn.keySet()); - for (final String id : sectionsToReturn.keySet()) { - final SubmoduleSection section = sectionsToReturn.get(id); + for (Map.Entry<String, SubmoduleSection> entry : sectionsToReturn.entrySet()) { + String id = entry.getKey(); + final SubmoduleSection section = entry.getValue(); expect(bbc.getString("submodule", id, "url")).andReturn(section.getUrl()); expect(bbc.getString("submodule", id, "path")).andReturn( section.getPath());
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 a1e68d0..189f803 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
@@ -14,6 +14,8 @@ package com.google.gerrit.testutil; +import static org.junit.Assert.assertEquals; + import com.google.gerrit.reviewdb.client.CurrentSchemaVersion; import com.google.gerrit.reviewdb.client.SystemConfig; import com.google.gerrit.reviewdb.server.ReviewDb; @@ -26,8 +28,6 @@ import com.google.inject.Guice; import com.google.inject.Inject; -import junit.framework.TestCase; - import org.eclipse.jgit.errors.ConfigInvalidException; import java.io.IOException; @@ -162,6 +162,6 @@ public void assertSchemaVersion() throws OrmException { final CurrentSchemaVersion act = getSchemaVersion(); - TestCase.assertEquals(schemaVersion.getVersionNbr(), act.versionNbr); + assertEquals(schemaVersion.getVersionNbr(), act.versionNbr); } }
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java index c64f9d8..12f0db0 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java
@@ -16,13 +16,13 @@ import com.google.common.base.Objects; import com.google.common.base.Strings; -import com.google.inject.AbstractModule; +import com.google.gerrit.lifecycle.LifecycleModule; import com.google.inject.binder.LinkedBindingBuilder; import org.apache.sshd.server.Command; /** Module to register commands in the SSH daemon. */ -public abstract class CommandModule extends AbstractModule { +public abstract class CommandModule extends LifecycleModule { /** * Configure a command to be invoked by name. * @@ -72,7 +72,7 @@ */ protected void command(final CommandName parent, final Class<? extends BaseCommand> clazz) { - CommandMetaData meta = (CommandMetaData)clazz.getAnnotation(CommandMetaData.class); + CommandMetaData meta = clazz.getAnnotation(CommandMetaData.class); if (meta == null) { throw new IllegalStateException("no CommandMetaData annotation found"); } @@ -91,7 +91,7 @@ */ protected void alias(final CommandName parent, final String name, final Class<? extends BaseCommand> clazz) { - CommandMetaData meta = (CommandMetaData)clazz.getAnnotation(CommandMetaData.class); + CommandMetaData meta = clazz.getAnnotation(CommandMetaData.class); if (meta == null) { throw new IllegalStateException("no CommandMetaData annotation found"); }
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/NoShell.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/NoShell.java index cde7ae8..78f006b 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/NoShell.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/NoShell.java
@@ -106,7 +106,7 @@ } finally { sshScope.set(old); } - err.write(Constants.encode(message.toString())); + err.write(Constants.encode(message)); err.flush(); in.close();
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java new file mode 100644 index 0000000..0c5fca3 --- /dev/null +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SingleCommandPluginModule.java
@@ -0,0 +1,45 @@ +// 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.sshd; + +import com.google.common.base.Preconditions; +import com.google.gerrit.extensions.annotations.PluginName; +import com.google.inject.binder.LinkedBindingBuilder; + +import org.apache.sshd.server.Command; + +import javax.inject.Inject; + +/** + * Binds one SSH command to the plugin name itself. + * <p> + * Cannot be combined with {@link PluginCommandModule}. + */ +public abstract class SingleCommandPluginModule extends CommandModule { + private CommandName command; + + @Inject + void setPluginName(@PluginName String name) { + this.command = Commands.named(name); + } + + @Override + protected final void configure() { + Preconditions.checkState(command != null, "@PluginName must be provided"); + configure(bind(Commands.key(command))); + } + + protected abstract void configure(LinkedBindingBuilder<Command> bind); +}
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 39b7f16..2322a3b 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
@@ -21,7 +21,6 @@ import com.google.gerrit.lifecycle.LifecycleModule; import com.google.gerrit.server.PeerDaemonUser; import com.google.gerrit.server.RemotePeer; -import com.google.gerrit.server.config.FactoryModule; import com.google.gerrit.server.config.GerritRequestModule; import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.git.AsyncReceiveCommits; @@ -47,7 +46,7 @@ import java.util.Map; /** Configures standard dependencies for {@link SshDaemon}. */ -public class SshModule extends FactoryModule { +public class SshModule extends LifecycleModule { private final Map<String, String> aliases; @Inject @@ -87,25 +86,20 @@ install(new DefaultCommandModule()); - install(new LifecycleModule() { - @Override - protected void configure() { - bind(ModuleGenerator.class).to(SshAutoRegisterModuleGenerator.class); - bind(SshPluginStarterCallback.class); - bind(StartPluginListener.class) - .annotatedWith(UniqueAnnotations.create()) - .to(SshPluginStarterCallback.class); + bind(ModuleGenerator.class).to(SshAutoRegisterModuleGenerator.class); + bind(SshPluginStarterCallback.class); + bind(StartPluginListener.class) + .annotatedWith(UniqueAnnotations.create()) + .to(SshPluginStarterCallback.class); - bind(ReloadPluginListener.class) - .annotatedWith(UniqueAnnotations.create()) - .to(SshPluginStarterCallback.class); + bind(ReloadPluginListener.class) + .annotatedWith(UniqueAnnotations.create()) + .to(SshPluginStarterCallback.class); - listener().toInstance(registerInParentInjectors()); - listener().to(SshLog.class); - listener().to(SshDaemon.class); - listener().to(CommandFactoryProvider.class); - } - }); + listener().toInstance(registerInParentInjectors()); + listener().to(SshLog.class); + listener().to(SshDaemon.class); + listener().to(CommandFactoryProvider.class); } private void configureAliases() {
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshRemotePeerProvider.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshRemotePeerProvider.java index 29ede85..2c77360 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshRemotePeerProvider.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshRemotePeerProvider.java
@@ -21,7 +21,7 @@ import java.net.SocketAddress; @Singleton -class SshRemotePeerProvider implements Provider<SocketAddress> { +public class SshRemotePeerProvider implements Provider<SocketAddress> { private final Provider<SshSession> session; @Inject
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 440f236..9067b9b 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
@@ -35,7 +35,7 @@ import java.util.Map; /** Guice scopes for state during an SSH connection. */ -class SshScope { +public class SshScope { private static final Key<RequestCleanup> RC_KEY = Key.get(RequestCleanup.class); @@ -119,7 +119,7 @@ } } - static class SshSessionProvider implements Provider<SshSession> { + public static class SshSessionProvider implements Provider<SshSession> { @Override public SshSession get() { return requireContext().getSession(); @@ -181,7 +181,7 @@ } /** Returns exactly one instance per command executed. */ - static final Scope REQUEST = new Scope() { + public static final Scope REQUEST = new Scope() { public <T> Provider<T> scope(final Key<T> key, final Provider<T> creator) { return new Provider<T>() { public T get() {
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ApproveOption.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ApproveOption.java index 29250d3..fea16cd 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ApproveOption.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/ApproveOption.java
@@ -24,8 +24,10 @@ import org.kohsuke.args4j.spi.OneArgumentOptionHandler; import org.kohsuke.args4j.spi.OptionHandler; import org.kohsuke.args4j.spi.Setter; +import org.kohsuke.args4j.spi.FieldSetter; import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; final class ApproveOption implements Option, Setter<Short> { private final String name; @@ -46,6 +48,16 @@ } @Override + public String[] depends() { + return new String[] {}; + } + + @Override + public boolean hidden() { + return false; + } + + @Override public Class<? extends OptionHandler<Short>> handler() { return Handler.class; } @@ -56,11 +68,6 @@ } @Override - public boolean multiValued() { - return false; - } - - @Override public String name() { return name; } @@ -85,6 +92,16 @@ } @Override + public FieldSetter asFieldSetter() { + throw new UnsupportedOperationException(); + } + + @Override + public AnnotatedElement asAnnotatedElement() { + throw new UnsupportedOperationException(); + } + + @Override public void addValue(final Short val) { this.value = val; }
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AproposCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AproposCommand.java new file mode 100644 index 0000000..813f132 --- /dev/null +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/AproposCommand.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.sshd.commands; + +import com.google.gerrit.server.config.CanonicalWebUrl; +import com.google.gerrit.server.documentation.QueryDocumentationExecutor; +import com.google.gerrit.server.documentation.QueryDocumentationExecutor.DocResult; +import com.google.gerrit.sshd.CommandMetaData; +import com.google.gerrit.sshd.SshCommand; +import com.google.inject.Inject; + +import org.kohsuke.args4j.Argument; + +import java.util.List; + +@CommandMetaData(name = "apropos", description = "Search in Gerrit documentation") +final class AproposCommand extends SshCommand { + @Inject + private QueryDocumentationExecutor searcher; + @Inject + @CanonicalWebUrl String url; + + @Argument(index=0, required = true, metaVar = "QUERY") + private String q; + + @Override + public void run() throws Exception { + List<QueryDocumentationExecutor.DocResult> res = searcher.doQuery(q); + for (DocResult docResult : res) { + stdout.println(String.format("%s:\n%s%s\n", docResult.title, url, + docResult.url)); + } + } +}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java index 521103b..75743b0 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/DefaultCommandModule.java
@@ -14,7 +14,6 @@ package com.google.gerrit.sshd.commands; -import com.google.gerrit.lifecycle.LifecycleModule; import com.google.gerrit.sshd.CommandModule; import com.google.gerrit.sshd.CommandName; import com.google.gerrit.sshd.Commands; @@ -36,6 +35,7 @@ // SlaveCommandModule. command(gerrit).toProvider(new DispatchCommandProvider(gerrit)); + command(gerrit, AproposCommand.class); command(gerrit, BanCommitCommand.class); command(gerrit, FlushCaches.class); command(gerrit, ListProjectsCommand.class); @@ -76,11 +76,6 @@ command("suexec").to(SuExec.class); - install(new LifecycleModule() { - @Override - protected void configure() { - listener().to(ShowCaches.StartupListener.class); - } - }); + listener().to(ShowCaches.StartupListener.class); } }
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 346bea7..81af0d8 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
@@ -43,6 +43,9 @@ @Option(name = "--all", usage = "runs the Git garbage collection for all projects") private boolean all; + @Option(name = "--show-progress", usage = "progress information is shown") + private boolean showProgress; + @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>(); @@ -95,7 +98,7 @@ } GarbageCollectionResult result = - garbageCollectionFactory.create().run(projectNames, stdout); + garbageCollectionFactory.create().run(projectNames, showProgress ? stdout : null); if (result.hasErrors()) { for (GarbageCollectionResult.Error e : result.getErrors()) { String msg;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java index 185bb67..af42e1b 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Query.java
@@ -72,6 +72,11 @@ processor.setIncludeDependencies(on); } + @Option(name = "--all-reviewers", usage = "Include all reviewers") + void setAllReviewers(boolean on) { + processor.setIncludeAllReviewers(on); + } + @Option(name = "--submit-records", usage = "Include submit and label status") void setSubmitRecords(boolean on) { processor.setIncludeSubmitRecords(on);
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 5649843..69763d6 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
@@ -51,7 +51,7 @@ } public static enum OutputFormat { - PRETTY, JSON, JSON_SINGLE; + PRETTY, JSON, JSON_SINGLE } private final BufferedReader in;
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 31f9301..2a8650a 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
@@ -62,12 +62,12 @@ private final Set<Account.Id> reviewerId = new HashSet<Account.Id>(); private final Set<Account.Id> ccId = new HashSet<Account.Id>(); - @Option(name = "--reviewer", aliases = {"--re"}, multiValued = true, metaVar = "EMAIL", usage = "request reviewer for change(s)") + @Option(name = "--reviewer", aliases = {"--re"}, metaVar = "EMAIL", usage = "request reviewer for change(s)") void addReviewer(final Account.Id id) { reviewerId.add(id); } - @Option(name = "--cc", aliases = {}, multiValued = true, metaVar = "EMAIL", usage = "CC user on change(s)") + @Option(name = "--cc", aliases = {}, metaVar = "EMAIL", usage = "CC user on change(s)") void addCC(final Account.Id id) { ccId.add(id); }
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 e5eb567..6665a25 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
@@ -22,23 +22,20 @@ import com.google.gerrit.common.data.LabelValue; import com.google.gerrit.common.data.ReviewResult; import com.google.gerrit.common.data.ReviewResult.Error.Type; +import com.google.gerrit.extensions.api.GerritApi; +import com.google.gerrit.extensions.api.changes.AbandonInput; +import com.google.gerrit.extensions.api.changes.RestoreInput; +import com.google.gerrit.extensions.api.changes.ReviewInput; 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.RestApiException; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.RevId; import com.google.gerrit.reviewdb.server.ReviewDb; -import com.google.gerrit.server.change.Abandon; -import com.google.gerrit.server.change.ChangeResource; -import com.google.gerrit.server.change.DeleteDraftPatchSet; -import com.google.gerrit.server.change.PostReview; -import com.google.gerrit.server.change.Restore; -import com.google.gerrit.server.change.RevisionResource; -import com.google.gerrit.server.change.Submit; import com.google.gerrit.server.changedetail.PublishDraft; import com.google.gerrit.server.config.AllProjectsName; -import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.InvalidChangeOperationException; import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.NoSuchProjectException; @@ -131,32 +128,17 @@ private ReviewDb db; @Inject - private DeleteDraftPatchSet deleteDraftPatchSetImpl; - - @Inject private ProjectControl.Factory projectControlFactory; @Inject private AllProjectsName allProjects; @Inject - private ChangeControl.Factory changeControlFactory; - - @Inject - private Provider<Abandon> abandonProvider; - - @Inject - private Provider<PostReview> reviewProvider; + private Provider<GerritApi> gApi; @Inject private PublishDraft.Factory publishDraftFactory; - @Inject - private Provider<Restore> restoreProvider; - - @Inject - private Provider<Submit> submitProvider; - private List<ApproveOption> optionList; private Map<String, Short> customLabels; @@ -212,10 +194,12 @@ } } - private void applyReview(final ChangeControl ctl, final PatchSet patchSet, - final PostReview.Input review) throws Exception { - reviewProvider.get().apply(new RevisionResource( - new ChangeResource(ctl), patchSet), review); + private void applyReview(PatchSet patchSet, + final ReviewInput review) throws Exception { + gApi.get().changes() + .id(patchSet.getId().getParentKey().get()) + .revision(patchSet.getRevision().get()) + .review(review); } private void approveOne(final PatchSet patchSet) throws Exception { @@ -224,10 +208,10 @@ changeComment = ""; } - PostReview.Input review = new PostReview.Input(); + ReviewInput review = new ReviewInput(); review.message = Strings.emptyToNull(changeComment); review.labels = Maps.newTreeMap(); - review.drafts = PostReview.DraftHandling.PUBLISH; + review.drafts = ReviewInput.DraftHandling.PUBLISH; review.strictLabels = false; for (ApproveOption ao : optionList) { Short v = ao.value(); @@ -245,44 +229,41 @@ } try { - ChangeControl ctl = - changeControlFactory.controlFor(patchSet.getId().getParentKey()); - if (abandonChange) { - final Abandon abandon = abandonProvider.get(); - final Abandon.Input input = new Abandon.Input(); + AbandonInput input = new AbandonInput(); input.message = changeComment; - applyReview(ctl, patchSet, review); + applyReview(patchSet, review); try { - abandon.apply(new ChangeResource(ctl), input); + gApi.get().changes() + .id(patchSet.getId().getParentKey().get()) + .abandon(input); } catch (AuthException e) { writeError("error: " + parseError(Type.ABANDON_NOT_PERMITTED) + "\n"); } catch (ResourceConflictException e) { writeError("error: " + parseError(Type.CHANGE_IS_CLOSED) + "\n"); } } else if (restoreChange) { - final Restore restore = restoreProvider.get(); - final Restore.Input input = new Restore.Input(); + RestoreInput input = new RestoreInput(); input.message = changeComment; try { - restore.apply(new ChangeResource(ctl), input); - applyReview(ctl, patchSet, review); + gApi.get().changes() + .id(patchSet.getId().getParentKey().get()) + .restore(input); + applyReview(patchSet, review); } catch (AuthException e) { writeError("error: " + parseError(Type.RESTORE_NOT_PERMITTED) + "\n"); } catch (ResourceConflictException e) { writeError("error: " + parseError(Type.CHANGE_NOT_ABANDONED) + "\n"); } } else { - applyReview(ctl, patchSet, review); + applyReview(patchSet, review); } if (submitChange) { - Submit submit = submitProvider.get(); - Submit.Input input = new Submit.Input(); - input.waitForMerge = true; - submit.apply(new RevisionResource( - new ChangeResource(ctl), patchSet), - input); + gApi.get().changes() + .id(patchSet.getId().getParentKey().get()) + .revision(patchSet.getRevision().get()) + .submit(); } if (publishPatchSet) { @@ -290,9 +271,10 @@ publishDraftFactory.create(patchSet.getId()).call(); handleReviewResultErrors(result); } else if (deleteDraftPatchSet) { - deleteDraftPatchSetImpl.apply(new RevisionResource( - new ChangeResource(ctl), patchSet), - new DeleteDraftPatchSet.Input()); + gApi.get().changes() + .id(patchSet.getId().getParentKey().get()) + .revision(patchSet.getRevision().get()) + .delete(); } } catch (InvalidChangeOperationException e) { throw error(e.getMessage()); @@ -304,6 +286,8 @@ throw error(e.getMessage()); } catch (ResourceConflictException e) { throw error(e.getMessage()); + } catch (RestApiException e) { + throw error(e.getMessage()); } }
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 5736bb6..f634147 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
@@ -70,16 +70,16 @@ @Option(name = "--inactive", usage = "set account's state to inactive") private boolean inactive; - @Option(name = "--add-email", multiValued = true, metaVar = "EMAIL", usage = "email addresses to add to the account") + @Option(name = "--add-email", metaVar = "EMAIL", usage = "email addresses to add to the account") private List<String> addEmails = new ArrayList<String>(); - @Option(name = "--delete-email", multiValued = true, metaVar = "EMAIL", usage = "email addresses to delete from the account") + @Option(name = "--delete-email", metaVar = "EMAIL", usage = "email addresses to delete from the account") private List<String> deleteEmails = new ArrayList<String>(); - @Option(name = "--add-ssh-key", multiValued = true, metaVar = "-|KEY", usage = "public keys to add to the account") + @Option(name = "--add-ssh-key", metaVar = "-|KEY", usage = "public keys to add to the account") private List<String> addSshKeys = new ArrayList<String>(); - @Option(name = "--delete-ssh-key", multiValued = true, metaVar = "-|KEY", usage = "public keys to delete from the account") + @Option(name = "--delete-ssh-key", metaVar = "-|KEY", usage = "public keys to delete from the account") private List<String> deleteSshKeys = new ArrayList<String>(); @Option(name = "--http-password", metaVar = "PASSWORD", usage = "password for HTTP authentication for the account")
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 6dc79ff..ce015b6 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
@@ -118,7 +118,7 @@ DeleteReviewer delete = deleteReviewerProvider.get(); for (Account.Id reviewer : toRemove) { ReviewerResource rsrc = reviewerFactory.create(changeRsrc, reviewer); - String error = null;; + String error = null; try { delete.apply(rsrc, new DeleteReviewer.Input()); } catch (ResourceNotFoundException e) { @@ -142,8 +142,6 @@ String error; try { error = post.apply(changeRsrc, input).error; - } catch (ResourceNotFoundException e) { - error = String.format("could not add %s: not found", reviewer); } catch (Exception e) { error = String.format("could not add %s: %s", reviewer, e.getMessage()); }
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 b75635f..7fc6d6f 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
@@ -52,10 +52,13 @@ import org.kohsuke.args4j.spi.EnumOptionHandler; import org.kohsuke.args4j.spi.OptionHandler; import org.kohsuke.args4j.spi.Setter; +import org.kohsuke.args4j.spi.FieldSetter; + import java.io.StringWriter; import java.io.Writer; import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -381,6 +384,16 @@ } @Override + public String[] depends() { + return new String[] {}; + } + + @Override + public boolean hidden() { + return false; + } + + @Override public String usage() { return "display this help text"; } @@ -401,11 +414,6 @@ } @Override - public boolean multiValued() { - return false; - } - - @Override public boolean required() { return false; } @@ -416,13 +424,23 @@ } @Override + public FieldSetter asFieldSetter() { + throw new UnsupportedOperationException(); + } + + @Override + public AnnotatedElement asAnnotatedElement() { + throw new UnsupportedOperationException(); + } + + @Override public Class<Boolean> getType() { return Boolean.class; } @Override public boolean isMultiValued() { - return multiValued(); + return false; } } }
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 5936911..36595c0 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
@@ -196,16 +196,10 @@ final DataSourceType dst = Guice.createInjector(new DataSourceModule(), configModule, sitePathModule).getInstance( Key.get(DataSourceType.class, Names.named(dbType.toLowerCase()))); - modules.add(new AbstractModule() { - @Override - protected void configure() { - bind(DataSourceType.class).toInstance(dst); - } - }); - modules.add(new LifecycleModule() { @Override protected void configure() { + bind(DataSourceType.class).toInstance(dst); bind(DataSourceProvider.Context.class).toInstance( DataSourceProvider.Context.MULTI_USER); bind(Key.get(DataSource.class, Names.named("ReviewDb"))).toProvider(
diff --git a/lib/BUCK b/lib/BUCK index c9549b3..2469692 100644 --- a/lib/BUCK +++ b/lib/BUCK
@@ -121,8 +121,8 @@ maven_jar( name = 'args4j', - id = 'args4j:args4j:2.0.16', - sha1 = '9f00fb12820743b9e05c686eba543d64dd43f2b1', + id = 'args4j:args4j:2.0.26', + sha1 = '01ebb18ebb3b379a74207d5af4ea7c8338ebd78b', license = 'args4j', ) @@ -223,8 +223,8 @@ maven_jar( name = 'easymock', - id = 'org.easymock:easymock:3.1', - sha1 = '3e127311a86fc2e8f550ef8ee4abe094bbcf7e7e', + id = 'org.easymock:easymock:3.2', + sha1 = '00c82f7fa3ef377d8954b1db25123944b5af2ba4', license = 'DO_NOT_DISTRIBUTE', deps = [ ':cglib-2_2',
diff --git a/lib/asciidoctor/BUCK b/lib/asciidoctor/BUCK index 0b07b69..b1d5933 100644 --- a/lib/asciidoctor/BUCK +++ b/lib/asciidoctor/BUCK
@@ -31,6 +31,7 @@ srcs = ['java/DocIndexer.java'], deps = [ ':asciidoc_lib', + '//gerrit-server:constants', '//lib:args4j', '//lib:guava', '//lib/lucene:analyzers-common',
diff --git a/lib/asciidoctor/java/DocIndexer.java b/lib/asciidoctor/java/DocIndexer.java index 497cba5..96b1449 100644 --- a/lib/asciidoctor/java/DocIndexer.java +++ b/lib/asciidoctor/java/DocIndexer.java
@@ -13,6 +13,7 @@ // limitations under the License. import com.google.common.io.Files; +import com.google.gerrit.server.documentation.Constants; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.analysis.util.CharArraySet; @@ -43,9 +44,6 @@ public class DocIndexer { private static final Version LUCENE_VERSION = Version.LUCENE_44; - private static final String DOC_FIELD = "doc"; - private static final String URL_FIELD = "url"; - private static final String TITLE_FIELD = "title"; @Option(name = "-z", usage = "output zip file") private String zipFile; @@ -100,10 +98,10 @@ inputFile, inExt, outExt); FileReader reader = new FileReader(file); Document doc = new Document(); - doc.add(new TextField(DOC_FIELD, reader)); + doc.add(new TextField(Constants.DOC_FIELD, reader)); doc.add(new StringField( - URL_FIELD, prefix + outputFile, Field.Store.YES)); - doc.add(new TextField(TITLE_FIELD, title, Field.Store.YES)); + Constants.URL_FIELD, prefix + outputFile, Field.Store.YES)); + doc.add(new TextField(Constants.TITLE_FIELD, title, Field.Store.YES)); iwriter.addDocument(doc); reader.close(); }
diff --git a/lib/jetty/BUCK b/lib/jetty/BUCK index 6eac1a9..6314f99 100644 --- a/lib/jetty/BUCK +++ b/lib/jetty/BUCK
@@ -1,12 +1,12 @@ include_defs('//lib/maven.defs') -VERSION = '8.1.7.v20120910' +VERSION = '9.0.6.v20130930' EXCLUDE = ['about.html'] maven_jar( name = 'servlet', id = 'org.eclipse.jetty:jetty-servlet:' + VERSION, - sha1 = '93da01e3ea26e70449e9a1a0affa5c31436be5a0', + sha1 = 'b6953af6f857e78fe3c46935fa96f9c80a9cbefd', license = 'Apache2.0', deps = [ ':security', @@ -18,7 +18,7 @@ maven_jar( name = 'security', id = 'org.eclipse.jetty:jetty-security:' + VERSION, - sha1 = '8d78beb7a07f4cccee05a3f16a264f1025946258', + sha1 = 'b16cd29ad9d3d3cca8176a654adf4b2ddca0eb3e', license = 'Apache2.0', deps = [':server'], exclude = EXCLUDE, @@ -28,7 +28,7 @@ maven_jar( name = 'server', id = 'org.eclipse.jetty:jetty-server:' + VERSION, - sha1 = '6c81f733f28713919e99c2f8952e6ca5178033cd', + sha1 = 'd89016c2bcd380f548530fa049295e62601dc564', license = 'Apache2.0', deps = [ ':continuation', @@ -41,7 +41,7 @@ maven_jar( name = 'continuation', id = 'org.eclipse.jetty:jetty-continuation:' + VERSION, - sha1 = 'f60cfe6267038000b459508529c88737601081e4', + sha1 = '4f942a52a3e996634ff302ab98f46d224b0db9d2', license = 'Apache2.0', exclude = EXCLUDE, ) @@ -49,7 +49,7 @@ maven_jar( name = 'http', id = 'org.eclipse.jetty:jetty-http:' + VERSION, - sha1 = '10126433876cd74534695f7f99c4362596555493', + sha1 = 'b3a2302717ac1889b4a17ed03e2555f8291121b9', license = 'Apache2.0', deps = [':io'], exclude = EXCLUDE, @@ -58,7 +58,7 @@ maven_jar( name = 'io', id = 'org.eclipse.jetty:jetty-io:' + VERSION, - sha1 = 'a81f746ae1b10c37e1bb0a01d1374c202c0bd549', + sha1 = 'f3a66e0507d963c51e280243f0472a5b2eadc8b1', license = 'Apache2.0', deps = [':util'], exclude = EXCLUDE, @@ -68,7 +68,7 @@ maven_jar( name = 'util', id = 'org.eclipse.jetty:jetty-util:' + VERSION, - sha1 = '7eb2004ab2c22fd3b00095bd9ba0f32a9e88f6a5', + sha1 = 'f36c9e61559d1154be9b52803ef4f586e401dac6', license = 'Apache2.0', exclude = EXCLUDE, visibility = [],
diff --git a/lib/jgit/BUCK b/lib/jgit/BUCK index 3e481bf..bc3044f 100644 --- a/lib/jgit/BUCK +++ b/lib/jgit/BUCK
@@ -26,6 +26,7 @@ license = 'jgit', repository = REPO, deps = [':jgit'], + unsign = True, exclude = [ 'about.html', 'plugin.properties', @@ -38,6 +39,7 @@ sha1 = 'a8b47bb41cec25b1d128f7d267badbc7dcf6d9aa', license = 'DO_NOT_DISTRIBUTE', repository = REPO, + unsign = True, deps = [':jgit'], )
diff --git a/lib/lucene/BUCK b/lib/lucene/BUCK index 38ece4c..5973473 100644 --- a/lib/lucene/BUCK +++ b/lib/lucene/BUCK
@@ -41,6 +41,14 @@ ) maven_jar( + name = 'query-parser', + id = 'org.apache.lucene:lucene-queryparser:4.4.0', + bin_sha1 = 'e2fca26d9c64f3aad7b8a3461dbab14782107a06', + src_sha1 = 'f23e42ab90b5b7eb888d394282eba65362e88606', + license = 'Apache2.0', +) + +maven_jar( name = 'spellchecker', id = 'org.apache.lucene:lucene-spellchecker:3.6.2', bin_sha1 = '15db0c0cfee44e275f15ad046e46b9a05910ad24',
diff --git a/plugins/commit-message-length-validator b/plugins/commit-message-length-validator index 45f347d..c173419 160000 --- a/plugins/commit-message-length-validator +++ b/plugins/commit-message-length-validator
@@ -1 +1 @@ -Subproject commit 45f347d0e258ef7b871b046bfa96b9f902063b10 +Subproject commit c1734194c6a47492b1a5462206f59b585155406e
diff --git a/plugins/cookbook-plugin b/plugins/cookbook-plugin index 5ee3f28..1b1aca1 160000 --- a/plugins/cookbook-plugin +++ b/plugins/cookbook-plugin
@@ -1 +1 @@ -Subproject commit 5ee3f28739700e97b91231a2b694f3ba78065e86 +Subproject commit 1b1aca1dd61c033840bc465fa8646c22f5467f3a
diff --git a/plugins/download-commands b/plugins/download-commands index 05975dd..fe2bc6b 160000 --- a/plugins/download-commands +++ b/plugins/download-commands
@@ -1 +1 @@ -Subproject commit 05975dd6c8ca44de2e01cede16a94df49a3a825f +Subproject commit fe2bc6be5ef964a5df247a85f82c0155dc2f8876
diff --git a/plugins/replication b/plugins/replication index fa66d17..5ee79cc 160000 --- a/plugins/replication +++ b/plugins/replication
@@ -1 +1 @@ -Subproject commit fa66d17b1d6ed3266d0e9061a852fc530ec2ea73 +Subproject commit 5ee79cc5355e24bee7d38f697aa834e1bd6e0e7d
diff --git a/plugins/reviewnotes b/plugins/reviewnotes index 9905f7a..c9fc694 160000 --- a/plugins/reviewnotes +++ b/plugins/reviewnotes
@@ -1 +1 @@ -Subproject commit 9905f7af6c4e258365413a03f092898b167ea25a +Subproject commit c9fc694ebd17d8331710c5193e729cee70fab325
diff --git a/plugins/singleusergroup b/plugins/singleusergroup new file mode 160000 index 0000000..c9ad9d1 --- /dev/null +++ b/plugins/singleusergroup
@@ -0,0 +1 @@ +Subproject commit c9ad9d1be42d5139fc1c447df644866f1d23ed15
diff --git a/tools/build.defs b/tools/build.defs index b62c850..4bb48ea 100644 --- a/tools/build.defs +++ b/tools/build.defs
@@ -14,7 +14,12 @@ # These definitions support building a runnable version of Gerrit. -DOCS = ['//Documentation:html.zip'] +DOCS_SRC = genfile('Documentation/html.zip') +DOCS_LIB = '//Documentation:index_lib' +DOCS_DEP = [ + '//Documentation:html', + '//Documentation:index_lib', +] LIBS = [ '//gerrit-war:log4j-config', '//gerrit-war:init', @@ -36,7 +41,8 @@ libs = [], pgmlibs = [], context = [], - visibility = [] + visibility = [], + docs = False ): cmd = ['$(exe //tools:pack_war)', '-o', '$OUT', '--tmp', '$TMP'] for l in libs: @@ -46,6 +52,10 @@ src = [] dep = [] + if docs: + src.append(DOCS_SRC) + dep.extend(DOCS_DEP) + cmd.extend(['--lib', DOCS_LIB]) if context: root = get_base_path() if root: @@ -56,6 +66,7 @@ r = root + r[2:] r = r.replace(':', '/') src.append(genfile(r)) + if src: cmd.append('$SRCS') genrule( @@ -67,7 +78,7 @@ visibility = visibility, ) -def gerrit_war(name, ui = 'ui_optdbg', context = []): +def gerrit_war(name, ui = 'ui_optdbg', context = [], docs = False): war( name = name, libs = LIBS + ['//gerrit-war:version'], @@ -77,4 +88,5 @@ '//gerrit-war:webapp_assets.zip', '//gerrit-gwtui:' + ui + '.zip', ] + context, + docs = docs, )
diff --git a/tools/default.defs b/tools/default.defs index 4ed5635..b7ef6b4 100644 --- a/tools/default.defs +++ b/tools/default.defs
@@ -14,6 +14,8 @@ # Rule definitions loaded by default into every BUCK file. +include_defs('//tools/gwt-constants.defs') + def genantlr( name, srcs, @@ -128,6 +130,7 @@ deps = [], srcs = [], resources = [], + gwt_module = None, manifest_file = None, manifest_entries = [], type = 'plugin', @@ -149,20 +152,47 @@ srcs = mf_src, out = 'MANIFEST.MF', ) + gwt_deps = [] + static_jars = [] + if gwt_module: + gwt_deps = GWT_PLUGIN_DEPS + static_jars = [':%s-static-jar' % name] java_library2( name = name + '__plugin', srcs = srcs, resources = resources, deps = deps, - compile_deps = ['//:%s-lib' % type], + compile_deps = ['//:%s-lib' % type] + gwt_deps, ) + if gwt_module: + prebuilt_jar( + name = '%s-static-jar' % name, + binary_jar = genfile('%s-static.zip' % name), + deps = [':%s-static' % name], + ) + genrule( + name = '%s-static' % name, + cmd = 'mkdir -p $TMP/static' + + ';unzip -qd $TMP/static $(location %s)' % + ':%s__gwt_application' % name + + ';cd $TMP' + + ';zip -qr $OUT .', + out = '%s-static.zip' % name, + deps = [':%s__gwt_application' % name] + ) + gwt_application( + name = name + '__gwt_application', + module_target = gwt_module, + compiler_opts = GWT_COMPILER_OPTS, + deps = [':%s__plugin' % name] + gwt_deps, + ) java_binary( name = name, manifest_file = genfile('MANIFEST.MF'), deps = [ ':%s__plugin' % name, ':%s__manifest' % name, - ], + ] + static_jars, visibility = visibility, )
diff --git a/tools/eclipse/BUCK b/tools/eclipse/BUCK index 9d6dd53..6f4e704 100644 --- a/tools/eclipse/BUCK +++ b/tools/eclipse/BUCK
@@ -9,9 +9,12 @@ '//gerrit-gwtui:ui_tests', '//gerrit-httpd:httpd_tests', '//gerrit-main:main_lib', + '//gerrit-patch-jgit:jgit_patch_tests', + '//gerrit-plugin-gwtui:client', '//gerrit-server:server__compile', '//lib/asciidoctor:asciidoc_lib', '//lib/asciidoctor:doc_indexer_lib', '//lib/prolog:compiler_lib', + '//Documentation:index_lib', ] + scan_plugins(), )
diff --git a/tools/gwt-constants.defs b/tools/gwt-constants.defs new file mode 100644 index 0000000..56978e7 --- /dev/null +++ b/tools/gwt-constants.defs
@@ -0,0 +1,13 @@ +GWT_COMPILER_OPTS = [ + '-strict', + '-style', 'OBF', + '-optimize', '9', + '-XdisableClassMetadata', + '-XdisableCastChecking', + '-XenableClosureCompiler', +] + +GWT_PLUGIN_DEPS = [ + '//gerrit-plugin-gwtui:client', + '//lib/gwt:user', +]
diff --git a/tools/maven/BUCK b/tools/maven/BUCK index 0a470a4..50b403b 100644 --- a/tools/maven/BUCK +++ b/tools/maven/BUCK
@@ -10,10 +10,12 @@ jar = { 'gerrit-extension-api': '//:extension-api', 'gerrit-plugin-api': '//:plugin-api', + 'gerrit-plugin-gwtui': '//:plugin-gwtui', }, src = { 'gerrit-extension-api': '//:extension-api-src', 'gerrit-plugin-api': '//:plugin-api-src', + 'gerrit-plugin-gwtui': '//:plugin-gwtui-src', }, )