# Gerrit 2.14

Download: **[2.14.11](https://gerrit-releases.storage.googleapis.com/gerrit-2.14.11.war)**
| [2.14.10](https://gerrit-releases.storage.googleapis.com/gerrit-2.14.10.war)
| [2.14.9](https://gerrit-releases.storage.googleapis.com/gerrit-2.14.9.war)
| [2.14.8](https://gerrit-releases.storage.googleapis.com/gerrit-2.14.8.war)
| [2.14.7](https://gerrit-releases.storage.googleapis.com/gerrit-2.14.7.war)
| [2.14.6](https://gerrit-releases.storage.googleapis.com/gerrit-2.14.6.war)
| [2.14.5.1](https://gerrit-releases.storage.googleapis.com/gerrit-2.14.5.1.war)
| [2.14.4](https://gerrit-releases.storage.googleapis.com/gerrit-2.14.4.war)
| [2.14.3](https://gerrit-releases.storage.googleapis.com/gerrit-2.14.3.war)
| [2.14.2](https://gerrit-releases.storage.googleapis.com/gerrit-2.14.2.war)
| [2.14.1](https://gerrit-releases.storage.googleapis.com/gerrit-2.14.1.war)
| [2.14](https://gerrit-releases.storage.googleapis.com/gerrit-2.14.war)

Documentation: **[2.14.11](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.11/index.html)**
| [2.14.10](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.10/index.html)
| [2.14.9](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.9/index.html)
| [2.14.8](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.8/index.html)
| [2.14.7](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.7/index.html)
| [2.14.6](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.6/index.html)
| [2.14.5.1](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.5.1/index.html)
| [2.14.4](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.4/index.html)
| [2.14.3](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.3/index.html)
| [2.14.2](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.2/index.html)
| [2.14.1](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.1/index.html)
| [2.14](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14/index.html)

[TOC]

## Release Highlights

* Changes can be assigned to specific users
* Open and Abandoned changes can be deleted
* HTML emails and new templating framework
* Support for receiving review comments by email
* New [Polymer](https://www.polymer-project.org/) based user interface
* Support for elliptic curve/ed25519 SSH keys
* Secondary index for groups
* Experimental support for Elasticsearch as secondary index **from [2.14.8](#2.14.8)**

## Important Notes

### Schema Changes

This release contains schema changes. To upgrade:

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

### Reindex for new groups index

Gerrit 2.14 introduces a new secondary index for groups. The initial version
of this index must be created by running the offline reindex before starting
Gerrit:

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

Note that it is not necessary to reindex the changes and accounts indexes
offline. These will automatically be reindexed by the online reindexer
after starting Gerrit.

### Java 8

Gerrit now requires Java Runtime Environment (JRE) version 8. It is no longer
possible to run Gerrit on JRE 7 and it is not compatible with JRE 9 or newer
yet. For more information, see
[Issue 7843](https://bugs.chromium.org/p/gerrit/issues/detail?id=7843).

### Bouncy Castle Libraries

The [Bouncy Castle Crypto API libraries](https://www.bouncycastle.org/) are now
distributed in the Gerrit `.war` file rather than being downloaded during site
initialization. When upgrading from a previous version of Gerrit, previously
downloaded Bouncy Castle `.jar` files remaining in the site's `/lib` folder will
be disabled by appending `.disabled` to the file name.

### HTTP Digest Authentication Removed

Support for HTTP Digest Authentiation is removed.

With the move to NoteDB, the per-account data (including the HTTP password) will
be stored in a branch in the `All-Users` repo, where it is subject to Gerrit ACLs.
Since these are notoriously hard to setup correctly, we want to avoid storing the
password in plaintext.

Existing passwords will be migrated to a hashed password during site initialization
when upgrading from an earlier version of Gerrit.

### Evaluation of BLOCK permission rules has changed

An exclusive ALLOW permission now has priority over a BLOCK permission when
both permissions are defined on the same project.

This means an exclusive ALLOW rule now overrules BLOCK rules on the same
project.

BLOCK rules still cannot be overruled by child projects.

This change makes it possible to allow a permission for a specific ref and to
block the same permission for all other refs. For example, it is now possible to
allow all users to push changes for review, but to block all direct pushes:

```
  [access "refs/*"]
    push = block group Anonymous Users
  [access "refs/for/*"]
    exclusiveGroupPermissions = push
    push = group Registered Users
```

### Deprecation of Velocity Email Templates

This release deprecates the use of Velocity mail templates. In a future release
support will be removed and it will be necessary to upgrade custom mail templates
to Soy files.

### Tag Permissions

The permissions "Push Annotated Tag" and "Push Signed Tag" are renamed to
"Create Annotated Tag" and "Create Signed Tag". Existing project configurations
using the old permission names will be migrated during site initialization.

### Behavior change in `ref-update` hook

The `ref-update` hook is now only invoked for direct ref updates, i.e. branch
creation, branch deletion, and updates (fast-forward and non-fastforward) via
direct push. It is not invoked on commits received for review, or on submit of
changes.

A new hook named `commit-received` is added, which is invoked when a commit is
received for review, and can be used to prevent reviews from being created.

A new hook named `submit` is added **in [2.14.9](#2.14.9)**, which is invoked
when a user attempts to submit a change, and can be used to prevent the submit.

Sites using the `ref-update` hook to validate changes pushed for review, or to
validate submits, should migrate to the `commit-received` and `submit` hooks.

### Updated primary key on JdbcAccountPatchReviewStore {#patch-review-primary-key}

In version 2.14.4 the fields in the JdbcAccountPatchReviewStore primary key
are reordered to improve performance when clearing the reviewed flag for a
patch set.

Sites that have already upgraded from an earlier version to 2.13, or to a 2.14.x
version before 2.14.4, and want to take advantage of this performance improvement,
should manually drop and recreate the primary key as follows:

```
  # drop the key
  ALTER TABLE account_patch_reviews
  DROP CONSTRAINT primary_key_account_patch_reviews;
  # recreate the key
  ALTER TABLE account_patch_reviews
  ADD CONSTRAINT primary_key_account_patch_reviews
  PRIMARY KEY (change_id, patch_set_id, account_id, file_name);
```
Note that this is optional. The site will continue to work without this update.

The update is not necessary when upgrading directly to 2.14.4 from a version
earlier than 2.13, as the primary key will be created with the updated order
anyway.

## New Features

### Change Assignee

Changes may be assigned to a specific user. This allows a workflow where the
user that is assigned to a change is responsible for reviewing the change and/or
passing the assignment on to another user.

In the UI, changes assigned to the currently logged in user are highlighted.

A new `assignee:` search predicate allows to find changes assigned to a given
user.

### Delete Changes

* [Issue 4509](https://bugs.chromium.org/p/gerrit/issues/detail?id=4509):
Open and Abandoned changes can be deleted by administrators and by users who have
the
[Delete Own Changes](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/access-control.html#category_delete_own_changes)
permission.

### Emails

#### HTML Emails

Gerrit email messages are made easier to read by sending HTML content parts in
addition to the existing text email content. This is enabled by default, and
can be disabled by setting
[`sendemail.html`](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/config-gerrit.html#sendemail.html)
to `false`.

Users can opt to always receive plaintext emails by setting the
[Email Format preference](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/intro-user.html#email-format).

#### Closure Templates

Mail templates can now be written using
[Closure Templates (Soy)](https://developers.google.com/closure/templates/). Mail
templates written in Velocity (VTL) are deprecated but still supported. Support
for VTL will be dropped in a future release.

#### Review Comments by Email

Gerrit now supports
[receiving review comments by email](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/intro-user.html#reply-by-email).

### Secondary Index with Elasticsearch

It is possible to enable Elasticsearch as a secondary index by setting
[`index.type`](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/config-gerrit.html#index.type)
to `ELASTICSEARCH` and configuring the
[Elasticsearch specific configuration parameters](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/config-gerrit.html#elasticsearch).

Note that the Elasticsearch implementation is still considered experimental
and it is not advised to use it for production systems.

### User Interface

* [Issue 3944](https://bugs.chromium.org/p/gerrit/issues/detail?id=3944):
Tags can be created and deleted via the Tags screen in the UI.

  Although the [REST API](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-projects.html#create-tag)
  supports creation of both lightweight and annotated tags from 2.14, the GWT UI
  allows for annotation with 2.14.4 or later.

* For merge commits, the list of commits that will be merged into the destination
branch is included as the `/MERGE_LIST` magic file which is shown as `Merge List`
in the UI.

### REST API

#### Accounts

* [Get Account Status](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-accounts.html#get-account-status)
* [Set Account Status](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-accounts.html#set-account-status)
* [Get Account External IDs](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-accounts.html#get-account-external-ids)
* [Delete Account External IDs](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-accounts.html#delete-account-external-ids)

#### Changes

* [Get Assignee](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#get-assignee)
* [Get Past Assignees](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#get-past-assignees)
* [Set Assignee](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#set-assignee)
* [Delete Assignee](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#delete-assignee)
* [List Change Robot Comments](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#list-change-robot-comments)
* [Create Merge Patch Set](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#create-merge-patch-set-for-change)
* [Get Description](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#get-description)
* [Set Description](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#set-description)
* [Get Merge List](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#get-merge-list)
* [Get Submit Preview](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#submit-preview)
* [List Revision Reviewers](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#list-revision-reviewers)
* [List Revision Votes](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#list-revision-votes)
* [Delete Revision Vote](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#delete-revision-vote)

#### Groups

* [Query Groups](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-groups.html#query-groups)
* [Index Group](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-groups.html#index-group)

#### Projects

* [Delete Tag](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-projects.html#delete-tag)
* [Delete Tags](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-projects.html#delete-tags)

#### Revisions

* [List Robot Comments](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#list-robot-comments)
* [Get Robot Comment](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14/rest-api-changes.html#get-robot-comment)

### New User Interface ("PolyGerrit")

Gerrit now includes a new user interface, referred to as "PolyGerrit", based on
[Polymer](https://www.polymer-project.org/).

The UI can be switched between PolyGerrit and GWT by clicking the "New UI" and
"Old UI" links in the site footer. Alternatively, the UI can be switched by
adding `?polygerrit=1` or `?polygerrit=0` to the URL.

Note that PolyGerrit is still under development. Most use cases are supported,
but there are still some missing features compared to the GWT UI.

### SSHD

* [Issue 4507](https://bugs.chromium.org/p/gerrit/issues/detail?id=4507):
Add support for elliptic curve/ed25519 SSH keys.

### Creating Changes for Merged Commits

Normally, changes can be reviewed only before they are being merged. This new
feature allows for post-submit review of commits by creating a new merged
change, by using the
['merged' push option](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14/user-upload.html#merged).

## Bugfixes

* [Issue 5234](https://bugs.chromium.org/p/gerrit/issues/detail?id=5234):
Fix SSH GSSAPI authentication.

* [Issue 5739](https://bugs.chromium.org/p/gerrit/issues/detail?id=5739):
Prevent `ref-update` hook from being invoked on every commit when pushing
multiple commits.

  Instead of being invoked on every commit received, the `ref-update` hook
  is now invoked before the ref update operation is finalized. Note that
  the hook is no longer invoked on commits pushed for review or on changes
  that are merged. It is invoked for creation/deletion of refs, and for
  ref updates caused by direct pushes (i.e. bypassing review).

  The previous behavior of the `ref-update` hook is moved into a new hook
  named `commit-received`. A new parameter `--cmdref` is added, and the
  special handling of `refs/for` and `refs/changes` is removed.

  Sites using the `ref-update` hook should rename the hook file to
  `commit-received`.

## Dependency Updates

* Update auto-value to 1.4

* Update Bouncy Castle to 1.56

* Update codemirror to 5.25.0

* Update commons-compress to 1.12

* Update Guava to 21.0 (updated to 22.0 in 2.14.6)

* Update Guice to 4.1.0

* Update GWT to 2.8.0 (updated to 2.8.2 in 2.14.6)

* Update gwtjsonrpc to 1.11

* Update gwtorm to 1.17

* Update JavaEWAH to 1.1.6

* Update JGit to 4.7.0.201704051617-r

* Update jsch to 0.1.54

* Update Lucene to 5.5.2

* Update mina to 2.0.16

* Update ow2-asm to 5.1

* Update prolog-cafe to 1.4.2

* Update SSHD to 1.4.0


## Bugfix Releases

### 2.14.11 {#2.14.11}

* Fix display of "Delete Changes" permission in access screen on GWT UI.

* Fix permission check when deleting a single branch with the "Delete Branches"
REST endpoint.

* Include cause in exception when failing to save config in the "Set Config"
REST endpoint.

* [Issue 9482](https://bugs.chromium.org/p/gerrit/issues/detail?id=9482):
Fix staleness checker for URL-encoded project names.

* [Issue 9153](https://bugs.chromium.org/p/gerrit/issues/detail?id=9153):
Upgrade JGit to 4.7.2.201807261330-r.

  This version includes several fixes including a fix for issue 9153 which
  prevented querying for filenames with special characters, and fixes
  related to cleaning up ref directories after running GC.

  It also includes the fix
  [Honor trustFolderStats also when reading packed-refs](https://git.eclipse.org/r/#/c/112015/).
  Users should note that for repositories with a high number of references
  (for example in excess of 300K refs) and in a server with high traffic,
  this solution may not scale well and should be tested carefully.

* Upgrade guice to 4.2.0.

  Guice [version 4.2.0](https://github.com/google/guice/wiki/Guice42)
  includes performance improvements.

* Upgrade metrics-core to 4.0.3.

* Upgrade elasticsearch-rest-client to 6.3.2.

### 2.14.10 {#2.14.10}

* Allow to assign "Delete Own Changes" permission to "Change Owners".

  It was only possible for a user to delete their own change if they were
  a member of a group that was assigned the "Delete Own Changes" permission.

  This was counter-intiuitive as it was necessary to either create a specific
  group, or assign the permission to "Registered Users".

  It is now possible to assign this permission to the "Change Owners"
  virtual group.

* [Issue 9354](https://bugs.chromium.org/p/gerrit/issues/detail?id=9354):
Add "Delete Changes" permission.

  It was only possible for a user to delete another user's change if they
  were a member of a group that was assigned the "Administrate Server"
  permission.

  A new "Delete Changes" permission is added. This permission can be
  assigned to a group, or to the "Project Owners" virtual group.

* [Issue 9345](https://bugs.chromium.org/p/gerrit/issues/detail?id=9345):
Fix creation of plugin log file when `log4j.configuration` is set

  When the environment variable `log4j.configuration` is set, log files
  defined by plugins were not created because the appender couldn't be
  found.

* Fix repeated `Change-Id` in error message when `Change-Id` line is not
in the footer.

* Add `ChangeReportFormatter` extension point for customizing the report output
from `git push`.

* [Issue 9373]:(https://bugs.chromium.org/p/gerrit/issues/detail?id=9373):
Align Elasticsearch connection configuration with Elasticsearch REST client.

  In 2.14.9 the JEST client was replaced with the native Elasticsearch REST
  client, but several settings that were only used by JEST were not removed.

  The following settings are now removed:

  * `elasticsearch.requestCompression`
  * `elasticsearch.connectionTimeout`
  * `elasticsearch.maxConnectionIdleTime`
  * `elasticsearch.maxReadTimeout`
  * `elasticsearch.maxTotalConnection`

  A new setting `elasticsearch.maxRetryTimeout` is added. If not configured,
  it defaults to 30000 ms which is the default used by the REST client.

* [Issue 9372](https://bugs.chromium.org/p/gerrit/issues/detail?id=9372):
Simplify the configuration of Elasticsearch servers.

  Instead of specifying each server in a separate `[elasticsearch "name"]`
  section, with separate values `protocol`, `hostname`, and `port`, the
  servers are now configured as a list of `server` values in the
  `[elasticsearch]` section.

  This also fixes [Issue 9383](https://bugs.chromium.org/p/gerrit/issues/detail?id=9383)
  where a "default" server `http://localhost:9200` would be added by
  the site initialization even if other servers were already explicitly
  configured.

  During startup the list of configured Elasticsearch servers is logged
  at info level.

* [Issue 9146](https://bugs.chromium.org/p/gerrit/issues/detail?id=9146) and
[Issue 9147](https://bugs.chromium.org/p/gerrit/issues/detail?id=9147):
Fix Elasticsearch queries for results with substrings in keywords.

  Doing a query that involved the characters "." and "_" from full text fields
  did not include results with keywords as a substring. This behavior was
  different from Lucene, where these two characters are mapped to the space
  character (" ") so that the query returns keywords separated by them.

* Allow to omit the `elasticsearch.username` setting.

  If `elasticsearch.password` is specified, the `username` can be omitted and
  it will default to `elastic` which is the default username configured
  when running Elasticsearch with security enabled.

* Upgrade Elasticsearch REST client to 6.3.1.

* Upgrade commons-io to 2.2.

  This version is needed by the gitblit plugin.

### 2.14.9 {#2.14.9}

* [Issue 6094](https://bugs.chromium.org/p/gerrit/issues/detail?id=6094)
and [Issue 9112](https://bugs.chromium.org/p/gerrit/issues/detail?id=9112):
Add support for Elasticsearch versions 5 and 6.

  Support is added for Elasticsearch versions 5.6 (tested with versions 5.6.9
  and 5.6.10), 6.2 (tested with version 6.2.4) and 6.3.0.

  Version 2.4 is still supported (tested with version 2.4.6).

  Instead of using the 'Jest' client to communicate with Elasticsearch, the
  Elasticsearch low level API is now used.

  Support for Elasticsearch is still considered experimental, and is not
  recommended for production use.

* Allow to replace the default H2 persistent cache with a custom implementation.

  The default H2 persistent cache can be replaced by a module that implements
  the `CacheImpl` interface.

  An implementation is provided for postgresql.

* [Issue 9245](https://bugs.chromium.org/p/gerrit/issues/detail?id=9245):
Return the correct information in JSON response after moving a change.

  When moving a change by the REST API, the JSON response contained the
  branch name of the original destination rather than the new destination.

* [Issue 8916](https://bugs.chromium.org/p/gerrit/issues/detail?id=8916):
Improve performance of `ownerin:` predicate for internal groups.

* Fix omission of 'branch' values when saving project config.

  The 'branch' values were omitted when saving the config, resulting in them
  being lost.

* [Issue 9195](https://bugs.chromium.org/p/gerrit/issues/detail?id=9195):
Strip comment lines out of commit message when creating change.

  When a change was created from the UI (or via the 'Create Change' REST
  API), and the commit message consisted of only a subject beginning with
  a hash character (`#`), the change was created with a zero Change-Id.

  This was beause lines beginning with `#` are considered to be comments,
  and are stripped from the commit message by JGit before computing the
  Change-Id for the commit.

  Before attempting to create the change, Gerrit now strips out any comment
  lines from the commit message and returns an error if this results in
  the commit message being empty.

* Fix internal server error when generating email sender name for
non-existing account.

* Sanitize values of `user.name` and `user.email` from `gerrit.config`.

  The `user.name` and `user.email` settings were being read as-is, which
  would allow them to be configured with values that may interfere with
  standard email name/address parsing.

* Fix the default text in the 'Password' field on the 'HTTP Password' screen.

  The default text said "(click 'generate' to revoke an old password)" but the
  label of the button is actually "Generate Password".

* Add reporting of work queue related metrics.

  Metrics are reported for core work queues. For work queues created by plugins,
  metrics are not reported.

* Fix double creation of SSH command execution queues.

* Don't trim leading whitespace from about.md content.

  Leading spaces were trimmed, resulting in preformatted code blocks not
  being rendered properly.

* Only abort online reindex if more than 50% of projects failed.

  Reindexing would be aborted if a single project failed, for example if
  the repository could not be opened.

* Fix user permission checks in APIs when invoked via the GerritApi.

  Actions were incorrectly being denied because the user validation
  was comparing user object instances rather than the account ID that
  they represented.

* Various logging improvements.

* Various documentation improvements.

* Hooks plugin
  * [Issue 9015](https://bugs.chromium.org/p/gerrit/issues/detail?id=9015):
  Add a `submit` hook

    The `submit` hook is invoked synchronously when a change is submitted. If
    it returns a non-zero exit status, a `MergeValidationException` is thrown
    and the submit is prevented.

    This adds back the ability to block submit by a hook which was removed in
    version 2.14 due to the reworking of the `ref-update` hook behavior.

  * Fix repeated instantiation of the `ref-update` and `commit-received` hooks.

    The hooks were not singletons, which caused new instances to be created
    on every invocation.

  * Wrap account ID in quotes when passing as hook argument.

  * Improve logging to make it easier to track down hook execution problems.

    When a hook exits with an error status (i.e. non-zero), or times out, an error
    is now emitted to the log. Previously there was no log on timeout, and the exit
    status was only logged at debug level.

    The configured hooks path and resolved path for hook files is logged at info
    level.

    When a hook file does not exist, a message is logged at debug level.

  * Improve documentation

    * Expand and improve documentation related to debugging hooks.

    * Restructure the hooks page to separate synchronous and asynchronous hooks, and
    add a table of contents.

### 2.14.8 {#2.14.8}

* Elasticsearch is now available for early adopters as a secondary index.

  * The implementation is limited to version 2.4.x of Elasticsearch.

  * See the list of [fixed issues](#elasticsearch) below for more details.

* Expose plugin guice injectors in plugin test classes that derived from
`LightweightPluginDaemonTest` base class.

* [Issue 5181](https://bugs.chromium.org/p/gerrit/issues/detail?id=5181):
Limit assignee suggestion to users that can see the change.

* [Issue 8468](https://bugs.chromium.org/p/gerrit/issues/detail?id=8468):
Allow plugin configuration to be inherited by merging with parent config.

  When using the `ProjectLevelConfig.getWithInheritance` method, any config
  values from the parent are overridden by those of the child. This is not
  useful for plugins like the reviewers plugin where the child configuration
  should be merged with the parent's.

  To solve this, a new variant of the `getWithInheritance` method is added,
  which merges the configs rather than overriding.

* [Issue 8557](https://bugs.chromium.org/p/gerrit/issues/detail?id=8557):
Fix gitweb documentation to clarify that `gitweb.type` must be set to `gitweb`.

* [Issue 8558](https://bugs.chromium.org/p/gerrit/issues/detail?id=8558):
Fix internal server error when detecting change kind of root commit.

* [Issue 8715](https://bugs.chromium.org/p/gerrit/issues/detail?id=8715):
Fix internal server error when invalid index name is given to the `index start`
or `index activate` command.

* [Issue 8731](https://bugs.chromium.org/p/gerrit/issues/detail?id=8731):
Improve the wording in the revert notification email template.

* [Issue 8589](https://bugs.chromium.org/p/gerrit/issues/detail?id=8589):
Remove approval requirement search from basic search documentation.

  Using approval requirements in basic search, for example `Code-Review=2`
  without the explicit `label:` predicate can never work as expected because
  the query is also considered as a comment search, which matches on all
  changes that have received a vote on that label, regardless of the label
  score.

  The section about approval requirements is removed from the basic search
  documentation to avoid confusion. It is also now recommended to use explicit
  query predicates when predictable results are desired.

* [Issue 8597](https://bugs.chromium.org/p/gerrit/issues/detail?id=8597):
Clarify the behavior of `ownerin:` and `reviwerin:` queries.

  When the ownerin: or reviewerin: predicate is used in a query without any
  additional explicit index predicate, it will default to only include changes
  in status 'OPEN'.

* Fix internal server error when using the `query:` search with a non-existing
named query.

* Fix internal server error when group UUID cannot be resolved when getting audit log.

* Display group UUID in group audit log if group name is missing.

  The group name can be missing if there is no group backend that handles the
  group. This can happen for example if a plugin that handled the group was
  removed.

* Allow graceful rolling restarts.

  Add a new setting, `httpd.gracefulStopTimeout`, which allows to set a
  maximum period of time for the daemon to preserve incoming connections,
  before starting the graceful shutdown process.

* Elasticsearch {#elasticsearch}

  * [Issue 8523](https://bugs.chromium.org/p/gerrit/issues/detail?id=8523):
  Fix configuration of elasticsearch during site initialization.

    When the site was initialized with Elasticsearch as the secondary index,
    the `elasticsearch.prefix` was not set, and Elasticsearch server-specific
    settings were not correctly set under `elasticsearch.name.protocol`, etc.

  * [Issue 8527](https://bugs.chromium.org/p/gerrit/issues/detail?id=8527):
  Improve documentation of `index.maxLimit` for Elasticsearch.

    When using Elasticsearch, `index.maxLimit` should not exceed the value
    of `index.max_result_window` configured on the Elasticsearch server.

  * [Issue 8553](https://bugs.chromium.org/p/gerrit/issues/detail?id=8553):
  Fix reindexing of an already initialized site with Elasticsearch.

  * [Issue 8690](https://bugs.chromium.org/p/gerrit/issues/detail?id=8690):
  Allow to use the `index start` and `index activate` ssh commands with Elasticsearch.

  * [Issue 8525](https://bugs.chromium.org/p/gerrit/issues/detail?id=8525):
  Fix setting of changed lines in the change info.

  * [Issue 8588](https://bugs.chromium.org/p/gerrit/issues/detail?id=8588):
  Fix setting the star icon status in the change info.

  * Change default Elasticsearch prefix to `gerrit_`.

### 2.14.7 {#2.14.7}

* [Issue 7652](https://bugs.chromium.org/p/gerrit/issues/detail?id=7652):
Avoid intermediate migration state for external IDs.

  In the 2.14 series the accounts are not completely migrated to the git
  backend and are written to both the git backend and database backend. This
  results in risk of the backends getting out of sync.

* Fix `account_patch_reviews` for mysql.

  Creation of the `account_patch_reviews` table failed on mysql due to the
  `file_name` column being too long.

* [Issue 8053](https://bugs.chromium.org/p/gerrit/issues/detail?id=8053):
Don't fire `ref-updated` event twice for new patch sets.

* [Issue 8478](https://bugs.chromium.org/p/gerrit/issues/detail?id=8478):
Fix "concurrent modification" exception when posting reviews.

* [Issue 8279](https://bugs.chromium.org/p/gerrit/issues/detail?id=8279):
Always check for `Change-Id` in subject line during commit validation:

  A commit with an empty commit message except for a `Change-Id` line in
  the subject was only rejected if "Require Change-Id" was enabled.

* [Issue 8280](https://bugs.chromium.org/p/gerrit/issues/detail?id=8280):
Fix validation of `Change-Id` line when creating changes from the UI:

  When a change was created via the UI (or via the REST API), the `Change-Id`
  footer line was not validated. This resulted in it being possible to
  create a change with an invalid `Change-Id`.

* [Issue 8284](https://bugs.chromium.org/p/gerrit/issues/detail?id=8284):
Fix unnecessary addition of `Change-Id` to changes created from the UI:

  When a change was created via the UI (or via the REST API), a `Change-Id`
  line was added without first checking if one already existed.

* [Issue 8299](https://bugs.chromium.org/p/gerrit/issues/detail?id=8299):
Fix insertion of `Signed-off-by` line after existing footer lines in changes
created from the UI.

  When a change was created via the UI (or via the REST API) and the
  commit message included a `Change-Id` line or any other footer line,
  the `Signed-off-by` footer was appended to the end of the last footer
  instead of on a new line.

* [Issue 8390](https://bugs.chromium.org/p/gerrit/issues/detail?id=8390):
Fix adding a group as reviewer when group name partially matches a username.

* Prevent possible internal server error when creating new email.

* Fix validation of email address when creating new email from a plugin.

  When a plugin created a new email, the address was not validated.

* Trim leading and trailing whitespace from email address when adding
a new email address to an account.

* Adjust `commit-msg` hook to awk behavior change on Cygwin/MSYS.

  Awk has stopped automatically stripping `\r` on Windows since
  version 4.2.0.

* Improve hooks plugin documentation

  Add documentation of how to enable debug logging, and how to reload
  hooks configuration.

* Print progress information from the `MigrateAccountPatchReviewDb`
  program.

* Honor `index.maxTerms` when using group predicate in queries.

* [Issue 7827](https://bugs.chromium.org/p/gerrit/issues/detail?id=7827):
Fix submit on push for same commit on multiple branches.

* [Issue 8301](https://bugs.chromium.org/p/gerrit/issues/detail?id=8301):
Fix reindexing of stale changes when a change or project is deleted.

* [Issue 8319](https://bugs.chromium.org/p/gerrit/issues/detail?id=8319):
Honor the `--threads` option in the offline `reindex` program.

* [Issue 8381](https://bugs.chromium.org/p/gerrit/issues/detail?id=8381):
Fix mergeability check during index for changes not visible to owner.

  If a change becomes no longer visible to its owner, e.g. because the
  user was removed from a group having exclusive visibility of the change's
  project, reindexing the change would cause the `mergeable` field to
  always be set to null in the index. As a result, the change was always
  shown with "Merge Conflict" status in the change list.

* [Issue 4889](https://bugs.chromium.org/p/gerrit/issues/detail?id=4889):
Fix formatting of commit message when updating multiple submodule subscriptions.

* Prevent concurrent login by disabling form submission.

  If a user double-clicks when logging in for the first time, it
  resulted in two accounts being created for the same user.

* Fix internal server error in reviewer suggestion.

* Fix registration redirect for new OpenID users.

  The redirect link included an extra `#` token, which resulted in the
  link redirecting to a 404 response.

* Fix line breaks in error dialogs.

* Fix display of timestamp in `show-connections` command output.

  When the SSH backend is MINA, the `show-connections` command shows the
  connection start time. For connections started more than 1 day ago, the
  start time is supposed to be shown in the format `MMM-dd` but was instead
  always shown in the format `HH:mm:ss` due to incorrect calculation of the
  elapsed time.

* Trim SSH commands' multi-line arguments for task name and SSH log.

  Multi-line arguments in SSH commands are trimmed to make the the task name
  and SSH log entries more readable.

* Allow plugins to intercept creation of SSH commands.

  By implementing the [SshCreateCommandInterceptor](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14.7/dev-plugins.hmtl#ssh-command-interception)
  interface, a plugin can intercept the creation of SSH commands and override them
  with a custom implementation.

* Replication plugin:

    * Fix creation of missing repository.

      When replicating to a destination where the repository does not exist,
      updating the `HEAD` reference failed because the passed reference name was
      not absolute.

    * Add documentation of how to exclude repositories from replication.

    * Fix logging of new project creation and project deletion.

      The "created" and "deleted" logs were emitted even when the operation
      failed.

* Polygerrit UI:

    * [Issue 6109](https://bugs.chromium.org/p/gerrit/issues/detail?id=6109):
      Don't open "Your" menu items in a new tab.

    * [Issue 8373](https://bugs.chromium.org/p/gerrit/issues/detail?id=8373):
      Fix "Your" menu items when deployed with non-default base URL.

* Upgrade metrics-core to 4.0.2

* Upgrade jsinterop-annotations to 1.0.2

  This is a transitive dependency of GWT and was missed in the previous
  upgrade of GWT to 2.8.2

### 2.14.6 {#2.14.6}

* [Issue 7562](https://bugs.chromium.org/p/gerrit/issues/detail?id=7562):
Stop passing `--insecure` to `curl` in download-commands plugin.

  Validating certs is an important feature of HTTPS that we should not
  disable, especially when downloading code that is going to be trusted.

* Disable `ban-commit` ssh command on slaves.

  Gerrit slaves are supposed to be read-only, but the `ban-commit` command
  creates a Git note and hence writes to the repository.

* Fix error message when attempting to delete a branch without permission.

  Branches can be deleted by a user having the "Push" permission with the
  force flag set, or the "Delete Reference" permission. However, the error
  message did not mention "Delete Reference", leading to users unnecessarily
  requesting administrators to grant the force push permission.

* Fix status transition when directly pushing an abandoned change.

  If a change was abandoned, but then directly pushed to the branch, its
  status was not changed from "Abandoned" to "Merged".

* Keep old timestamps during data migration.

  In some cases the "created on" field was updated to the time of the migration
  when replacing the "Submitted" state with "New".

* Don't compress live log file `error_log.json`.

* Don't create GC log file when GC is not configured.

* Specify new tip of the branch when updating submodules.

  In Gerrit 2.12, whenever a submodule was updated the corresponding commit
  in the superproject included the SHA-1 of the new tip of the branch.

  Restore this behavior to avoid breaking clients that extract this
  information from the superproject commit message.

* Don't use account index to look up external IDs when authenticating with
OAuth or OpenID.

  The account index is not available on slaves, causing authentication
  with OAuth and OpenID to fail.

* [Issue 7647](https://bugs.chromium.org/p/gerrit/issues/detail?id=7647):
Gracefully handle malformed GPG keys input.

  Posting a malformed GPG resulted in an internal server error.

* [Issue 7611](https://bugs.chromium.org/p/gerrit/issues/detail?id=7611):
Stop the project cache clock and await termination of index executor threads
on server shutdown.

* [Issue 5386](https://bugs.chromium.org/p/gerrit/issues/detail?id=5386):
Fix database connection leak in `suexec` command.

* Evict idle database connections.

  Database idle connections in the pool were not evicted which could
  lead to connections to the database being exhausted.

  Idle connections are now evicted after 60 seconds.

* Enable CORS for plugin static files and documentation.

* Always include `createdOn` in change attribute in events.

  This allows for aggregating review-time if defined as the timespan
  between when a change is created and when it is merged.

* Allow to select and copy text in inline comment boxes.

* [Issue 7739](https://bugs.chromium.org/p/gerrit/issues/detail?id=7739):
Only enable the "Require Signed Push" project option for project owners.

* Upgrade Polymer to version 1.11.0.

  This version includes a fix for deprecation of HTMLImports in Chrome.

* Upgrade GWT to version 2.8.2.

  This version includes various fixes since 2.8.0.

* Upgrade Guava to version 22.0.

### 2.14.5.1 {#2.14.5.1}

* Fix regression introduced in 2.14.5

  A regression was introduced when fixing the `set-reviewers` command to work
  with change sha1s. The check for sha1 was done before the check for legacy
  change number, so if a server had large enough change numbers they would be
  erroneously interpreted as sha1 resulting in a "change not found" error.

### 2.14.5 {#2.14.5}

**WARNING: the 2.14.5 release includes a regression. Use 2.14.5.1 instead.**

* [Issue 7273](https://bugs.chromium.org/p/gerrit/issues/detail?id=7273):
On account creation evict account from account cache.

  When an account was created by ssh or REST API, its username and full name
  were not available until the account cache was flushed (e.g. by restarting
  the server).

* [Issue 6885](https://bugs.chromium.org/p/gerrit/issues/detail?id=6885):
Fix over-eager caching of pages.

* [Issue 7098](https://bugs.chromium.org/p/gerrit/issues/detail?id=7098):
Fix diff base gitweb link.

* [Issue 5897](https://bugs.chromium.org/p/gerrit/issues/detail?id=5897):
Fix false-positive warning on gitweb requests.

* [Issue 6657](https://bugs.chromium.org/p/gerrit/issues/detail?id=6657):
Prevent invalid query operator from invalidating user's web session.

  If the user entered an invalid query like `has:starss`, the user's web
  session was invalidated.

* [Issue 7425](https://bugs.chromium.org/p/gerrit/issues/detail?id=7425):
Add `sshd.waitTimeout` configuration to set `WAIT_FOR_SPACE_TIMEOUT`.

  In sshd a new channel property,
  [channel-output-wait-for-space-timeout](https://issues.apache.org/jira/browse/SSHD-565),
  was introduced with a default value of 30 seconds.

  This was not being set, causing any clone operations lasting longer
  than 30 seconds to fail.

  Administrators may now increase this value by setting
  [`sshd.waitTimeout`](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14.5.1/config-gerrit.html#sshd.waitTimeout).

* Increase the value of `GERRIT_FDS` when an LFS plugin is configured.

  `GERRIT_FDS` was set to double of `core.packedGitOpenFiles`, which was
  not sufficient to account for the file descriptors used by Git LFS.

* [Issue 7357](https://bugs.chromium.org/p/gerrit/issues/detail?id=7357):
Fix bad rounding of relative dates like '1 year, 12 months ago'.

  The date should be rounded to '2 years ago'.

* Fix parsing of permissions when expanding parameters.

* Skip adding `_moreChanges` when change query result is empty.

* Fix suppression of log file compression when exception occurs.

  If any exception occurred, subsequent log compression was not done.

* Fix scheduling of log file compression.

  The initial delay for log file compression scheduling was not being
  calculated correctly, leading to the task's initial run being much
  later than expected.

* Fix internal server error when reading changes.

  When a change was not found, NullPointerException was thrown and this
  caused the delete-project plugin to fail. Now, ChangeNotFoundException
  is thrown.

* Fix parsing of email replies with "gmail_default" as class name.

  The email parser was rejecting all blocks with a class starting with 'gmail'.

* Don't show weblinks for 'magic' files.

  The magic files `/COMMIT_MSG` and `/MERGE_LIST` don't actually exist in the
  git repository, so any links to them result in 404 on the viewer.

* Add missing registration of `vote-deleted` event.

  The missing registration was causing listeners to fail with 'Unknown event type'.

* Allow to add reviewers to changes by commit sha1 using the `set-reviewers`
  ssh command.

* Hooks plugin: Protect against null object IDs in ref updates.

* Polygerrit UI

    * Fix avatars when using a URL prefix

    * Fix redirection of URLs with context to GWT UI


### 2.14.4 {#2.14.4}

* Fix performance issue when clearing reviewed flag for a patch set.

  Change the order of fields in the primary key of the
  JdbcAccountPatchReviewStore table, to allow usage of implicit indices when
  querying rows, improving performance when clearing the reviewed flag for a
  patch set.

  Sites that have already upgraded from an earlier version to either 2.13
  or 2.14 need to manually recreate the primary key as described in the
  warning [above](#patch-review-primary-key).

* [Issue 7086](https://bugs.chromium.org/p/gerrit/issues/detail?id=7086):
Disallow invalid combination of `auth.type` and `auth.gitBasicAuthPolicy`.

  Update the documentation of [`auth.type`](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14.4/config-gerrit.html#auth.type)
  to clarify that the `HTTP_LDAP` and `CLIENT_SSL_CERT_LDAP` types only use
  LDAP to gather basic information about the user, and not to actually perform
  the authentication.

  Also, add checks to make sure the combination of `auth.type` and
  `auth.gitBasicAuthPolicy` is valid. If an invalid combination is used,
  this could result in unintentionally disabling authentication, so raise
  an error during startup.

* [Issue 7188](https://bugs.chromium.org/p/gerrit/issues/detail?id=7188):
Fix 'Cannot upgrade schema' during upgrade on Oracle database backend.

* Fix internal server error when invoking the `stream-events` ssh command
with the `--help` option.

* Add support for creating annotated tags from the tags list in the GWT UI.

  Although the REST API allows to create annotated tags, the UI only supported
  creating lightweight tags.

* Consistently use lower case when reading enumerations during initialization.

  The list of supported options was converted to lower case, but the input
  prompt did not do the same for the default value.

### 2.14.3 {#2.14.3}

* [Issue 6853](https://bugs.chromium.org/p/gerrit/issues/detail?id=6853):
Only attempt to parse `polygerrit` URL parameter on `GET` requests.

  Attempting to parse the `polygerrit` parameter on all requests caused
  failures when sending a `POST` or `PUT` request to the REST API via `curl`.

* [Issue 6922](https://bugs.chromium.org/p/gerrit/issues/detail?id=6922):
Fix comparison against edit revision.

* [Issue 6745](https://bugs.chromium.org/p/gerrit/issues/detail?id=6745):
Emit an event to the event stream when a vote is removed from a change.

  When a reviewer was removed from a change, an event was emited to the
  event stream, but when only a vote was removed (leaving the reviewer
  on the change), no event was emitted

* Add user who removed reviewer into event that is emitted when a
  reviewer is removed from a change.

* Improve error message when failing to create the first user.

* Allow to run the server without specifying `gerrit.canonicalWebUrl`.

  The only situation where the setting is mandatory is when using OAuth
  authentication, because the OAuth provider needs to have a fixed callback
  URL with a single hostname.

* Align group reference from plugin with core group reference.

* Fix `PluginConfig.setGroupReference` method.

  When the group reference was a new one, i.e. not already in the groups
  file, it was not added to the groups file when saving the project
  config.

* Fix support for plugin group reference with inheritance.

  Group reference was not working when inherited from parent project
  config.

* Use `-S` instead of `-s` as alias for `--start` in list branches and tags
REST API endpoints.

  Using an upper case `-S` makes the API consistent with the other list APIs
  (changes, groups, projects). This is a breaking change for any clients
  that use `-s`.

* Allow to configure pool connection settings for patch review store.

  Previously the pool connection settings were hard-coded. In high
  traffic servers this can cause a bottleneck as the transactions start
  to be queued when the maximum number of connetions is reached.

  In the [accountPatchReviewDb section](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14.3/config-gerrit.html#accountPatchReviewDb)
  of the `gerrit.config` file it is now possible to configure the
  `url`, `poolLimit`, `poolMinIdle`, `poolMaxIdle`, and `poolMaxWait`
  values.

* Polygerrit UI

    * [Issue 6827](https://bugs.chromium.org/p/gerrit/issues/detail?id=6827):
      Fix loading change screen with a slash following the patch set number.

    * [Issue 6921](https://bugs.chromium.org/p/gerrit/issues/detail?id=6921):
      Request all commits in the change detail.

    * [Issue 5677](https://bugs.chromium.org/p/gerrit/issues/detail?id=5677):
      Don't crash on empty diff selection.

    * Add `:` to autocompleted predicates in search bar.

### 2.14.2 {#2.14.2}

* [Issue 6472](https://bugs.chromium.org/p/gerrit/issues/detail?id=6472):
Fix online reindexing for plugin-dependent rules.

* [Issue 6473](https://bugs.chromium.org/p/gerrit/issues/detail?id=6473):
Fix display of columns in projects tables.

* [Issue 6099](https://bugs.chromium.org/p/gerrit/issues/detail?id=6099):
Set reflog message and identity when merging changes.

* [Issue 6591](https://bugs.chromium.org/p/gerrit/issues/detail?id=6591):
Fix deletion of branches when the `refs/heads/` prefix is omitted.

* [Issue 6605](https://bugs.chromium.org/p/gerrit/issues/detail?id=6605):
Fix searching for change by Change-Id triplet when project name matches Change-Id pattern.

  For projects whose name matched the Change-Id pattern, i.e. named something
  like `iabcde`, it was not possible to search for changes using the Change-Id
  triplet `project~branch~changeId`.

* [Issue 3345](https://bugs.chromium.org/p/gerrit/issues/detail?id=3345):
Preserve line endings in inline editor.

* [Issue 6508](https://bugs.chromium.org/p/gerrit/issues/detail?id=6508):
Hooks plugin: Fix hook configuration names to match documentation

  Most hooks in the documentation are named with "Hook" suffix, but
  in the code the "Hook" suffix was omitted. This prevented the hook
  from being found when the administrator configured it with the
  documented name.

* [Issue 6609](https://bugs.chromium.org/p/gerrit/issues/detail?id=6609):
Add "indent with tabs" configuration option in inline editor.

* [Issue 6544](https://bugs.chromium.org/p/gerrit/issues/detail?id=6544):
Allow project owners to update project configuration.

* [Issue 6527](https://bugs.chromium.org/p/gerrit/issues/detail?id=6527):
Use quoted-printable for SMTP transfer encoding.

* [Issue 6205](https://bugs.chromium.org/p/gerrit/issues/detail?id=6205):
Fix internal server error on `/register` with URL prefix.

* Fix line wrapping in inline editor.

  The line wrapping preference was respected for the diff screens, but not
  for the inline editor.

* Don't index missing accounts.

* Disable auto-reindexing if stale during offline Reindex.

* Fix title of revision field for creating new tag in the UI.

* Suggest `self` before other users in search operator suggestions.

  For query operators that expect a user, the suggestion included other
  users whose name begins with "sel" before "self". Since "self" is
  more frequently used, it should be suggested first.

* Load external IDs from primary storage (ReviewDb).

  On sign in we can't access the account index to lookup external IDs
  since Gerrit slaves don't have an account index, but Gerrit slaves must
  be able to sign in. Instead load the external ID from the primary
  storage which is ReviewDb in 2.14.

* Extend `shortSubject` field to 72 characters in soy email template.

* Align lib modules load injector on Jetty and external containers.

  Align the startup of Gerrit with a standalone Jetty container to the
  WebAppInitializer and load the user-provided Guice modules in the
  sysInjector instead of the DbInjector.

  This Allows overriding some of the default bindings of Gerrit
  (e.g. repository manager or permissions backend) with custom-made
  alternate implementations.

* Fix cyclic dependency when using `site_path` from `system_config` table.

  The starting mode where `site_path` is not specified (as a system property)
  and Gerrit first connects to the database using the ReviewDb JNDI property
  from the servlet container was broken since version 2.13 due to a cyclic
  dependency in Guice bindings.

* Add missing `throws` declarations on `NotImplemented` classes in the
extension API.

  The `throws` were removed as a cleanup in Gerrit 2.14, but this prevenented
  classes that extend `NotImplemented` from throwing the exceptions.

* Add support for tag web links.

* Reindex accounts after updating external Ids in `LocalUsernamesToLowerCase`
program.

* Disallow using both `m` and `r` options together in branch and tag
list filters.

* Recognize all parts marked with `multipart/` in inbound emails.

  Inbound emails would not be parsed when the message was signed and
  therefore wrapped in a `multipart/signed` part.

* Replication plugin: Fix race condition when scheduling a replication

* Replication plugin: Use rescheduleDelay instead of replicationDelay when
rescheduling.

* PolyGerrit UI

    * Add syntax highlighting for kotlin, php, shell, erlang, and puppet.

    * [Issue 6557](https://bugs.chromium.org/p/gerrit/issues/detail?id=6557):
      Enable multiline range comments in Firefox.

    * [Issue 6062](https://bugs.chromium.org/p/gerrit/issues/detail?id=6062):
      Fix register links to use base URL.

    * [Issue 6693](https://bugs.chromium.org/p/gerrit/issues/detail?id=6693):
      Fix back button behavior for hash redirects.

### 2.14.1 {#2.14.1}

* Add support for Git LFS locking.

  Plugins implementing LFS may now include support for
  [locking](https://github.com/git-lfs/git-lfs/blob/master/docs/api/locking.md).

* Upgrade JGit to 4.7.1.201706071930-r.

  This includes a fix to make auto GC run in the background.

  In some cases, the auto GC limit is lower than the true number of
  unreachable loose objects, so auto GC will run after every (e.g) fetch
  operation.  This leads to the appearance of poor fetch performance.
  Since these GCs will never make progress (until either the objects
  become referenced, or the two week timeout expires), blocking on them
  simply reduces throughput.

* Allow multiple Servlet filters on Jetty HTTPD.

  It is now possible to specify multiple values for
  [`httpd.filterClass`](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14.1/config-gerrit.html#httpd.filterClass).

* Allow to set Jetty HTTPD socket timeout.

  A new setting [`httpd.idleTimeout`](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14.1/config-gerrit.html#httpd.idleTimeout)
  makes the Jetty HTTPD socket timeout configurable so to tailor the socket
  and thread consumption to the needs of setups with different latencies and
  bandwidth.

* Add a `group indexed` extension point.

  Similar to the existing `change indexed` and `account indexed `extension points,
  this allows plugins to be notified when a group has been indexed.

* Extend upload validation interface to allow listening to negotiation start.

  This can be used to check rate limits for fetch requests. Rate limits
  should be checked before git transport negotation starts to avoid
  unnecessary work in case the limit is already reached.

* Fix support for ECDSA and ED25519 SSH keys.

  ECDSA and ED25519 SSH host keys were not generated during site initialization
  and were not loaded if they existed.

* Fix initialization failure when removing old Bouncy Castle library fails.

  During initialization, old Bouncy Castle libraries are renamed with a `.backup`
  suffix, but if the destination file already existed the initialization would
  fail with a fatal error. Now a warning is printed and the initialization
  continues.

* [Issue 6278](https://bugs.chromium.org/p/gerrit/issues/detail?id=6278):
Fix internal server error when cloning from slave over HTTP.

* Fix firing change related events for deleted change.

* [Issue 5393](https://bugs.chromium.org/p/gerrit/issues/detail?id=5393):
Improve the performance of reviewer suggestion.

* [Issue 6173](https://bugs.chromium.org/p/gerrit/issues/detail?id=6173):
Fix setting
[`sshd.idleTimeout`](http://gerrit-documentation.storage.googleapis.com/Documentation/2.14.1/config-gerrit.html#sshd.idleTimeout)
for nio2 backend.

  The idle timeout was not properly set for the nio2 backend, so connections
  would always time out with the default value (10 minutes).

* Improve error message when publishing an already published change edit.

* Fix ref visibility checks in dashboards.

* Replication plugin: Fix replication retries when `maxRetries` is set to 0.

* Fix autocomplete for Firefox on LDAP login screen.

* Add support for mariadb in AccountPatchReviewStore.

* Fix notifications for comments on draft patch sets.

* Fix internal server error when deleting current patch set and previous patch
set doesn't exist.

* [Issue 6176](https://bugs.chromium.org/p/gerrit/issues/detail?id=6176):
Fix internal server error when old patch set is not found.

* Always use SSL implicitly for POP3 and IMAP.

  If `receiveemail.encryption` is set to TLS/SSL, we always want to use the
  implicit mode to execute the TLS/SSL command right after establishing
  the conection with the mail server. Strict mail servers like Gmail would
  close the connection prematurely otherwise.

* Allow plugins to non-transitively depend on prolog rules.

* [Issue 6367](https://bugs.chromium.org/p/gerrit/issues/detail?id=6367):
Allow to set blocking label range rules in permission rule editor.

* PolyGerrit UI

    * [Issue 6096](https://bugs.chromium.org/p/gerrit/issues/detail?id=6096):
      Add an "up" button to the diff screen.

    * [Issue 6041](https://bugs.chromium.org/p/gerrit/issues/detail?id=6041):
      Display `/MERGE_LIST` and `/COMMIT_MESSAGE` as `Merge List` and
      `Commit Message`.

    * [Issue 6080](https://bugs.chromium.org/p/gerrit/issues/detail?id=6080):
      Allow editing status when full name is not editable.

    * [Issue 6166](https://bugs.chromium.org/p/gerrit/issues/detail?id=6166):
      Fix loading favicon on a prefixed URL.

    * Make sure 'Merge Conflict' displays on change view.

    * Use a default name for accounts that do not have a display name.
