Merge branch 'stable-3.1'

* stable-3.1:
  UrlFormatter: Fix Javadoc of getSettingsUrl()
  Add a separator between blame and the edit icon
  Remove target=_self from commentlinks
  Update .mailmap
  Update .gitreview file
  ReceiveCommits: Factor repeated "internal server error" text to a constant
  Update .mailmap
  Documentation: Add site-path arg to reindex command
  Isolate log4j dep
  gr-diff-builder: Remove unused function renderSection
  Update .mailmap
  Cancel deprecation of change identifiers
  FakeGroupAuditService: Make auditEvents final
  ErrorProne: Increase severity of MutableConstantField to ERROR
  ConfigUpdatedEvent: Use immutable type in field declaration
  gr-diff-processor: remove unused resolve value
  Add missing slf4j dependencies in BUILD file
  JGitMetricModule: fix WindowCache miss ration which wasn't reported
  Revert "JGitMetricModule: Replace anonymous Supplier instances with method references"
  Suppress generic logging on docker start for ElasticSearch container
  Replace deprecated OptionParser with ArgumentParser
  Documentation: Replace plugins list with home page

Change-Id: I93e54874d7bba26120e609b4ea81a7c41ee88deb
This commit is contained in:
David Pursehouse 2020-03-01 18:44:17 +09:00
commit 197894f2b0
24 changed files with 191 additions and 885 deletions

View File

@ -5,6 +5,7 @@ Alex Blewitt <alex.blewitt@gmail.com>
Alex Ryazantsev <alex.ryazantsev@gmail.com> alex <alex.ryazantsev@gmail.com>
Alex Ryazantsev <alex.ryazantsev@gmail.com> alex.ryazantsev <alex.ryazantsev@gmail.com>
Alice Kober-Sotzek <aliceks@google.com> <aliceks@google.com>
Alexandre Philbert <alexandre.philbert@ericsson.com> <alexandre.philbert@hotmail.com>
Andrew Bonventre <andybons@chromium.org> <andybons@google.com>
Becky Siegel <beckysiegel@google.com> beckysiegel <beckysiegel@google.com>
Ben Rohlfs <brohlfs@google.com> brohlfs <brohlfs@google.com>
@ -12,6 +13,7 @@ Brad Larson <bklarson@gmail.com>
Bruce Zu <bruce.zu.run10@gmail.com> <bruce.zu@sonyericsson.com>
Bruce Zu <bruce.zu.run10@gmail.com> <bruce.zu@sonymobile.com>
Carlos Eduardo Baldacin <carloseduardo.baldacin@sonyericsson.com> carloseduardo.baldacin <carloseduardo.baldacin@sonyericsson.com>
Chad Horohoe <chorohoe@wikimedia.org> <chadh@wikimedia.org>
Changcheng Xiao <xchangcheng@google.com> xchangcheng
Cheng Ke <chengke.info@gmail.com> <chengke.info@gmail.com>
Dariusz Luksza <dluksza@collab.net> <dariusz@luksza.org>
@ -29,13 +31,17 @@ Edwin Kempin <ekempin@google.com>
Eryk Szymanski <eryksz@gmail.com> <eryksz@google.com>
Fredrik Luthander <fredrik.luthander@sonymobile.com> <fredrik@gandaraj.com>
Fredrik Luthander <fredrik.luthander@sonymobile.com> <fredrik.luthander@sonyericsson.com>
Gerrit Code Review <no-reply@gerritcodereview.com> <noreply-gerritcodereview@google.com>
Gustaf Lundh <gustaflh@axis.com> <gustaf.lundh@axis.com>
Gustaf Lundh <gustaflh@axis.com> <gustaf.lundh@sonyericsson.com>
Gustaf Lundh <gustaflh@axis.com> <gustaf.lundh@sonymobile.com>
Han-Wen Nienhuys <hanwen@google.com> <hanwen@google.com>
Hector Oswaldo Caballero <hector.caballero@ericsson.com> <hector.caballero@ericsson.com>
Hugo Arès <hugo.ares@ericsson.com> Hugo Ares <hugo.ares@ericsson.com>
Hugo Arès <hugo.ares@ericsson.com> <hugares@gmail.com>
Jacek Centkowski <jcentkowski@collab.net> <gemincia.programs@gmail.com>
Jacek Centkowski <jcentkowski@collab.net> <geminica.programs@gmail.com>
James E. Blair <jeblair@redhat.com> <jeblair@hp.com>
Jason Huntley <jhuntley@houghtonassociates.com> jhuntley <jhuntley@houghtonassociates.com>
Jiří Engelthaler <EngyCZ@gmail.com> <engycz@gmail.com>
Joe Onorato <onoratoj@gmail.com> <joeo@android.com>
@ -49,16 +55,24 @@ Lincoln Oliveira Campos Do Nascimento <lincoln.oliveiracamposdonascimento@sonyer
Luca Milanesio <luca.milanesio@gmail.com> <luca@gitent-scm.com>
Magnus Bäck <magnus.back@axis.com> <baeck@google.com>
Magnus Bäck <magnus.back@axis.com> <magnus.back@sonyericsson.com>
Marco Miller <marco.miller@ericsson.com> <marco.mmiller@gmail.com>
Mark Derricutt <mark.derricutt@smxemail.com> <mark@talios.com>
Martin Fick <mfick@codeaurora.org> <mogulguy10@gmail.com>
Martin Fick <mfick@codeaurora.org> <mogulguy@yahoo.com>
Martin Wallgren <martinwa@axis.com> <martin.wallgren@axis.com>
Matthias Sohn <matthias.sohn@sap.com> <matthias.sohn@gmail.com>
Maxime Guerreiro <maximeg@google.com> <maximeg@google.com>
Michael Zhou <moz@google.com> <zhoumotongxue008@gmail.com>
Monty Taylor <mordred@inaugust.com> <monty.taylor@gmail.com>
Mônica Dionísio <monica.dionisio@sonyericsson.com> monica.dionisio <monica.dionisio@sonyericsson.com>
Nasser Grainawi <nasser@grainawi.org> <nasser@codeaurora.org>
Nasser Grainawi <nasser@grainawi.org> <nasserg@quicinc.com>
Orgad Shaneh <orgads@gmail.com> <orgad.shaneh@audiocodes.com>
Paladox <thomasmulhall410@yahoo.com> <thomasmulhall410@yahoo.com>
Patrick Hiesel <hiesel@google.com> <hiesel@hiesel-macbookpro2.roam.corp.google.com>
Peter Jönsson <peter.joensson@gmail.com> Peter Jönsson <peter.joensson@gmail.com>
Rafael Rabelo Silva <rafael.rabelosilva@sonyericsson.com> rafael.rabelosilva <rafael.rabelosilva@sonyericsson.com>
Réda Housni Alaoui <reda.housnialaoui@gmail.com> <alaoui.rda@gmail.com>
Richard Möhn <richard.moehn@posteo.de> <richard.moehn@fu-berlin.de>
Sam Saccone <samccone@google.com> <samccone@gmail.com>
Sam Saccone <samccone@google.com> <samccone@google.com>
@ -70,6 +84,7 @@ Shawn Pearce <sop@google.com>
Sixin Li <sixin210@gmail.com> sixin li <sixin210@gmail.com>
Sven Selberg <svense@axis.com> <sven.selberg@axis.com>
Sven Selberg <svense@axis.com> <sven.selberg@sonymobile.com>
Thomas Dräbing <thomas.draebing@sap.com> <thomas.draebing@sap.com>
Tom Wang <twang10@gmail.com> Tom <twang10@gmail.com>
Tomas Westling <thomas.westling@sonyericsson.com> thomas.westling <thomas.westling@sonyericsson.com>
Ulrik Sjölin <ulrik.sjolin@sonyericsson.com> <ulrik.sjolin@gmail.com>

