---
title: "Gerrit 3.1.x"
permalink: 3.1.html
hide_sidebar: true
hide_navtoggle: true
toc: true
---

Download: **[3.1.16](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.16.war)**
| [3.1.15](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.15.war)
| [3.1.14](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.14.war)
| [3.1.13](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.13.war)
| [3.1.12](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.12.war)
| [3.1.11](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.11.war)
| [3.1.10](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.10.war)
| [3.1.8](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.8.war)
| [3.1.7](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.7.war)
| [3.1.6](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.6.war)
| [3.1.5](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.5.war)
| [3.1.4](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.4.war)
| [3.1.3](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.3.war)
| [3.1.2](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.2.war)
| [3.1.1](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.1.war)
| [3.1.0](https://gerrit-releases.storage.googleapis.com/gerrit-3.1.0.war)

Documentation: **[3.1.16](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.16/index.html)**
| [3.1.15](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.15/index.html)
| [3.1.14](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.14/index.html)
| [3.1.13](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.13/index.html)
| [3.1.12](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.12/index.html)
| [3.1.11](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.11/index.html)
| [3.1.10](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.10/index.html)
| [3.1.8](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.8/index.html)
| [3.1.7](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.7/index.html)
| [3.1.6](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.6/index.html)
| [3.1.5](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.5/index.html)
| [3.1.4](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.4/index.html)
| [3.1.3](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.3/index.html)
| [3.1.2](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.2/index.html)
| [3.1.1](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.1/index.html)
| [3.1.0](https://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/index.html)

## Release Highlights

* Support for git protocol v2

* Polymer 2

* Mandatory plugins

* Performance logging and tracing

See the [New Features](#new-features) section for further details.

## Important Notes

### Schema Changes

This release does not contain any schema changes. To upgrade:

``` sh
  java -jar gerrit.war init -d site_path
```

The accounts, changes and groups index versions have been increased. To run
off-line reindexing (optional):

```sh
  java -jar gerrit.war reindex -d site_path
```

By default indexes are automatically rebuilt upon the Gerrit startup after the
upgrade.

### Breaking Changes

#### The `reviewdb.client` package is renamed to `entities`

Plugins or extensions that import classes from the `com.google.gerrit.reviewdb.client`
package must change the imports to `com.google.gerrit.entities`.

#### Changed APIs for `Id` and `NameKey` classes

Plugins and extensions that instantiate and use classes such as `Account.Id`,
`Change.Id`, `Project.NameKey`, `Branch.NameKey`, etc, must adapt to the following
changes.

* The classes can no longer be instantiated with the `new` operator. Instead they
must be created with static factory methods.

  * `new Account.Id(...)` --> `Account.id(...)`
  * `new AccountGroup.Id(...)` --> `AccountGroup.id(...)`
  * `new AccountGroup.UUID(...)` --> `AccountGroup.uuid(...)`
  * `new Branch.NameKey(...)` --> `BranchNameKey.create(...)`
  * `new Project.NameKey(...)` --> `Project.nameKey(...)`

* 'Getter' methods are now generated by the auto-value library and no longer have
the `get` prefix.

  * `Account.getName()` -> `Account.name()`
  * ...etc

#### REST API endpoint implementations must return `Response<T>`

REST API endpoint implementations must now return a `Response` object that
explicitly sets a status code. Plugins that currently only return an `Object`
must be adapted to the new interface.

#### Powermock and Easymock are removed

The Powermock and Easymock libraries are no longer exported in the `acceptance-framework`
artifact, and are replaced by Mockito. Plugins that use Powermock and/or Easymock in their
tests should either add explicit dependencies, or migrate the tests to Mockito.

#### Polymer 2 and Shadow DOM may break JavaScript plugins

The Gerrit frontend has been migrated from Polymer 1 to
[Polymer 2](https://polymer-library.polymer-project.org/2.0/docs/upgrade) and to using
[Shadow DOM](https://polymer-library.polymer-project.org/2.0/docs/devguide/shadow-dom).
This may break JavaScript plugins, e.g. if they use `document.getElementById()` to reach
into the DOM. Instead, plugins will have to use dedicated plugin endpoints together
with calling
[`plugin.registerCustomComponent`](https://gerrit-review.googlesource.com/Documentation/js-api.html#self_registerCustomComponent).

#### Browser Support

Internet Explorer is not supported. Major browsers are supported for the following
versions and newer: Firefox 68, Chrome 76, Safari 12.1.

#### Legacy support for pushing to `refs/drafts/` is removed

The `change.allowDrafts` configuration option is removed, and it is no longer
possible to push new changes or patch sets to `refs/drafts/<branch-name>`.

#### Support for pushing to `refs/changes/` is removed

The `receive.allowPushToRefsChanges` configuration option is removed, and it is
no longer possible to add a new patch set to a change by pushing to
`refs/changes/<change number>`.

#### JGit Configuration is no longer read from system level `.gitconfig`

JGit's configuration options are now read from the `$site/etc/jgit.config`
file rather than the system level `.gitconfig`.

#### New limit on the number of change meta updates

Many NoteDb operations require walking the entire change meta ref and loading
its contents into memory, so changes with arbitrarily many updates may cause
high CPU usage, memory pressure, persistent cache bloat, and other problems.

A new configuration option
[`change.maxUpdates`](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/config-gerrit.html#change.maxUpdates)
allows to set the maximum number of updates that are allowed.

#### `container.slave` is renamed to `container.replica`

The `container.slave` option is still recognized as an alias of `container.replica`
but is deprecated and will be removed in a future release.

#### The `MessageOfTheDay` extension point is removed.

The `MessageOfTheDay` functionality was not ported to the PolyGerrit-UI and
the `MessageOfTheDay` extension point was removed with the 3.1.3 release.
However, the JS API provides the `banner` entrypoint for plugins to add messages
to the UI. Plugins that were previously using the `MessageOfTheDay` extension
point have to be adapted accordingly.

#### The `test.submit_rule` and `test.submit_type` REST APIs now require input

In previous versions of Gerrit it was possible to omit the rule from the input
and the project's default submit rule would be tested. Now the rule is required,
and the request will fail with '400 bad request' if the rule is not provided.

## New Features

### Git Protocol V2

Git protocol V2 is now enabled by default. A new permission-aware ref database
ensures that Gerrit only ever returns refs that the calling user has access to.

### Mandatory Plugins

It is possible to
[configure which plugins are mandatory](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/config-gerrit.html#plugins.mandatory).
Gerrit will fail to start if a mandatory plugin cannot be loaded.

Disabling and restarting of a mandatory plugin is rejected, but reloading of a
mandatory plugin is still possible.

### Replication plugin

* [Issue 11196](https://bugs.chromium.org/p/gerrit/issues/detail?id=11196):
Latency metric is now recorded also at a project level, only when
the latency was greater than a configured threshold, configurable in
`replication.config`

### New option to limit options used when rendering internal events.

The new option
[`event.payload.listChangeOptions`](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/config-gerrit.html#event.payload.listChangeOptions)
allows to configure which options are used when rendering internal
events. This can be used to reduce performance impact of rendering
many options.

### Performance logging and tracing

See the [documentation](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/config-gerrit.html#tracing)
for full details.

### REST APIs

* Accounts

  * The `DETAILS` query option on the
  [query accounts](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/rest-api-accounts.html#query-account)
  endpoint now includes the `status` and `state` fields in the response.

* Changes

  * New [`SKIP_DIFFSTAT`](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/rest-api-changes.html#skip_diffstat)
  option for the query changes endpoint.

    Computation of the `insertions` and `deletions` fields may be expensive for
    large trees. The new `SKIP_DIFFSTAT` option allows to omit it from the result.

  * New `exclude-groups` option on the
  [Suggest Reviewers](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/rest-api-changes.html#suggest-reviewers)
  endpoint.

  * New optional `commit-message` field on the
  [input for cherry-pick endpoints](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/rest-api-changes.html#cherrypick-input).

    If the optional message is provided, it is used, otherwise the message from
    the cherry-picked change is used.

  * New optional `topic` field on the
  [input for the revert endpoint](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/rest-api-changes.html#revert-input).

    If the optional topic is provided, it is used, otherwise the topic from the
    reverted change is used.

* Config

  * The value of
  [`change.api.excludeMergeableInChangeInfo`](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/config-gerrit.html#change.api.excludeMergeableInChangeInfo)
  is now included in the response from the
  [Get Server Info endpoint](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/rest-api-config.html#get-info).

* Projects

  * New endpoint: [Update dashboard](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.0/rest-api-projects.html#update-dashboard).

    The new endpoint currently only works for the default dashboard.

## Bug Fixes

* [Issue 5082](https://bugs.chromium.org/p/gerrit/issues/detail?id=5082):
Fix internal server error when getting blame for removed/replaced file.

* [Issue 11918](https://bugs.chromium.org/p/gerrit/issues/detail?id=11918):
Fix internal server error when deleting a ref by git push.

* [Issue 12246](https://bugs.chromium.org/p/gerrit/issues/detail?id=12246):
Fix generation of duplicate `Change-Id`s when creating a new change via REST.

  The `Change-Id` was computed from the commit content and the timestamp,
  which resulted in the possibility for two changes to get the same `Change-Id`
  when two empty changes were created by REST at the same time.

  The `Change-Id` is now generated randomly.

## Dependency Updates

* Remove easymock, powermock and javassist from the acceptance framework

* Remove promise-polyfill

* Add mockito in the acceptance framework

* Upgrade Apache sshd and mina-core to 2.3.0

* Upgrade auto-value to 1.7

* Upgrade bouncycastle to 1.61

* Upgrade commons-compress to 1.18

* Upgrade gitiles-servlet and blame-cache to 0.3-6

* Upgrade jetty to 9.4.18.v20190429

* Upgrade JGit to v5.5.1.201910021850-r-152-g63fc6970c

* Upgrade polymer to 2.7.2

  * Upgrade polymerelements/iron-autogrow-textarea to 2.2.0

  * Upgrade polymerelements/iron-dropdown to 2.2.1

  * Upgrade polymerelements/iron-icon to 2.1.0

  * Upgrade polymerelements/iron-iconset-svg to 2.2.1

  * Upgrade polymerelements/iron-input to 2.1.3

  * Upgrade polymerelements/iron-overlay-behavior to 2.3.4

  * Upgrade polymerelements/iron-selector to 2.1.0

  * Upgrade polymerelements/iron-test-helpers to 2.0.1

  * Upgrade polymerelements/test-fixture to 3.0.0

  * Upgrade polymerelements/paper-button to 2.1.3

  * Upgrade polymerelements/paper-input to 2.2.3

  * Upgrade polymerelements/paper-item to 2.1.1

  * Upgrade polymerelements/paper-listbox to 2.1.1

  * Upgrade polymerelements/paper-tabs to 2.1.1

  * Upgrade polymerelements/paper-toggle-button to 2.1.1

  * Upgrade visionmedia/page.js to 1.11.4

* Upgrade truth to 1.0

## Bugfix Releases

### 3.1.16

* Security Fixes

  * [Issue 14732](https://crbug.com/gerrit/14732):
  Commits/IncludedIn exposes branch names without respecting the ACLs on branches

     When calling the REST endpoint for listing all branches that a commit SHA1
     is part of, the commit is properly checked for visibility against the ACLs
     (it is a REST resource) but the branches were not checked.

     The included-in may have exposed the list of non-visible branches to a user
     that had visibility purely on the SHA1.

  * [Issue 7282](https://crbug.com/gerrit/7282):
  Hide repository name and description when user has no access

     Gitiles did not respect Gerrit's permission and would show the repo name
     and description to any user who could guess the name.
     The repositories list as well as the content APIs were not affected.

* Bug Fixes

  * [Issue 14639](https://crbug.com/gerrit/14639):
  Searching repositories by name is case-sensitive

    Restore the correct project search that was case-insensitive in 2.16.27,
    3.1.3 and 3.3.2.

  * [Change 307602](https://gerrit-review.googlesource.com/c/gerrit/+/307602):
  Fix NPE while accessing draft refs

  * [Change 307482](https://gerrit-review.googlesource.com/c/gerrit/+/307482):
  EqualsLabelPredicate: fix bug that prevents matching owner votes

### 3.1.15

* Bug Fixes

  * [Issue 14553](https://crbug.com/gerrit/14553):
  Gerrit REST-API fails when using /a/ prefix and cookies

    Recent fix to support GerritAccount Cookie authentication for Git/HTTP
    broke existing Python (or other) scripting when performing automation with
    Gerrit REST-API. That is due to the generation of the GerritAccount cookie
    in the HTTP response, which Python automatically manages to reuse in
    subsequent calls.

  * [Issue 13721](https://crbug.com/gerrit/13721):
  Don't serve polygerrit assets for git requests

    After migration to Polymer UI, PolyGerrit static resources are mounted at
    the root of the gerrit URL, and would collide with project namespaces, so that
    the project with these prefixes cannot be served with Git over HTTP protocol.

### 3.1.14

* Bug Fixes

  * Fix registration redirect on OpenID

  * Log when a new SSH connection is rejected due to exceeded limit

    When the `sshd.maxConnectionsPerUser` got exceeded for a user, new
    connections from that user were rejected but no log entry was reported.

  * [Issue 14127](https://crbug.com/gerrit/14127):
  Fix binding of DELETE REST calls from plugins.

    The processing of the DELETE request actually never reached the
    delete-project plugin due to bug in the RestApiServlet which wrongly
    delegated the request to a child collection in Gerrit core.

  * [Issue 13140](https://crbug.com/gerrit/13140):
  OpenID: Remove support for Yahoo! OpenID provider.

    Yahoo! discontinued support for OpenID provider:
    "OpenID2 will be EOLed on 6/30/20"

  * [Issue 14246](https://crbug.com/gerrit/14246):
  Creation of internal account does not respect `auth.userNameToLowerCase`.

    The CreateAccount SSH command and REST API was able to create accounts
    with usernames that contained uppercase letters even if
    `auth.userNameToLowerCase` was set to true.

  * [Issue 14490](https://crbug.com/gerrit/14490):
  Missing LDAP metrics for authentication.

    Expose the LDAP metrics in terms of latency and call rates so that any
    problem can be highlighted early on and potentially alerted to the Gerrit
    admin.

  * [Issue 14497](https://crbug.com/gerrit/14497):
  Git/HTTP traffic overloads LDAP with duplicate authentication requests.

    When authenticating incoming Git calls over HTTP the BasicAuth filter was
    called 3 times per call triggering multiple authentications against the
    backend.

  * [Issue 14508](https://crbug.com/gerrit/14508):
  Allow GerritAccount Cookie authentication for Git/HTTP.

    Allow to create a Gerrit session from the GerritAccount cookie set on the
    Git client, so that only the first HTTP call will actually authenticate
    and create a session whilst all the others would just reuse the existing
    cookie.

  * [Issue 11142](https://crbug.com/gerrit/11142):
  ssh to gerrit with no args requires standard input to terminate.

  * [JGit Issue 552173](https://bugs.eclipse.org/bugs/show_bug.cgi?id=552173)
  Too many open files when fetching repos with lots of refs

    JGit update fixes "Too many open files" errors.

* Dependency Updates

  * Update JGit to 00386272264f65c41e36406f7c2e9ea6e901276e.

### 3.1.13

* New Features

  * [Issue 14091](https://bugs.chromium.org/p/gerrit/issues/detail?id=14091):
  Support the highlighting of LaTeX files with .tex extension.

* Breaking Changes

  * Elasticsearch: Support for [EOL versions](https://www.elastic.co/support/eol)
    7.2 and 7.3 is discontinued. Both elasticsearch versions became EOL recently.

  * [Issue 13931](https://bugs.chromium.org/p/gerrit/issues/detail?id=13931):
  Disallow editing the Change-Id during inline edits.

* Bug Fixes

  * [Issue 12443](https://bugs.chromium.org/p/gerrit/issues/detail?id=12443):
  Stop generating continuous "logging context is not empty" in error_log.

  * [Issue 14097](https://bugs.chromium.org/p/gerrit/issues/detail?id=14097):
  Allow enabling of Git GC button for non-local Git repository managers, such
  as multi-site repositories.

  * [Issue 14118](https://bugs.chromium.org/p/gerrit/issues/detail?id=14118):
  Quota management: enforce repository size on pack rather than on object.

* PolyGerrit Fixes

  * [Issue 14257](https://bugs.chromium.org/p/gerrit/issues/detail?id=14257):
  Fix empty TopMenu drop down list.

* Replication plugin fixes

  * [Issue 12754](https://bugs.chromium.org/p/gerrit/issues/detail?id=12754):
  Remove replication plugin running tasks after their completion.

* Documentation updates

  * Align the recommended buildifier version to v4.0, the same used in the CI.

  * Development guidelines: mention that Optional in arguments is discouraged
   (use @Nullable instead) but may be used as return type.

* Dependency Updates

  * Update highlight.js to 10.6.0.

### 3.1.12

* New Features

  * Add change query option allowing administrators to skip visibility filtering.

    Add a new REST-API change query option "skip-visibility" to allow administrators
    to skip visibility filtering.

* Security Fixes

  * [Issue 13858](https://bugs.chromium.org/p/gerrit/issues/detail?id=13858)
    [CVE-2021-22553](https://nvd.nist.gov/vuln/detail/CVE-2021-22553):
  Fixed memory leak in Git-over-HTTP requests.

    Unauthenticated users could exploit this problem in a Denial of Service attack,
    causing the server to go out-of-memory.

* PolyGerrit Fixes

  * [Issue 11811](https://bugs.chromium.org/p/gerrit/issues/detail?id=11811):
  Fix comments on partial text selection on Safari.

* Replication plugin fixes

  * Don't check read permission when authgroup isn't set.

    Do not check for read permission when authGroup is not set since
    the user is a RemoteSiteUser that is-an InternalUser having
    read access to everything. This fixes a regression introduced in v3.1.10
    that prevented the All-Users.git repository to be fully replicated to
    Gerrit replicas.

* Bug Fixes

  * [Issue 13803](https://bugs.chromium.org/p/gerrit/issues/detail?id=13803):
  Limit number of ambiguous accounts in error message.

    Don't list more than 3 ambiguous accounts in error message of
    UnresolvableAccountException in order to prevent flooding the log and
    displaying a lot of sensitive account data in an error dialog.

  * [Issue 13936](https://bugs.chromium.org/p/gerrit/issues/detail?id=13936):
  Fix badly formatted error message shown in error dialog.

  * [Issue 13884](https://bugs.chromium.org/p/gerrit/issues/detail?id=13884):
  Fix 'is:submittable' query on multiple submit records.

* Dependency Updates

  * Update highlight.js to 10.5.0.

  * Update Jetty to 9.4.35.v20201120.

  * Downgrade soy-template to 2019-10-08.

### 3.1.11

* Breaking Changes

  * Elasticsearch: Support for [EOL version](https://www.elastic.co/support/eol)
    6.8 is discontinued. This was the last supported minor version of
    Elasticsearch 6 in Gerrit. From this release, Gerrit no longer supports V6
    but only the already supported versions 7.x of Elasticsearch.

    * Speaking of which, support for 7.0 and 7.1 is discontinued too, as both
      elasticsearch versions also became [EOL](https://www.elastic.co/support/eol)
      recently.

* Security Fixes

  * [Issue 12629](https://bugs.chromium.org/p/gerrit/issues/detail?id=12629):
  Verify hostname when sending emails via SMTP server with SMTPSClient.

    The SMTP server's certificate and hostname must be verified if
    encryption is enabled with SSL verification in the host settings
    (`sendemail.smtpEncryption` and `sendemail.sslVerify`).

* PolyGerrit Fixes

  * Add a warning if submitting a change with an open change edit.

* Bug Fixes

  * [Issue 13781](https://bugs.chromium.org/p/gerrit/issues/detail?id=13781)
  Compact the REST-API output JSON unconditionally.

    The output JSON was initially compacted only when
    the Accept header was set to `application/json`: the compation is now
    done unconditionally, unless the `pp=1` query parameter is specified.

  * [Issue 13786](https://bugs.chromium.org/p/gerrit/issues/detail?id=13786)
  ForRef#check should permit internal users to read all refs:

    [Make `PermissionBackend#ForRef` authoritative change](https://gerrit-review.googlesource.com/c/gerrit/+/288925)
    introduced a regression where gerrit `internal users` (e.g. plugins) were
    not taken into consideration when checking READ permission. As consequence
    the `All-Users.git` repository did not get any of the user's refs replicated
    to the slaves. After the upgrade it is required to trigger a forced replication
    of the `All-Users.git` repository manually.

* Documentation Updates

  * Clarify that 'm' push option sets patch set description.

  * Clarify that disk cache metrics require `cache.enableDiskStatMetrics`.

* Dependency Updates

  * Upgrade testcontainers to 1.15.1.

  * Upgrade Jetty to 9.4.33.v20201020.


### 3.1.10

* Breaking Changes

  * Elasticsearch: Support for [EOL versions](https://www.elastic.co/support/eol)
    6.6 and 6.7 is discontinued.

  * Logging: `--console-log`-flag of `gerrit.war daemon` respects `log.textLogging`
    and `log.jsonLogging` options

    Change in the default behaviour of the `--console-log` flag. Since
    `log.textLogging` in the `gerrit.config` is `true` by default, using the
    `--console-log`-flag now writes logs to the `error_log`-file in addition
    to stderr by default. This can be avoided by setting `log.textLogging = false`.

* Security Fixes

  * [Issue 13621](https://bugs.chromium.org/p/gerrit/issues/detail?id=13621)
    [CVE-2020-8919](https://nvd.nist.gov/vuln/detail/CVE-2020-8919):
  Make `PermissionBackend#ForRef` authoritative.

    Fixes a misconception that leads to data being accessible through Gerrit
    APIs that should be locked down.

    Gerrit had two components for determining if a Git ref is visible to a
    user: `(Default)RefFilter` and `PermissionBackend#ForRef` (e.g.,
    `RefControl`). The former was always capable of providing correct results
    for all refs. The latter only had logic to decide if a Git ref is visible
    according to the Gerrit `READ` permissions. This includes all refs under
    `refs/heads` as well as any other ref that isn't a database ref or a Git
    tag. This component was unaware of Git tags and notedb-related refs. Hence,
    when asked for a database reference such as `refs/changes/xx/yyyyxx/meta`,
    the logic would allow access if the user has `READ` permissions on any of
    the ref prefixes (such as the default "read refs/* Anonymous Users").

    That was problematic, because it bypassed
    [documented behavior](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.10/access-control.html)
    where a user should only have access to a change if he can see the
    destination ref. The same goes for other database references.

  * [Issue 13514](https://bugs.chromium.org/p/gerrit/issues/detail?id=13514)
    [CVE-2020-8920](https://nvd.nist.gov/vuln/detail/CVE-2020-8920):
  Work around Gitiles bug on `All-Users` visibility.

    Gitiles has a special `FilteredRepository` wrapper that allows carefully
    hiding refs based on the project's ACLs. There is however an optimization
    that skips the filtering in case a user has `READ` permissions on every ACL
    pattern(s). When the target repository is `All-Users`, the optimization
    turns into a security issue because it allows seeing all personal information
    associated with all accounts, i.e.:

    * draft comments
    * draft edits
    * personally identifiable information (PII) of all users
    * external ids

    This fix now blocks Gitiles or any other part of Gerrit to abuse this power
    when the target repository is `All-Users`, where nobody can be authorized
    to skip the ACLs evaluation anyway.

### 3.1.9

This minor release has been withdrawn.

### 3.1.8

* Security Fixes

  * [Issue 12846](https://bugs.chromium.org/p/gerrit/issues/detail?id=12846):
  BadMessageException: 500: Response header too large.

    [CVE-2019-17638](https://nvd.nist.gov/vuln/detail/CVE-2019-17638)

    Bump Jetty version to 9.4.30.v20200611 to fix regression introduced in Jetty
    version: 9.4.27.v20200227.

    Response header overflow leads to buffer corruptions Jetty server always
    allocates maximum response header size.

    For more details see also upstream issues:

    [Issue 4936](https://github.com/eclipse/jetty.project/issues/4936)
    [Issue 4541](https://github.com/eclipse/jetty.project/issues/4541)

* Bug Fixes

  * [Issue 12959](https://bugs.chromium.org/p/gerrit/issues/detail?id=12959):
  Submit: Use updated change for response

    The response was sent with the change instance from before it
    got submitted, rather than the updated change. As a result, the
    response contained the status "NEW" rather than "MERGED".

  * [Issue 13166](https://bugs.chromium.org/p/gerrit/issues/detail?id=13166):
  Include request latency in httpd_log.json

    The latency field was missing in the entries of JSON-formatted http logs.

  * [Issue 12917](https://bugs.chromium.org/p/gerrit/issues/detail?id=12917):
  Switching between changes fails and in-line edit returns HTTP status 404.

    Switching between changes in a change series randomly fails.
    Also, when adding a file to a change using in-line edit fails constantly
    with an HTTP status 404.

### 3.1.7

* Security Fixes

  * [Issue 12926](https://bugs.chromium.org/p/gerrit/issues/detail?id=12926):
  Allow setting X-Frame-Options response header for preventing
  [clickjacking attacks](https://owasp.org/www-community/attacks/Clickjacking).

* Bug Fixes

  * [Issue 12680](https://bugs.chromium.org/p/gerrit/issues/detail?id=12680):
  Run projects reindex after Gerrit init only when needed, speeding up the upgrade process.

  * [Issue 12778](https://bugs.chromium.org/p/gerrit/issues/detail?id=12778):
  Fix `Included In` filter not working in the search box.

  * [Issue 12909](https://bugs.chromium.org/p/gerrit/issues/detail?id=12909):
  Fx missing index creation after Gerrit init.

  * [Issue 12918](https://bugs.chromium.org/p/gerrit/issues/detail?id=12918):
  Fix missing email notifications for project watches for changes created via cherry-pick.

* PolyGerrit Fixes

  * [Issue 11368](https://bugs.chromium.org/p/gerrit/issues/detail?id=11368):
  Fix Javascript error if project has incorrect access configuration in `Global Capabilities`.

  * [Issue 12899](https://bugs.chromium.org/p/gerrit/issues/detail?id=12899):
  Speedup the rendering of changes with large number of comments by lazy loading them when expanded.

* Documentation Updates

  * [Issue 12869](https://bugs.chromium.org/p/gerrit/issues/detail?id=12869):
  Add documentation on how to move a change across branches.

### 3.1.6

* New Features

  * Support for [rolling upgrade](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.6/config-gerrit.html#gerrit.experimentalRollingUpgrade)
  to Gerrit v3.2.0.

  * New interface `AccountActivationListener` available to plugins for listening
  to  accounts activation status changes.

* Security Fixes

  * [Issue 12717](https://bugs.chromium.org/p/gerrit/issues/detail?id=12717):
  Deny access over HTTP for disabled accounts.

    A disabled account was still able to access over HTTP until the existing
    session expired.

  * Close active SSH connections associated to an account that has been disabled.

* Bug Fixes

  * [Issue 12844](https://bugs.chromium.org/p/gerrit/issues/detail?id=12844):
  Update account full name when it changes in LDAP.

  * [Issue 12850](https://bugs.chromium.org/p/gerrit/issues/detail?id=12850):
  Ignore WIP changes in "CCed on" dashboard section.

* Replication plugin fixes

  * [Issue 12806](https://bugs.chromium.org/p/gerrit/issues/detail?id=12806):
  Fix replication of the project deletions to remote replicas.

* PolyGerrit Fixes

  * [Issue 11706](https://bugs.chromium.org/p/gerrit/issues/detail?id=11706):
  Support commit message modification as part of the inline edit session.

* Documentation Updates

  * Added missing documentation of
  [notedb.changes.sequenceBatchSize](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.6/config-gerrit.html#notedb.changes.sequenceBatchSize)

### 3.1.5

* New Features

  * Add a new metric for monitoring Java deadlocks.

    The metric `proc/jvm/thread/num_deadlocked_threads` monitors the number of
    threads that are deadlocked waiting for object monitors or ownable synchronizers.

  * Add support for Elasticsearch 7.7.

* Breaking Changes

  * Metrics: Cache disk stat metric computation is disabled by default

    Calculation of the cache disks stat metrics for persistent caches is disabled
    by default because it is a very expensive operation that can block a thread for
    several minutes on larger installations.

    Installations that still want to use this metric must explicitly enable it with the
    [cache.enableDiskStatMetrics](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.5/config-gerrit.html#cache.enableDiskStatMetrics)
    configuration option.

  * Plugin API: Deprecated methods related to the draft workflow and change edits are removed

    * `ChangeApi.getEdit()`
    * `ChangeApi.publish()`
    * `RevisionApi.delete()`
    * `RevisionApi.publish()`

  * [Issue 12527](https://bugs.chromium.org/p/gerrit/issues/detail?id=12527):
  Elasticsearch: Support for [EOL versions](https://www.elastic.co/support/eol)
  v5.6 and v6.0 to v6.5 is discontinued

* End-to-end Tests Improvements

  * Allow end-to-end tests to proportionally scale on their expected execution times.

    A `power_factor` [environment property](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.5/dev-e2e-tests.html#_environment_properties)
    was added to the end-to-end tests core framework. Using that optional property,
    scenario steps can take some more (or less) time prior to expecting proper completion.

    The way to set that property locally then depends on the target runtime environment,
    or SUT latency. The property may be used for either core or plugin scenarios.

  * `FlushProjectsCache` related scenarios added to core (and the `high-availability` plugin).

  * Support for relative runtime weights in scenarios.

    Each scenario can now either weight like any other by default, or override that default
    with a greater weight value, compared to siblings that are lighter on execution times.

    Beside core, make the `high-availability` and `multi-site` plugin scenarios reuse this.

  * Allow scenarios to create and delete Gerrit changes alongside projects.

    Add the corresponding core support for an optional `http` request body to every such
    `GerritSimulation`. Either automate or allow [environment properties](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.5/dev-e2e-tests.html#_environment_properties)
    to feed the related input test data.

    Beside core, make the `high-availability` and `multi-site` plugin scenarios test changes
    that way. The latter currently has [Issue 12693](https://bugs.chromium.org/p/gerrit/issues/detail?id=12693)
    as a known limitation.

* Bug Fixes

  * [Issue 12606](https://bugs.chromium.org/p/gerrit/issues/detail?id=12606):
  Fix `visibleto` predicate for groups.

    If a group name was used in the `visibleto` predicate, changes were
    not returned even if the group had permission to see them.

  * [Issue 12747](https://bugs.chromium.org/p/gerrit/issues/detail?id=12747):
  Fix change query visibility for internal user.

  * [Issue 12755](https://bugs.chromium.org/p/gerrit/issues/detail?id=12755):
  Block the removal of the Realm primary external ids.

    It was possible to remove the email address associated with the primary
    id of a Realm, effectively resulting in the account being removed.

  * [Isssue 12786](https://bugs.chromium.org/p/gerrit/issues/detail?id=12786):
  Fix wrong status returned when auth backend couldn't be reached.

    The response 401 was returned when the auth backend could not be
    reached, instead of the response 503.

  * [Issue 14242](https://bugs.chromium.org/p/gerrit/issues/detail?id=12424):
  Fix email token verification failures caused by non-URL-encoded characters.

  * [Issue 11625](https://bugs.chromium.org/p/gerrit/issues/detail?id=11625):
  Avoid multiple notifications for existing reviewers.

  * Fix internal server error on parsing commit message during receive commits.

  * Add `autocomplete="off"` to LDAP login form.

    Some security tools will flag the absence of the autocomplete flag as a
    possible security issue, as it could allow for passwords to be saved and
    automatically filled in on shared computers.

  * Accept `--ownedby` as an alias of `--owned-by` in the groups REST API.

    The option was incorrectly documented as `--ownedBy` which resulted in an
    error "not a valid option" if anyone tried to use it.

    The documentation is fixed, and `--ownedby` is added as an alias so that it
    also works for anyone still referring to the old documentation.

  * Fix various misuses of the Flogger API causing exception details to be omitted
  in the log output.

    Exceptions were not properly passed to the logger which would cause the
    details to be omitted, or in some cases the message "ERROR: UNUSED LOG ARGUMENTS"
    to be emitted.

    * When an invalid PAPE response is received during OpenID authentication
    * When a plugin config is invalid and cannot be loaded
    * When an error occurs while migrating a change metadata entry to JSON
    * When there is an unsupported charset in a patch text

  * [Issue 12673](https://bugs.chromium.org/p/gerrit/issues/detail?id=12673):
  Fix emitting debug logs while running tests.

* PolyGerrit UI Fixes

  * [Issue 12707](https://bugs.chromium.org/p/gerrit/issues/detail?id=12707):
  Apply diff preferences immediately after pressing "Save".

  * [Issue 12690](https://bugs.chromium.org/p/gerrit/issues/detail?id=12690):
  Only show the "Edit" button for open changes in the diff view.

  * [Issue 12726](https://bugs.chromium.org/p/gerrit/issues/detail?id=12726):
  Fix incorrect highlighting after `/` character in Javascript.

  * [Issue 12775](https://bugs.chromium.org/p/gerrit/issues/detail?id=12775):
  Fix parent of previous patch sets not being available.

  * [Issue 12385](https://bugs.chromium.org/p/gerrit/issues/detail?id=12385):
  Fix memory leak in `gr-plugin-endpoints`.

* Replication Plugin Fixes

  * [Issue 12678](https://bugs.chromium.org/p/gerrit/issues/detail?id=12678):
  Fix missing replication Id in replication logs.

    The migration to use Flogger in 2.16.17 caused a regression in the logging,
    where the replication Id was omitted from the logs. This is fixed by reverting
    back to slf4j logging for the replication log.

  * [Issue 12719](https://bugs.chromium.org/p/gerrit/issues/detail?id=12719):
  Fix `replication start --wait` to track in-flight collisions and to not fail.

  * [Issue 12731](https://bugs.chromium.org/p/gerrit/issues/detail?id=12731):
  Don't lose state when there's a pending push to the same ref.

    If there was already a pending push (not an in-flight push) to the same endpoint,
    the start for the push would be dropped when adding the push to the Destination.
    This meant that a `replication start --wait` command would never complete when
    one of its pushes was pending since its state would never receive the completion
    notification for that push.

  * [Issue 11745](https://bugs.chromium.org/p/gerrit/issues/detail?id=11745):
  Fix firing pending "..all.." events on startup.

  * [Issue 11760](https://bugs.chromium.org/p/gerrit/issues/detail?id=11760):
  Make persistent task keys stable.

  * Fix URL matching to match real URLs in addition to templated URLs.

  * Log when skipping deletion of a ref when pushing to a remote in mirror mode.

  * Improve logging of push failures caused by a lock failure on the remote.

  * Improve logging of refs to be pushed.

* Library Upgrades

  * Upgrade rules_closure to forked version

    This fixes the "-parameters is not supported for target value 1.7. Use 1.8 or later."
    warning when building. See [PR 478](https://github.com/bazelbuild/rules_closure/pull/478).

  * [Issue 12448](https://bugs.chromium.org/p/gerrit/issues/detail?id=12448):
  Upgrade Guice to 4.2.3 and switch to using no-AOP Guice distribution

    This allows to more easily support newer JDK versions.

  * Upgrade asm to 7.2

  * Upgrade jackson-core to 2.11.0

  * Upgrade jetty to 9.4.27.v20200227

### 3.1.4

* Breaking Changes

  * The `LogThreshold` annotation is removed.

    The default log level for tests has been changed from DEBUG to INFO,
    and this annotation is no longer needed. It was originally introduced
    to allow classes to explicitly set their log level at level other than
    DEBUG.

    Plugins that use this annotation must be adjusted.

* New Features

  * Add support for Elasticsearch 7.6.x.

  * Include `upload-pack` metrics in the sshd log.

    In order to enable detailed performance and problem analysis,
    `upload-pack` metrics are now included in the sshd log.

  * Add new configuration setting `core.packedGitUseStrongRefs`.

    When set to true, this option enables using strong references to reference
    packfile pages cached in the WindowCache. If this option is set Java gc can
    no longer flush the WindowCache to free memory if the used heap comes close
    to the maximum heap size. On the other hand this provides more predictable
    performance.

  * Add new configuration setting `sendemail.denyrcpt`.

    This new setting works alongside the existing `sendemail.allowrcpt`, and
    allows to configure email addresses or domains that Gerrit may not send to.

  * Allow to format HTTP and SSH logs in JSON format.

    When `log.jsonLogging` is enabled, the HTTP and SSH logs are formatted
    as JSON, making it easier for them to be parsed. Note that the error log
    was already formatted in JSON when this option was enabled.

  * Add new metrics.

    Metrics are added for:

    * Jetty connections
    * JGit WindowCache and total load time for block cache entries
    * Available number of cores
    * Average system load for the last minute

    Refer to the metrics documentation for full details.

  * [Issue 11493](https://bugs.chromium.org/p/gerrit/issues/detail?id=11493):
  Add an "Edit" button to the diff view in the PolyGerrit UI.

  * Add support for fsharp in highlighting syntax in the PolyGerrit UI.

  * [Issue 12364](https://bugs.chromium.org/p/gerrit/issues/detail?id=12364):
  Add support for going to a specific line number in the inline editor.

  * Add prolog predicate to determine number of parents.

    The new predicate `commit_parent_count` can be used to detect merge
    commits.

  * Add `NamedFluentLogger`.

    `NamedFluentLogger` is an extension to Flogger that allows to create
    a logger with a given name rather than the name of the enclosing class.

  * [Issue 12444](https://bugs.chromium.org/p/gerrit/issues/detail?id=12444):
  Add support for `max_result_window` in Elasticsearch index configuration.

  * Add a Code Coverage layer and plugin API in the PolyGerrit UI.

    See [Chromium issue 939904](https://bugs.chromium.org/p/chromium/issues/detail?id=939904)
    for details.

  * Allow customizing the Gerrit httpd.listenUrl configuration in Docker using
  the HTTPD_LISTEN_URL environment variable.

* Library Upgrades

  * Upgrade jackson-core to 2.10.3

  * Upgrade Jetty to 9.4.24.v20191120, including a fix for supporting IPv6.

  * Upgrade JGit to v5.6.1.202002131546-r-15-g241557137

  * Upgrade rules_closure to forked version.

    This fixes the "-parameters is not supported for target value 1.7. Use 1.8 or later."
    warning when building. See [PR 478](https://github.com/bazelbuild/rules_closure/pull/478).

* Security Fixes

  * [Issue 12440](https://bugs.chromium.org/p/gerrit/issues/detail?id=12440):
  Fix the access-path for AbstractGitCommand subclasses.

    The access path for the Receive.currentUser in the receive-pack command
    was wrongly set to SSH_COMMAND instead of to GIT.
    This allowed project owners to force-update a ref using git-over-SSH
    without having en explicit permission for that.

* Bug Fixes

  * Fix size explosion of `All-Users` caused by draft comment removal.

    Modify draft comments generation so that, when removed, they to point to an
    empty parent.

  * [Issue 11772](https://bugs.chromium.org/p/gerrit/issues/detail?id=11772):
  Cancel deprecation of change identifiers that was planned since 2.16.

    Since 2.16 the documentation of change identifiers states that the
    identifiers other than `<project>~<numericid>` are deprecated and will
    be removed in a future release. Since then the identifiers have still
    not been removed and there is no clear plan to do so.

    It is likely that "deprecated" identifiers are still used in links in
    places where they can't be updated, for example in emails and forum
    posts. Due to this, and since continuing to support all of the types
    does not add any technical burden, ESC decided that the deprecation
    should be cancelled.

    The `change.api.allowedIdentifier` configuration setting is now
    obsolete and has been removed.

  * [Issue 3340](https://bugs.chromium.org/p/gerrit/issues/detail?id=3340):
  Fix internal server errors when setting project access permission with bad regex.

  * Fix removal of stale metrics from the metrics registry.

  * [Issue 12349](https://bugs.chromium.org/p/gerrit/issues/detail?id=12349):
  Fix time attribute of file entries in plugin artifacts.

  * Make assumption on number of query results explicit for change Id arguments.

    When a change Id passed as argument was resolved to multiple changes,
    the first returned change was arbitrarily used. Now an error will be raised
    and logged.

  * download-commands plugin: Set SSH default port to 22.

  * Document dependency from account deactivator to autoUpdateAccountActiveStatus
  and log a warning if the account deactivation task is configured but will not
  be scheduled.

  * Fix handling of ambiguous name in `visibleto` search predicate.

    If the `visibleto` search predicate was used with a display name that
    resolved to more than one account, the first account in the result was
    arbitrarily used. Now, this case will result in an error.

  * Fix a dependency injection runtime error in DeleteZombieDrafts program.

  * [Issue 12473](https://bugs.chromium.org/p/gerrit/issues/detail?id=12473):
  Fix broken links in Elasticsearch configuration documentation.

* PolyGerrit UI Fixes

  * [Issue 4616](https://bugs.chromium.org/p/gerrit/issues/detail?id=4616):
  Open commentlinks to changes on the same server in the same tab.

  * [Issue 12031](https://bugs.chromium.org/p/gerrit/issues/detail?id=12031):
  Fix issues with caching edited commit message.

  * Remove `target=_self` from commentlinks.

* Replication Plugin Fixes

  * Check nulls in firePendingEvents at startup.

    After a sudden reboot (for unknown reason) Gerrit at startup couldn't
    load because of NullPointerException.

  * Change default for the `replicateOnStartup` to false.

  * [Issue 12559](https://bugs.chromium.org/p/gerrit/issues/detail?id=12559):
  replicateOnStartup not loaded and always considered as false.

### 3.1.3

* New Features

  * Include request description in HTTP thread names.

    The HTTP worker threads had generic names like `HTTP-100`, `HTTP-101`,
    etc. While we could conclude from the stack trace what this thread was
    doing, we missed some important information like repository name, user name,
    etc.

    The HTTP threads now have descriptive names. For example, if there is an
    ongoing git-fetch operation we will see a thread named like:
    `HTTP POST /a/myProject/git-upload-pack (johndoe from 10.87.75.169)`.

    This makes the naming consistent with SSHD threads, which are named like:
    `SSH git-upload-pack /myProject (johndoe)`.

  * New metrics for Jetty threadpool.

    The new metrics are exposed under `http/server/jetty/*`.

  * Utility program to delete zombie draft comment refs.

    Deletion of draft comment refs was broken until 2.16.14, resulting in
    draft comment refs not getting deleted properly. Although it has been fixed,
    it's still possible that zombie refs exist from previous versions. The
    new site program `DeleteZombieCommentsRefs` can be used to remove them.

  * Highlight `WORKSPACE` and `BUILD.bazel` files as Python in the PolyGerrit UI.

* Breaking Changes

  * The `MessageOfTheDay` extension point is removed.

    The `MessageOfTheDay` functionality was not ported to the PolyGerrit-UI and
    the `MessageOfTheDay` extension point was removed with the 3.1.3 release.
    However, the JS API provides the `banner` entrypoint for plugins to add messages
    to the UI. Plugins that were previously using the `MessageOfTheDay` extension
    point have to be adapted accordingly.

* Bug Fixes

  * [Issue 12097](https://bugs.chromium.org/p/gerrit/issues/detail?id=12097):
  Fix migration to NoteDb when orphan changes exist.

    In the case where a change belonged to a repository that did not exist,
    the migration failed.

  * [Issue 9296](https://bugs.chromium.org/p/gerrit/issues/detail?id=9296):
  Fix wrong diff of commit message between different patch sets of a merge commit.

  * [Issue 7969](https://bugs.chromium.org/p/gerrit/issues/detail?id=7969):
  Fix internal server error when diffing `MERGE_LIST` between different patch sets
  of a merge commit.

  * [Issue 10397](https://bugs.chromium.org/p/gerrit/issues/detail?id=10397):
  Don't send notification email when publishing a change edit on a WIP change.

  * [Issue 12243](https://bugs.chromium.org/p/gerrit/issues/detail?id=12243):
  Fix unexpected deactivation of service user accounts.

  * Fix editing name and email for service user accounts.

  * Fix internal server error when a change edit includes an invalid file path.

    Invalid file paths are now rejected as '400 Bad Request'.

  * Fix internal server error when giving an invalid merge strategy to the
  'Create Merge Patch Set' REST endpoint.

  * Fix a resource leak in the 'Get Patch' REST endpoint.

  * Don't check for conflicting refs when deleting a ref; improve performance of
  migration to schema 167.

    The migration to schema 167 involves deletion of refs. The performance was
    poor for large installations (for example 30k user refs and 20k groups)
    because the ref deletion implementation was doing an unnecessary check for
    conflicting refs.

  * Fix setting `_moreChanges` to the wrong value in change query REST results.

  * Upgrade highlight-js to get various fixes in source code highlighting:

    * fix(makefile) fix double relevance for assignments
    * (xml) expand and improve document type highlighting
    * fix(kotlin): fix termination of """ string literals
    * (cpp) Add additional keywords
    * Backslash is not used to escape in strings in standard SQL
    * (javascript) fix jsx self-closing tag issues
    * enh(ini) support arrays and much cleaner grammar
    * (javascript) support jsx fragments

* PolyGerrit UI Fixes

  * [Issue 11980](https://bugs.chromium.org/p/gerrit/issues/detail?id=11980):
  Fix handling of LDAP groups containing a dot in the PolyGerrit permissions screen.

  * [Issue 12197](https://bugs.chromium.org/p/gerrit/issues/detail?id=12197):
  Fix rendering of commentlinks using `link`.

  * [Issue 11697](https://bugs.chromium.org/p/gerrit/issues/detail?id=11697):
  Fix rendering of commentlinks without leading whitespace.

  * [Issue 12224](https://bugs.chromium.org/p/gerrit/issues/detail?id=12224):
  Honor the date format preference when displaying dates.

  * [Issue 12184](https://bugs.chromium.org/p/gerrit/issues/detail?id=12184):
  Fix link in blame annotation to link directly to the commit.

  * [Issue 12108](https://bugs.chromium.org/p/gerrit/issues/detail?id=12108):
  Add missing 'Page ...' on pagination links in the repository list.

  * Fix the size of the commit message box.

  * Fix a parse error on the repository list.

  * Fix multiple triggers when `shift-r` is held.

  * Wrap filenames onto two lines in the file list if the filename is too long.

  * Add a right margin to the search bar.

    This creates some space between the search bar and the `header-browse-source`
     endpoint where you often see a 'Repositories' link.

  * Replace 'Menlo' font with 'SF Mono'.

    'Menlo' was replaced by 'SF Mono' from Mac OS 10.11, and 'Menlo' does not render
    symbols and characters correctly.

* Other Changes

  * Upgrade JGit to v5.6.0.201912101111-r-31-g3d59d1b80.

  * Upgrade jackson-core dependency to 2.10.2

  * Improve logging when a metadata update fails.

  * Update [external Ids documentation](http://gerrit-documentation.storage.googleapis.com/Documentation/3.1.3/config-accounts.html#external-ids)
   with information on how to find the sha1 of an external Id and how to show the
   corresponding change note.

### 3.1.2

* New Features

  * Include thread name in the HTTPD and SSHD logs.

    Having thread name in the HTTPD and SSHD logs makes it easier to match entries
    from the error log. The error log entries already contain the thread name, so
    with the thread name included in each entry in the HTTPD and SSHD logs, we have
    more data to match an error to a request than just the timestamp.

* PolyGerrit UI Fixes

  * [Issue 12067](https://bugs.chromium.org/p/gerrit/issues/detail?id=12067):
  Fix blank screen after upgrading.

* Other Fixes

  * [Issue 12070](https://bugs.chromium.org/p/gerrit/issues/detail?id=12070):
  Fix internal server error on git over HTTP calls when SSHD is enabled.

    Double cleanup of the request context caused an internal server error on
    push or fetch via git over HTTP.

  * Fix generation of SSH keys with empty passphrase.

    The `-N` option of `ssh-keygen` was correctly used for generation of RSA keys,
    but for other types `-P` was used.

  * Extend documentation of external Ids to include examples of how to generate
  the sha1 of an external Id and how to show the git note of the Id.


### 3.1.1

* New Features

  * [Issue 11973](https://bugs.chromium.org/p/gerrit/issues/detail?id=11973):
  Add copy-to-clipboard for generated HTTP password.

  * Add support for doctag in PolyGerrit UI syntax highlighter.

  * Add an event interface in the PolyGerrit API.

  * Add support for Elasticsearch 7.5.

  * Add documentation of how to perform backups of Gerrit.

* PolyGerrit UI Fixes

  * [Issue 12024](https://bugs.chromium.org/p/gerrit/issues/detail?id=12024):
  Fix undefined branch in create-destination-dialog.

  * [Issue 11969](https://bugs.chromium.org/p/gerrit/issues/detail?id=11969):
  Fix tab index in reply dialog.

  * [Issue 11993](https://bugs.chromium.org/p/gerrit/issues/detail?id=11993):
  Stop loading fonts from external resources.

  * [Issue 11984](https://bugs.chromium.org/p/gerrit/issues/detail?id=11984):
  Fix top menu bar on iOS.

  * [Issue 8282](https://bugs.chromium.org/p/gerrit/issues/detail?id=8282):
  Avoid browser caching for diff on edit patch.

  * [Issue 9444](https://bugs.chromium.org/p/gerrit/issues/detail?id=9444):
  Fix syntax highlighting for multi-char char constants.

  * [Issue 12020](https://bugs.chromium.org/p/gerrit/issues/detail?id=12020):
  Fix 'New Contributor Agreement' screen.

  * Fix `gr-syntax-params` css class.

  * Fix overflow of branch name in change list.

* Other Fixes

  * [Issue 11989](https://bugs.chromium.org/p/gerrit/issues/detail?id=11989):
  Fix internal server error when pushing over SSH with git protocol v2.

  * [Issue 11962](https://bugs.chromium.org/p/gerrit/issues/detail?id=11962):
  Fix advertisement of `refs/meta/config` in git protocol v2 when client does
  not have access to it.

  * [Issue 11986](https://bugs.chromium.org/p/gerrit/issues/detail?id=11986):
  Fix fetching individual ref with git protocol v2.

  * [Issue 7645](https://bugs.chromium.org/p/gerrit/issues/detail?id=7645):
  Fix thread deadlock when loading accounts from the account cache.

    Replacing Guava caches with Caffeine reduces the chances of having the
    deadlocks and improves the cache performance.

  * [Issue 11918](https://bugs.chromium.org/p/gerrit/issues/detail?id=11918):
  Fix internal server error when deleting a tag or branch by git push.

  * [Issue 11650](https://bugs.chromium.org/p/gerrit/issues/detail?id=11650):
  Fix reindexing of changes after project is deleted in the `delete-project` plugin.

  * Disallow deleting the `refs/meta/config` branch via the 'Delete Branches'
  REST API.

  * Disallow deleting the `HEAD` ref via the 'Delete Branches' REST API.

  * Allow empty base revision in the 'Create Branch' and 'Create Tag'
  REST APIs.

  * Fix deletion of draft comment refs.

    In some situations, draft comment refs were not properly deleted
    but left empty. This resulted in unused draft refs persisting in
    the `All-Users` repository, polluting the namespace. Published draft
    comments as well as deleted draft comments were kept in the history
    of the draft ref, keeping them alive for GC, and causing a steady
    increase of repository size.

  * Use correct content type `text/plain` instead of `plain/text` in 'Create SSH Key'
  REST API.

  * Fix handling of interactive/batch users in the QoS filter.

    For the git-over-http requests this filter didn't work properly because the
    basic authentication happened later in the filter chain and at the moment when
    the QoS filter was invoked the current user was not yet set.

  * Add project name to headers of outgoing change emails.

  * Fix and expand documentation of `ref-update` and `commit-received` hooks
  in the hooks plugin.

  * Upgrade JGit to v5.6.0.201912041214-rc1