View File

@ -1180,18 +1180,6 @@ Allow blame on side by side diff. If set to false, blame cannot be used.
+
Default is true.
[[change.api.allowedIdentifier]]change.api.allowedIdentifier::
+
Change identifier(s) that are allowed on the API. See
link:rest-api-changes.html#change-id[Change Id] for more information.
+
Possible values are `ALL`, `TRIPLET`, `NUMERIC_ID`, `I_HASH`, and
`COMMIT_HASH` or any combination of those as a string list.
`PROJECT_NUMERIC_ID` is always allowed and doesn't need to be listed
explicitly.
+
Default is `ALL`.
[[change.cacheAutomerge]]change.cacheAutomerge::
+
When reviewing diff commits, the left-hand side shows the output of the

View File

@ -175,649 +175,8 @@ Configuration,role=external,window=_blank]
[[other-plugins]]
== Other Plugins
Besides core plugins there are many other Gerrit plugins available.
These plugins are developed and maintained by different parties.
The Gerrit Project doesn't guarantee proper functionality of any of
these plugins.
The Gerrit Project doesn't provide binaries for these plugins, but
there is one public service that offers the download of pre-built
plugin jars:
* link:https://gerrit-ci.gerritforge.com[CI Server from GerritForge,role=external,window=_blank]
The following list gives an overview of available plugins, but the
list may not be complete. You may discover more plugins on
link:https://gerrit-review.googlesource.com/admin/repos/?filter=plugins%252F[
gerrit-review,role=external,window=_blank].
Note that the documentation and configuration links in the list below are
to the plugins' master branch. Please refer to the appropriate branch for
the Gerrit version you are using. Be aware that in some cases a stable
branch might not exist when the master branch is compatible with multiple
versions, or the plugin might not be compatible at all with your version.
[[admin-console]]
=== admin-console
Plugin to provide administrator-only functionality, intended to
simplify common administrative tasks. Currently providing user-level
information. Also providing access control information by project or
project/account.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/admin-console[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/admin-console/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank]
[[analytics]]
=== analytics
Plugin to extract commit and review data from Gerrit projects and
expose aggregated metrics over REST and SSH API.
Metrics are extracted in JSON format with one record per line, ready to be
archived and processed with popular BigData transformation tools such
Apache Spark or published and visualized in dashboards.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/analytics[Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/analytics/+doc/master/README.md[Documentation,role=external,window=_blank]
[[avatars-external]]
=== avatars-external
This plugin allows to use an external url to load the avatar images
from.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/avatars-external[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/avatars-external/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/avatars-external/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[avatars-gravatar]]
=== avatars-gravatar
Plugin to display user icons from Gravatar.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/avatars-gravatar[
Project,role=external,window=_blank]
[[branch-network]]
=== branch-network
This plugin allows the rendering of Git repository branch network in a
graphical HTML5 Canvas. It is mainly intended to be used as a
"project link" in a gitweb configuration.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/branch-network[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/branch-network/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/branch-network/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[changemessage]]
=== changemessage
This plugin allows to display a static info message on the change screen.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/changemessage[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/changemessage/+doc/master/src/main/resources/Documentation/about.md[
Plugin Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/changemessage/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[checks]]
=== checks
The checks plugin provides a REST API and UI extensions for integrating
CI systems with Gerrit.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/checks[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/checks/+doc/master/README.md[
Plugin Documentation,role=external,window=_blank]
[[egit]]
=== egit
This plugin provides extensions for easier usage with EGit.
The plugin adds a download command for EGit that allows to copy only
the change ref into the clipboard. The change ref is needed for
downloading a Gerrit change from within EGit.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/egit[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/egit/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank]
[[emoticons]]
=== emoticons
This plugin allows users to see emoticons in comments as images.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/emoticons[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/emoticons/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/emoticons/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[find-owners]]
=== find-owners
This plugin provides (1) a change review action button `[FIND OWNERS]`
that shows owners of changed files to be included as code reviewers, and
(2) Prolog predicates to make sure that a CL is submittable
only with owner Code-Review +1 votes.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/find-owners[Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/find-owners/+doc/master/src/main/resources/Documentation/about.md[Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/find-owners/+doc/master/src/main/resources/Documentation/config.md[Configuration,role=external,window=_blank]
[[gitblit]]
=== gitblit
GitBlit code-viewer plugin with SSO and Security Access Control.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/gitblit[
Project,role=external,window=_blank]
[[github]]
=== github
Plugin to integrate with GitHub: replication, pull-request to Change-Sets
link:https://gerrit-review.googlesource.com/admin/repos/plugins/github[
Project,role=external,window=_blank]
[[healthcheck]]
=== healthcheck
Plugin for monitoring and alerting when Gerrit does not behave properrly.
When Gerrit Server needs to be available 24x7, it is important to know
*beforehand* if something isn't working correctly: this plugin exposes a
REST-API that provides the real-time status of the Gerrit internals and can
be integrated with real-time monitoring systems and paging platforms.
Healthcheck metrics (latency and subsystem healthiness) are published as
Gerrit internal metrics and can be published to dashboards.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/healthcheck[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/healthcheck/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/healthcheck/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[imagare]]
=== imagare
The imagare plugin allows Gerrit users to upload and share images.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/imagare[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/imagare/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/imagare/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[importer]]
=== importer
The importer plugin allows to import projects from one Gerrit server
into another Gerrit server.
Projects can be imported while both source and target Gerrit server
are online. There is no downtime required.
The git repository and all changes of the project, including approvals
and review comments, are imported. Historic timestamps are preserved.
Project imports can be resumed. This means a project team can continue
to work in the source system while the import to the target system is
done. By resuming the import the project in the target system can be
updated with the missing delta.
The importer plugin can also be used to copy a project within one Gerrit
server, and in combination with the link:#delete-project[delete-project]
plugin it can be used to rename a project.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/importer[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/importer/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank]
[[its-plugins]]
=== Issue Tracker System Plugins
Plugins to integrate with issue tracker systems (ITS), that (based
on events in Gerrit) allows to take actions in the ITS. For example,
they can add comments to bugs, or change status of bugs.
All its-plugins have a common base implementation which is stored in
the `its-base` project. `its-base` is not a plugin, but just a
framework for the ITS plugins which is packaged within each ITS plugin.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/its-base[
its-base Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/its-base/+doc/master/src/main/resources/Documentation/about.md[
its-base Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/its-base/+doc/master/src/main/resources/Documentation/config.md[
its-base Configuration,role=external,window=_blank]
[[its-bugzilla]]
==== its-bugzilla
Plugin to integrate with Bugzilla.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/its-bugzilla[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/its-bugzilla/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank]
[[its-jira]]
==== its-jira
Plugin to integrate with Jira.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/its-jira[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/its-jira/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[its-phabricator]]
==== its-phabricator
Plugin to integrate with Phabricator.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/its-phabricator[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/its-phabricator/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[its-rtc]]
==== its-rtc
Plugin to integrate with IBM Rational Team Concert (RTC).
link:https://gerrit-review.googlesource.com/admin/repos/plugins/its-rtc[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/its-rtc/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[its-storyboard]]
==== its-storyboard
Plugin to integrate with Storyboard task tracking system.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/its-storyboard[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/its-storyboard/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank]
[[javamelody]]
=== javamelody
This plugin allows to monitor the Gerrit server.
This plugin integrates JavaMelody in Gerrit in order to retrieve live
instrumentation data from Gerrit.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/javamelody[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/javamelody/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
https://gerrit.googlesource.com/plugins/javamelody/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[labelui]]
=== labelui
The labelui plugin adds a user preference that allows users to choose a
table control to render the labels/approvals on the change screen
(similar to how labels/approvals were rendered on the old change
screen).
link:https://gerrit-review.googlesource.com/admin/repos/plugins/labelui[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/labelui/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank]
[[menuextender]]
=== menuextender
The menuextender plugin allows Gerrit administrators to configure
additional menu entries from the WebUI.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/menuextender[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/menuextender/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/menuextender/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[metrics-reporter-elasticsearch]]
=== metrics-reporter-elasticsearch
This plugin reports Gerrit metrics to Elasticsearch.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/metrics-reporter-elasticsearch[
Project,role=external,window=_blank].
[[metrics-reporter-graphite]]
=== metrics-reporter-graphite
This plugin reports Gerrit metrics to Graphite.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/metrics-reporter-graphite[
Project,role=external,window=_blank].
[[metrics-reporter-jmx]]
=== metrics-reporter-jmx
This plugin reports Gerrit metrics to JMX.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/metrics-reporter-jmx[
Project,role=external,window=_blank].
[[metrics-reporter-prometheus]]
=== metrics-reporter-prometheus
This plugin exposes Gerrit metrics for consumption by Prometheus.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/metrics-reporter-prometheus[
Project,role=external,window=_blank].
[[motd]]
=== motd
This plugin can output messages to clients when pulling/fetching/cloning
code from Gerrit Code Review. If the client (and transport mechanism)
can support sending the message to the client, it will be displayed to
the user (usually prefixed by “remote: ”), but will be silently
discarded otherwise.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/motd[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/motd/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/motd/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[oauth-authentication-provider]]
=== OAuth authentication provider
This plugin enables Gerrit to use OAuth2 protocol for authentication.
Several OAuth2 providers are supported:
* AirVantage
* Bitbucket
* CAS
* CoreOS Dex
* Facebook
* GitHub
* GitLab
* Google
* Keycloak
* Office365
link:https://gerrit-review.googlesource.com/admin/repos/plugins/oauth[Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/oauth/+doc/master/src/main/resources/Documentation/config.md[Configuration,role=external,window=_blank]
[[owners]]
=== owners
This plugin provides a Prolog predicate `add_owner_approval/3` that
appends `label('Owner-Approval', need(_))` to a provided list.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/owners[Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/owners/+doc/master/README.md[Documentation,role=external,window=_blank]
[[project-download-commands]]
=== project-download-commands
This plugin adds support for project specific download commands.
Project specific download commands that are defined on a parent project
are inherited by the child projects. Child projects can overwrite the
inherited download command or remove it by assigning no value to it.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/project-download-commands[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/project-download-commands/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/project-download-commands/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[quota]]
=== quota
This plugin allows to enforce quotas in Gerrit.
To protect a Gerrit installation it makes sense to limit the resources
that a project or group can consume. To do this a Gerrit administrator
can use this plugin to define quotas on project namespaces.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/quota[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/quota/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank]
link:https://gerrit.googlesource.com/plugins/quota/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[rabbitmq]]
=== rabbitmq
A plugin that publishes Gerrit events to a
link:https://www.rabbitmq.com/[RabbitMQ,role=external,window=_blank] exchange.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/rabbitmq[Project,role=external,window=_blank]
link:https://gerrit.googlesource.com/plugins/rabbitmq/+/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[readonly]]
=== readonly
A plugin that makes the Gerrit server read-only by rejecting git pushes,
blocking HTTP PUT/POST/DELETE requests, and disabling SSH commands.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/readonly[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/readonly/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/readonly/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[ref-protection]]
=== ref-protection
A plugin that protects against commits being lost.
Backups of deleted or non-fast-forward updated refs are created under the
`refs/backups/` namespace.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/ref-protection[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/ref-protection/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank]
[[reparent]]
=== reparent
A plugin that provides project reparenting as a self-service for project owners.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/reparent[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/reparent/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/reparent/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[review-strategy]]
=== review-strategy
This plugin allows users to configure different review strategies.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/review-strategy[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/review-strategy/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank]
[[reviewers]]
=== reviewers
A plugin that allows adding default reviewers to a change.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/reviewers[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/reviewers/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/reviewers/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[reviewers-by-blame]]
=== reviewers-by-blame
A plugin that allows automatically adding reviewers to a change from
the git blame computation on the changed files. It will add the users
that authored most of the lines touched by the change, since these
users should be familiar with the code and can mostly review the
change.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/reviewers-by-blame[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/reviewers-by-blame/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/reviewers-by-blame/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[groovy-provider]]
=== scripting/groovy-provider
This plugin provides a Groovy runtime environment for Gerrit plugins in Groovy.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/scripting/groovy-provider[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/scripting/groovy-provider/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank]
[[saml-authentication-provider]]
=== SAML2 authentication provider
This plugin enables Gerrit to use SAML2 protocol for authentication.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/saml[Project,role=external,window=_blank]
[[scala-provider]]
=== scripting/scala-provider
This plugin provides a Scala runtime environment for Gerrit plugins in Scala.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/scripting/scala-provider[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/scripting/scala-provider/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank]
[[scripts]]
=== scripts
Repository containing a collection of Gerrit scripting plugins that are intended
to provide simple and useful extensions.
Groovy and Scala scripts require the installation of the corresponding
scripting/*-provider plugin in order to be loaded into Gerrit.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/scripts[Project,role=external,window=_blank]
link:https://gerrit.googlesource.com/plugins/scripts/+doc/master/README.md[Documentation,role=external,window=_blank]
[[server-config]]
=== server-config
This plugin enables access (download and upload) to the server config
files. It may be used to change Gerrit config files (like
`etc/gerrit.config`) in cases where direct access to the file system
where Gerrit's config files are stored is difficult or impossible to
get.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/server-config[
Project,role=external,window=_blank]
[[serviceuser]]
=== serviceuser
This plugin allows to create service users in Gerrit.
A service user is a user that is used by another service to communicate
with Gerrit. E.g. a service user is needed to run the Gerrit Trigger
Plugin in Jenkins. A service user is not able to login into the Gerrit
WebUI and it cannot push commits or tags.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/serviceuser[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/serviceuser/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/serviceuser/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[uploadvalidator]]
=== uploadvalidator
This plugin allows to configure upload validations per project.
Project owners can configure blocked file extensions, required footers
and a maximum allowed path length. Pushes of commits that violate these
settings are rejected by Gerrit.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/uploadvalidator[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/uploadvalidator/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/uploadvalidator/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[verify-status]]
=== verify-status
This plugin adds a separate channel for Gerrit to store test metadata and
view them on the Gerrit UI. The metadata can be stored in the Gerrit database
or in a completely separate datastore.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/verify-status[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/verify-status/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/verify-status/+doc/master/src/main/resources/Documentation/database.md[
Configuration,role=external,window=_blank]
[[websession-flatfile]]
=== websession-flatfile
This plugin replaces the built-in Gerrit H2 based websession cache with
a flatfile based implementation. This implementation is shareable
among multiple Gerrit servers, making it useful for cluster
Gerrit installations having multiple primary Gerrit nodes.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/websession-flatfile[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/websession-flatfile/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/websession-flatfile/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
[[x-docs]]
=== x-docs
This plugin serves project documentation as HTML pages.
link:https://gerrit-review.googlesource.com/admin/repos/plugins/x-docs[
Project,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/x-docs/+doc/master/src/main/resources/Documentation/about.md[
Documentation,role=external,window=_blank] |
link:https://gerrit.googlesource.com/plugins/x-docs/+doc/master/src/main/resources/Documentation/config.md[
Configuration,role=external,window=_blank]
Besides core plugins there are many other Gerrit plugins available. This Gerrit home
link:https://www.gerritcodereview.com/plugins.html[page for plugins] lists them.
GERRIT
------

View File

@ -7,6 +7,7 @@ reindex - Rebuild the secondary index
[verse]
--
_java_ -jar gerrit.war _reindex_
-d <SITE_PATH>
[--threads]
[--changes-schema-version]
[--verbose]

View File

@ -14,7 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from optparse import OptionParser
import argparse
import re
import sys
@ -239,34 +239,34 @@ LINK_SCRIPT = """
"""
opts = OptionParser()
opts.add_option('-o', '--out', help='output file')
opts.add_option('-s', '--src', help='source file')
opts.add_option('-x', '--suffix', help='suffix for included filenames')
opts.add_option('-b', '--searchbox', action="store_true", default=True,
parser = argparse.ArgumentParser()
parser.add_argument('-o', '--out', help='output file')
parser.add_argument('-s', '--src', help='source file')
parser.add_argument('-x', '--suffix', help='suffix for included filenames')
parser.add_argument('-b', '--searchbox', action="store_true", default=True,
help="generate the search boxes")
opts.add_option('--no-searchbox', action="store_false", dest='searchbox',
parser.add_argument('--no-searchbox', action="store_false", dest='searchbox',
help="don't generate the search boxes")
opts.add_option('--site-search', action="store", metavar="SITE",
parser.add_argument('--site-search', action="store", metavar="SITE",
help=("generate the search box using google. SITE should " +
"point to the domain/path of the site, eg. " +
"gerrit-review.googlesource.com/Documentation"))
options, _ = opts.parse_args()
args = parser.parse_args()
if options.site_search:
if args.site_search:
SEARCH_BOX = (SEARCH_BOX %
GOOGLE_SITE_SEARCH.replace("@SITE@", options.site_search))
GOOGLE_SITE_SEARCH.replace("@SITE@", args.site_search))
else:
SEARCH_BOX = SEARCH_BOX % BUILTIN_SEARCH
try:
try:
out_file = open(options.out, 'w', errors='ignore')
src_file = open(options.src, 'r', errors='ignore')
out_file = open(args.out, 'w', errors='ignore')
src_file = open(args.src, 'r', errors='ignore')
except TypeError:
out_file = open(options.out, 'w')
src_file = open(options.src, 'r')
out_file = open(args.out, 'w')
src_file = open(args.src, 'r')
last_line = ''
ignore_next_line = False
last_title = ''
@ -277,14 +277,14 @@ try:
last_line = ''
elif PAT_SEARCHBOX.match(last_line):
# Case of 'SEARCHBOX\n---------'
if options.searchbox:
if args.searchbox:
out_file.write(SEARCH_BOX)
last_line = ''
elif PAT_INCLUDE.match(line):
# Case of 'include::<filename>'
match = PAT_INCLUDE.match(line)
out_file.write(last_line)
last_line = match.group(1) + options.suffix + match.group(2) + '\n'
last_line = match.group(1) + args.suffix + match.group(2) + '\n'
elif PAT_STARS.match(line):
if PAT_TITLE.match(last_line):
# Case of the title in '.<title>\n****\nget::<url>\n****'
@ -310,5 +310,5 @@ try:
out_file.close()
except IOError as err:
sys.stderr.write(
"error while expanding %s to %s: %s" % (options.src, options.out, err))
"error while expanding %s to %s: %s" % (args.src, args.out, err))
exit(1)

View File

@ -5668,8 +5668,7 @@ In this case, use a POST request instead:
Identifier that uniquely identifies one change. It contains the URL-encoded
project name as well as the change number: "'$$<project>~<numericId>$$'"
Depending on the server's configuration, Gerrit can still support the following
deprecated identifiers. These will be removed in a future release:
Gerrit also supports the following identifiers:
* an ID of the change in the format "'$$<project>~<branch>~<Change-Id>$$'",
where for the branch the `refs/heads/` prefix can be omitted
@ -5678,10 +5677,6 @@ deprecated identifiers. These will be removed in a future release:
("I8473b95934b5732ac55d26311a706c9c2bde9940")
* a numeric change ID ("4247")
If you need more time to migrate off of old change IDs, please see
link:config-gerrit.html#change.api.allowedIdentifier[change.api.allowedIdentifier]
for more information on how to enable the use of deprecated identifiers.
[[change-message-id]]
=== \{change-message-id\}
ID of a change message returned in a link:#change-message-info[ChangeMessageInfo].

View File

@ -22,9 +22,9 @@ TODO(hiesel): Add comments
"""
from __future__ import print_function
import argparse
import atexit
import json
import optparse
import os
import random
import shutil
@ -275,22 +275,22 @@ def clean_up():
def main():
p = optparse.OptionParser()
p.add_option("-u", "--user_count", action="store",
p = argparse.ArgumentParser()
p.add_argument("-u", "--user_count", action="store",
default=100,
type='int',
type=int,
help="number of users to generate")
p.add_option("-p", "--port", action="store",
p.add_argument("-p", "--port", action="store",
default=8080,
type='int',
type=int,
help="port of server")
(options, _) = p.parse_args()
args = p.parse_args()
global BASE_URL
BASE_URL = BASE_URL % options.port
BASE_URL = BASE_URL % args.port
print(BASE_URL)
set_up()
gerrit_users = get_random_users(options.user_count)
gerrit_users = get_random_users(args.user_count)
group_names = create_gerrit_groups()
for idx, u in enumerate(gerrit_users):

View File

@ -1,25 +0,0 @@
// Copyright (C) 2017 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.restapi;
/** Named resource was accessed using a deprecated identifier. */
public class DeprecatedIdentifierException extends BadRequestException {
private static final long serialVersionUID = 1L;
/** Requested resource using a deprecated identifier. */
public DeprecatedIdentifierException(String msg) {
super(msg);
}
}

View File

@ -14,6 +14,7 @@
package com.google.gerrit.metrics.proc;
import com.google.common.base.Supplier;
import com.google.gerrit.metrics.CallbackMetric1;
import com.google.gerrit.metrics.Description;
import com.google.gerrit.metrics.Description.Units;
@ -34,13 +35,23 @@ public class JGitMetricModule extends MetricModule {
new Description("Bytes of memory retained in JGit block cache.")
.setGauge()
.setUnit(Units.BYTES),
WindowCacheStats.getStats()::getOpenByteCount);
new Supplier<Long>() {
@Override
public Long get() {
return WindowCacheStats.getStats().getOpenByteCount();
}
});
metrics.newCallbackMetric(
"jgit/block_cache/open_files",
Long.class,
new Description("File handles held open by JGit block cache.").setGauge().setUnit("fds"),
WindowCacheStats.getStats()::getOpenFileCount);
new Supplier<Long>() {
@Override
public Long get() {
return WindowCacheStats.getStats().getOpenFileCount();
}
});
metrics.newCallbackMetric(
"jgit/block_cache/avg_load_time",
@ -48,61 +59,110 @@ public class JGitMetricModule extends MetricModule {
new Description("Average time to load a cache entry for JGit block cache.")
.setGauge()
.setUnit(Units.NANOSECONDS),
WindowCacheStats.getStats()::getAverageLoadTime);
new Supplier<Double>() {
@Override
public Double get() {
return WindowCacheStats.getStats().getAverageLoadTime();
}
});
metrics.newCallbackMetric(
"jgit/block_cache/eviction_count",
Long.class,
new Description("Cache evictions for JGit block cache.").setGauge(),
WindowCacheStats.getStats()::getEvictionCount);
new Supplier<Long>() {
@Override
public Long get() {
return WindowCacheStats.getStats().getEvictionCount();
}
});
metrics.newCallbackMetric(
"jgit/block_cache/eviction_ratio",
Double.class,
new Description("Cache eviction ratio for JGit block cache.").setGauge(),
WindowCacheStats.getStats()::getEvictionRatio);
new Supplier<Double>() {
@Override
public Double get() {
return WindowCacheStats.getStats().getEvictionRatio();
}
});
metrics.newCallbackMetric(
"jgit/block_cache/hit_count",
Long.class,
new Description("Cache hits for JGit block cache.").setGauge(),
WindowCacheStats.getStats()::getHitCount);
new Supplier<Long>() {
@Override
public Long get() {
return WindowCacheStats.getStats().getHitCount();
}
});
metrics.newCallbackMetric(
"jgit/block_cache/hit_ratio",
Double.class,
new Description("Cache hit ratio for JGit block cache.").setGauge(),
WindowCacheStats.getStats()::getHitRatio);
new Supplier<Double>() {
@Override
public Double get() {
return WindowCacheStats.getStats().getHitRatio();
}
});
metrics.newCallbackMetric(
"jgit/block_cache/load_failure_count",
Long.class,
new Description("Failed cache loads for JGit block cache.").setGauge(),
WindowCacheStats.getStats()::getLoadFailureCount);
new Supplier<Long>() {
@Override
public Long get() {
return WindowCacheStats.getStats().getLoadFailureCount();
}
});
metrics.newCallbackMetric(
"jgit/block_cache/load_failure_ratio",
Double.class,
new Description("Failed cache load ratio for JGit block cache.").setGauge(),
WindowCacheStats.getStats()::getLoadFailureRatio);
new Supplier<Double>() {
@Override
public Double get() {
return WindowCacheStats.getStats().getLoadFailureRatio();
}
});
metrics.newCallbackMetric(
"jgit/block_cache/load_success_count",
Long.class,
new Description("Successfull cache loads for JGit block cache.").setGauge(),
WindowCacheStats.getStats()::getLoadSuccessCount);
new Supplier<Long>() {
@Override
public Long get() {
return WindowCacheStats.getStats().getLoadSuccessCount();
}
});
metrics.newCallbackMetric(
"jgit/block_cache/miss_count",
Long.class,
new Description("Cache misses for JGit block cache.").setGauge(),
WindowCacheStats.getStats()::getMissCount);
new Supplier<Long>() {
@Override
public Long get() {
return WindowCacheStats.getStats().getMissCount();
}
});
metrics.newCallbackMetric(
"jgit/block_cache/miss_ratio",
Double.class,
new Description("Cache miss ratio for JGit block cache.").setGauge(),
WindowCacheStats.getStats()::getMissRatio);
new Supplier<Double>() {
@Override
public Double get() {
return WindowCacheStats.getStats().getMissRatio();
}
});
CallbackMetric1<String, Long> repoEnt =
metrics.newCallbackMetric(

View File

@ -17,14 +17,12 @@ package com.google.gerrit.server.change;
import com.google.common.base.Throwables;
import com.google.common.cache.Cache;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.google.common.flogger.FluentLogger;
import com.google.common.primitives.Ints;
import com.google.gerrit.entities.Change;
import com.google.gerrit.entities.Project;
import com.google.gerrit.exceptions.StorageException;
import com.google.gerrit.extensions.restapi.DeprecatedIdentifierException;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.git.ObjectIds;
import com.google.gerrit.index.IndexConfig;
@ -33,8 +31,6 @@ import com.google.gerrit.metrics.Description;
import com.google.gerrit.metrics.Field;
import com.google.gerrit.metrics.MetricMaker;
import com.google.gerrit.server.cache.CacheModule;
import com.google.gerrit.server.config.ConfigUtil;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.logging.Metadata;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.project.NoSuchChangeException;
@ -51,7 +47,6 @@ import java.util.List;
import java.util.Optional;
import java.util.Set;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Config;
@Singleton
public class ChangeFinder {
@ -82,7 +77,6 @@ public class ChangeFinder {
private final Provider<InternalChangeQuery> queryProvider;
private final ChangeNotes.Factory changeNotesFactory;
private final Counter1<ChangeIdType> changeIdCounter;
private final ImmutableSet<ChangeIdType> allowedIdTypes;
@Inject
ChangeFinder(
@ -90,8 +84,7 @@ public class ChangeFinder {
@Named(CACHE_NAME) Cache<Change.Id, String> changeIdProjectCache,
Provider<InternalChangeQuery> queryProvider,
ChangeNotes.Factory changeNotesFactory,
MetricMaker metricMaker,
@GerritServerConfig Config config) {
MetricMaker metricMaker) {
this.indexConfig = indexConfig;
this.changeIdProjectCache = changeIdProjectCache;
this.queryProvider = queryProvider;
@ -104,11 +97,6 @@ public class ChangeFinder {
.setUnit("requests"),
Field.ofEnum(ChangeIdType.class, "change_id_type", Metadata.Builder::changeIdType)
.build());
List<ChangeIdType> configuredChangeIdTypes =
ConfigUtil.getEnumList(config, "change", "api", "allowedIdentifier", ChangeIdType.ALL);
// Ensure that PROJECT_NUMERIC_ID can't be removed
configuredChangeIdTypes.add(ChangeIdType.PROJECT_NUMERIC_ID);
this.allowedIdTypes = ImmutableSet.copyOf(configuredChangeIdTypes);
}
public Optional<ChangeNotes> findOne(String id) {
@ -126,25 +114,6 @@ public class ChangeFinder {
* @return possibly-empty list of notes for all matching changes; may or may not be visible.
*/
public List<ChangeNotes> find(String id) {
try {
return find(id, false);
} catch (DeprecatedIdentifierException e) {
// This can't happen because we don't enforce deprecation
throw new StorageException(e);
}
}
/**
* Find changes matching the given identifier.
*
* @param id change identifier.
* @param enforceDeprecation boolean to see if we should throw {@link
* DeprecatedIdentifierException} in case the identifier is deprecated
* @return possibly-empty list of notes for all matching changes; may or may not be visible.
* @throws DeprecatedIdentifierException if the identifier is deprecated.
*/
public List<ChangeNotes> find(String id, boolean enforceDeprecation)
throws DeprecatedIdentifierException {
if (id.isEmpty()) {
return Collections.emptyList();
}
@ -155,7 +124,7 @@ public class ChangeFinder {
// Try project~numericChangeId
Integer n = Ints.tryParse(id.substring(z + 1));
if (n != null) {
checkIdType(ChangeIdType.PROJECT_NUMERIC_ID, enforceDeprecation, n.toString());
changeIdCounter.increment(ChangeIdType.PROJECT_NUMERIC_ID);
return fromProjectNumber(id.substring(0, z), n.intValue());
}
}
@ -164,7 +133,7 @@ public class ChangeFinder {
// Try numeric changeId
Integer n = Ints.tryParse(id);
if (n != null) {
checkIdType(ChangeIdType.NUMERIC_ID, enforceDeprecation, n.toString());
changeIdCounter.increment(ChangeIdType.NUMERIC_ID);
return find(Change.id(n));
}
}
@ -175,7 +144,7 @@ public class ChangeFinder {
// Try commit hash
if (id.matches("^([0-9a-fA-F]{" + ObjectIds.ABBREV_STR_LEN + "," + ObjectIds.STR_LEN + "})$")) {
checkIdType(ChangeIdType.COMMIT_HASH, enforceDeprecation, id);
changeIdCounter.increment(ChangeIdType.COMMIT_HASH);
return asChangeNotes(query.byCommit(id));
}
@ -184,7 +153,7 @@ public class ChangeFinder {
Optional<ChangeTriplet> triplet = ChangeTriplet.parse(id, y, z);
if (triplet.isPresent()) {
ChangeTriplet t = triplet.get();
checkIdType(ChangeIdType.TRIPLET, enforceDeprecation, triplet.get().toString());
changeIdCounter.increment(ChangeIdType.TRIPLET);
return asChangeNotes(query.byBranchKey(t.branch(), t.id()));
}
}
@ -192,7 +161,7 @@ public class ChangeFinder {
// Try isolated Ihash... format ("Change-Id: Ihash").
List<ChangeNotes> notes = asChangeNotes(query.byKeyPrefix(id));
if (!notes.isEmpty()) {
checkIdType(ChangeIdType.I_HASH, enforceDeprecation, id);
changeIdCounter.increment(ChangeIdType.I_HASH);
}
return notes;
}
@ -269,18 +238,4 @@ public class ChangeFinder {
}
return notes;
}
private void checkIdType(ChangeIdType type, boolean enforceDeprecation, String val)
throws DeprecatedIdentifierException {
if (enforceDeprecation
&& !allowedIdTypes.contains(ChangeIdType.ALL)
&& !allowedIdTypes.contains(type)) {
throw new DeprecatedIdentifierException(
String.format(
"The provided change identifier %s is deprecated. "
+ "Use 'project~changeNumber' instead.",
val));
}
changeIdCounter.increment(type);
}
}

View File

@ -60,7 +60,7 @@ public interface UrlFormatter {
.map(url -> url + String.format("@%s%d", side == 0 ? "a" : "", startLine));
}
/** Returns a URL pointing to a section of the settings page. */
/** Returns a URL pointing to the settings page. */
default Optional<String> getSettingsUrl() {
return getWebUrl().map(url -> url + "settings");
}

View File

@ -245,6 +245,7 @@ class ReceiveCommits {
private static final String CANNOT_DELETE_CHANGES = "Cannot delete from '" + REFS_CHANGES + "'";
private static final String CANNOT_DELETE_CONFIG =
"Cannot delete project configuration from '" + RefNames.REFS_CONFIG + "'";
private static final String INTERNAL_SERVER_ERROR = "internal server error";
interface Factory {
ReceiveCommits create(
@ -590,7 +591,7 @@ class ReceiveCommits {
commands =
commands.stream().map(c -> wrapReceiveCommand(c, commandProgress)).collect(toList());
processCommandsUnsafe(commands, progress);
rejectRemaining(commands, "internal server error");
rejectRemaining(commands, INTERNAL_SERVER_ERROR);
// This sends error messages before the 'done' string of the progress monitor is sent.
// Currently, the test framework relies on this ordering to understand if pushes completed
@ -728,7 +729,7 @@ class ReceiveCommits {
logger.atFine().log("Added %d additional ref updates", added);
bu.execute();
} catch (UpdateException | RestApiException e) {
rejectRemaining(cmds, "internal server error");
rejectRemaining(cmds, INTERNAL_SERVER_ERROR);
logger.atFine().withCause(e).log("update failed:");
}
@ -969,7 +970,7 @@ class ReceiveCommits {
} catch (RestApiException | IOException e) {
logger.atSevere().withCause(e).log(
"Can't insert change/patch set for %s", project.getName());
reject(magicBranchCmd, "internal server error: " + e.getMessage());
reject(magicBranchCmd, String.format("%s: %s", INTERNAL_SERVER_ERROR, e.getMessage()));
}
if (magicBranch != null && magicBranch.submit) {
@ -1894,7 +1895,7 @@ class ReceiveCommits {
} catch (IOException e) {
logger.atWarning().withCause(e).log(
"Project %s cannot read %s", project.getName(), id.name());
reject(cmd, "internal server error");
reject(cmd, INTERNAL_SERVER_ERROR);
return;
}
}
@ -1921,7 +1922,7 @@ class ReceiveCommits {
} catch (IOException ex) {
logger.atWarning().withCause(ex).log(
"Error walking to %s in project %s", destBranch, project.getName());
reject(cmd, "internal server error");
reject(cmd, INTERNAL_SERVER_ERROR);
return;
}
@ -2330,7 +2331,7 @@ class ReceiveCommits {
logger.atFine().log("Finished updating groups from GroupCollector");
} catch (StorageException e) {
logger.atSevere().withCause(e).log("Error collecting groups for changes");
reject(magicBranch.cmd, "internal server error");
reject(magicBranch.cmd, INTERNAL_SERVER_ERROR);
}
return newChanges;
}
@ -2655,11 +2656,11 @@ class ReceiveCommits {
} catch (StorageException err) {
logger.atSevere().withCause(err).log(
"Cannot read database before replacement for project %s", project.getName());
rejectRemainingRequests(replaceByChange.values(), "internal server error");
rejectRemainingRequests(replaceByChange.values(), INTERNAL_SERVER_ERROR);
} catch (IOException | PermissionBackendException err) {
logger.atSevere().withCause(err).log(
"Cannot read repository before replacement for project %s", project.getName());
rejectRemainingRequests(replaceByChange.values(), "internal server error");
rejectRemainingRequests(replaceByChange.values(), INTERNAL_SERVER_ERROR);
}
logger.atFine().log("Read %d changes to replace", replaceByChange.size());

View File

@ -81,7 +81,7 @@ public class ChangesCollection implements RestCollection<TopLevelResource, Chang
@Override
public ChangeResource parse(TopLevelResource root, IdString id)
throws RestApiException, PermissionBackendException, IOException {
List<ChangeNotes> notes = changeFinder.find(id.encoded(), true);
List<ChangeNotes> notes = changeFinder.find(id.encoded());
if (notes.isEmpty()) {
throw new ResourceNotFoundException(id);
} else if (notes.size() != 1) {

View File

@ -19,13 +19,11 @@ import static com.google.gerrit.testing.GerritJUnit.assertThrows;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.acceptance.config.GerritConfig;
import com.google.gerrit.acceptance.testsuite.project.ProjectOperations;
import com.google.gerrit.entities.Project;
import com.google.gerrit.extensions.api.changes.ChangeApi;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.ChangeInput;
import com.google.gerrit.extensions.restapi.DeprecatedIdentifierException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.inject.Inject;
import org.junit.Before;
@ -140,28 +138,4 @@ public class ChangeIdIT extends AbstractDaemonTest {
public void wrongChangeIdReturnsNotFound() throws Exception {
assertThrows(ResourceNotFoundException.class, () -> gApi.changes().id("I1234567890"));
}
@Test
@GerritConfig(
name = "change.api.allowedIdentifier",
values = {"PROJECT_NUMERIC_ID", "NUMERIC_ID"})
public void deprecatedChangeIdReturnsBadRequest() throws Exception {
// project~changeNumber still works
ChangeApi cApi1 = gApi.changes().id(project.get(), changeInfo._number);
assertThat(cApi1.get().changeId).isEqualTo(changeInfo.changeId);
// Change number still works
ChangeApi cApi2 = gApi.changes().id(changeInfo._number);
assertThat(cApi2.get().changeId).isEqualTo(changeInfo.changeId);
// IHash throws
ChangeInfo ci =
gApi.changes().create(new ChangeInput(project.get(), "master", "different message")).get();
DeprecatedIdentifierException thrown =
assertThrows(DeprecatedIdentifierException.class, () -> gApi.changes().id(ci.changeId));
assertThat(thrown)
.hasMessageThat()
.contains(
"The provided change identifier "
+ ci.changeId
+ " is deprecated. Use 'project~changeNumber' instead.");
}
}

View File

@ -17,6 +17,7 @@ java_library(
"//lib:junit",
"//lib/guice",
"//lib/httpcomponents:httpcore",
"//lib/log:api",
"//lib/testcontainers",
"//lib/testcontainers:testcontainers-elasticsearch",
],

View File

@ -16,6 +16,8 @@ package com.google.gerrit.elasticsearch;
import org.apache.http.HttpHost;
import org.junit.AssumptionViolatedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.elasticsearch.ElasticsearchContainer;
/* Helper class for running ES integration tests in docker container */
@ -74,6 +76,11 @@ public class ElasticContainer extends ElasticsearchContainer {
super(getImageName(version));
}
@Override
protected Logger logger() {
return LoggerFactory.getLogger("org.testcontainers");
}
public HttpHost getHttpHost() {
return new HttpHost(getContainerIpAddress(), getMappedPort(ELASTICSEARCH_DEFAULT_PORT));
}

View File

@ -4,6 +4,7 @@ java_library(
name = "api",
data = ["//lib:LICENSE-slf4j"],
visibility = [
"//javatests/com/google/gerrit/elasticsearch:__pkg__",
"//lib:__pkg__",
"//plugins:__pkg__",
],

View File

@ -824,15 +824,6 @@ limitations under the License.
element.render(keyLocations, prefs).then(done);
});
test('renderSection', () => {
let section = outputEl.querySelector('stub:nth-of-type(2)');
const prevInnerHTML = section.innerHTML;
section.innerHTML = 'wiped';
element._builder.renderSection(section);
section = outputEl.querySelector('stub:nth-of-type(2)');
assert.equal(section.innerHTML, prevInnerHTML);
});
test('addColumns is called', done => {
element.render(keyLocations, {}).then(done);
assert.isTrue(element._builder.addColumns.called);

View File

@ -115,18 +115,6 @@
group.element = element;
};
GrDiffBuilder.prototype.renderSection = function(element) {
for (let i = 0; i < this.groups.length; i++) {
const group = this.groups[i];
if (group.element === element) {
const newElement = this.buildSectionElement(group);
group.element.parentElement.replaceChild(newElement, group.element);
group.element = newElement;
break;
}
}
};
GrDiffBuilder.prototype.getGroupsByLineRange = function(
startLine, endLine, opt_side) {
const groups = [];

View File

@ -181,7 +181,7 @@
}
// If we are done, resolve the promise.
if (state.chunkIndex >= chunks.length) {
resolve(this.groups);
resolve();
this._nextStepHandle = null;
return;
}

View File

@ -15,8 +15,8 @@
from __future__ import print_function
import argparse
from hashlib import sha1
from optparse import OptionParser
from os import link, makedirs, path, remove
import shutil
from subprocess import check_call, CalledProcessError
@ -75,13 +75,13 @@ def cache_entry(args):
return path.join(CACHE_DIR, name)
opts = OptionParser()
opts.add_option('-o', help='local output file')
opts.add_option('-u', help='URL to download')
opts.add_option('-v', help='expected content SHA-1')
opts.add_option('-x', action='append', help='file to delete from ZIP')
opts.add_option('--exclude_java_sources', action='store_true')
args, _ = opts.parse_args()
parser = argparse.ArgumentParser()
parser.add_argument('-o', help='local output file')
parser.add_argument('-u', help='URL to download')
parser.add_argument('-v', help='expected content SHA-1')
parser.add_argument('-x', action='append', help='file to delete from ZIP')
parser.add_argument('--exclude_java_sources', action='store_true')
args = parser.parse_args()
root_dir = args.o
while root_dir and path.dirname(root_dir) != root_dir:

View File

@ -15,9 +15,9 @@
from __future__ import print_function
import argparse
import hashlib
import json
import optparse
import os
import shutil
import subprocess
@ -80,44 +80,44 @@ def cache_entry(name, package, version, sha1):
return os.path.join(CACHE_DIR, '%s-%s.zip-%s' % (name, version, sha1))
def main(args):
opts = optparse.OptionParser()
opts.add_option('-n', help='short name of component')
opts.add_option('-b', help='bower command')
opts.add_option('-p', help='full package name of component')
opts.add_option('-v', help='version number')
opts.add_option('-s', help='expected content sha1')
opts.add_option('-o', help='output file location')
opts, args_ = opts.parse_args(args)
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-n', help='short name of component')
parser.add_argument('-b', help='bower command')
parser.add_argument('-p', help='full package name of component')
parser.add_argument('-v', help='version number')
parser.add_argument('-s', help='expected content sha1')
parser.add_argument('-o', help='output file location')
args = parser.parse_args()
assert opts.p
assert opts.v
assert opts.n
assert args.p
assert args.v
assert args.n
cwd = os.getcwd()
outzip = os.path.join(cwd, opts.o)
cached = cache_entry(opts.n, opts.p, opts.v, opts.s)
outzip = os.path.join(cwd, args.o)
cached = cache_entry(args.n, args.p, args.v, args.s)
if not os.path.exists(cached):
info = bower_info(opts.b, opts.n, opts.p, opts.v)
info = bower_info(args.b, args.n, args.p, args.v)
ignore_deps(info)
subprocess.check_call(
bower_cmd(
opts.b, '--quiet', 'install', '%s#%s' % (opts.p, opts.v)))
args.b, '--quiet', 'install', '%s#%s' % (args.p, args.v)))
bc = os.path.join(cwd, 'bower_components')
subprocess.check_call(
['zip', '-q', '--exclude', '.bower.json', '-r', cached, opts.n],
['zip', '-q', '--exclude', '.bower.json', '-r', cached, args.n],
cwd=bc)
if opts.s:
path = os.path.join(bc, opts.n)
if args.s:
path = os.path.join(bc, args.n)
sha1 = bowerutil.hash_bower_component(
hashlib.sha1(), path).hexdigest()
if opts.s != sha1:
if args.s != sha1:
print((
'%s#%s:\n'
'expected %s\n'
'received %s\n') % (opts.p, opts.v, opts.s, sha1),
'received %s\n') % (args.p, args.v, args.s, sha1),
file=sys.stderr)
try:
os.remove(cached)
@ -132,4 +132,4 @@ def main(args):
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))
sys.exit(main())

View File

@ -14,20 +14,20 @@
# limitations under the License.
from __future__ import print_function
from optparse import OptionParser
import argparse
from os import path, environ
from subprocess import check_output, CalledProcessError
from sys import stderr
opts = OptionParser()
opts.add_option('--repository', help='maven repository id')
opts.add_option('--url', help='maven repository url')
opts.add_option('-o')
opts.add_option('-a', help='action (valid actions are: install,deploy)')
opts.add_option('-v', help='gerrit version')
opts.add_option('-s', action='append', help='triplet of artifactId:type:path')
parser = argparse.ArgumentParser()
parser.add_argument('--repository', help='maven repository id')
parser.add_argument('--url', help='maven repository url')
parser.add_argument('-o')
parser.add_argument('-a', help='action (valid actions are: install,deploy)')
parser.add_argument('-v', help='gerrit version')
parser.add_argument('-s', action='append', help='triplet of artifactId:type:path')
args = parser.parse_args()
args, ctx = opts.parse_args()
if not args.v:
print('version is empty', file=stderr)
exit(1)

View File

@ -14,21 +14,16 @@
# limitations under the License.
from __future__ import print_function
from optparse import OptionParser
import argparse
import os.path
import re
import sys
parser = OptionParser()
opts, args = parser.parse_args()
if not len(args):
parser.error('not enough arguments')
elif len(args) > 1:
parser.error('too many arguments')
DEST_PATTERN = r'\g<1>%s\g<3>' % args[0]
parser = argparse.ArgumentParser()
parser.add_argument('version')
args = parser.parse_args()
DEST_PATTERN = r'\g<1>%s\g<3>' % args.version
def replace_in_file(filename, src_pattern):
try: