# Gerrit 2.12

Download: **[2.12.5](https://gerrit-releases.storage.googleapis.com/gerrit-2.12.5.war)**
| [2.12.4](https://gerrit-releases.storage.googleapis.com/gerrit-2.12.4.war)
| [2.12.3](https://gerrit-releases.storage.googleapis.com/gerrit-2.12.3.war)
| [2.12.2](https://gerrit-releases.storage.googleapis.com/gerrit-2.12.2.war)
| [2.12.1](https://gerrit-releases.storage.googleapis.com/gerrit-2.12.1.war)
| [2.12](https://gerrit-releases.storage.googleapis.com/gerrit-2.12.war)

Documentation: **[2.12.5](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12.5/index.html)**
| [2.12.4](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12.4/index.html)
| [2.12.3](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12.3/index.html)
| [2.12.2](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12.2/index.html)
| [2.12.1](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12.1/index.html)
| [2.12](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/index.html)

[TOC]

## Release Highlights

* New change submission workflows: 'Submit Whole Topic' and 'Submitted Together'.

* Support for GPG Keys and signed pushes.


## Important Notes

### Schema Changes

This release contains schema changes. To upgrade:

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

#### ‘value too long’ error in schema migration

As described in [Issue 4323](https://bugs.chromium.org/p/gerrit/issues/detail?id=4323),
a ’value too long for type character varying(255)’ error can occur in the
patch_sets table when migrating to schema version 108.

This error may occur under some circumstances when running the schema
migration from an earlier version of Gerrit.

On sites where this occurs, it can be fixed with a manual schema update
according to the comments in the issue.

#### Manual schema upgrade when updating from 2.12 to 2.12.x

When upgrading a site that is already running version 2.12 to 2.12.x, the
`patch_sets` table must be manually migrated using the `gerrit gsql` SSH
command or the `gqsl` site program.

For the default H2 database, execute the command:

``` sh
  alter table patch_sets modify push_certficate clob;
```

For MySQL, execute the command:

``` sh
  alter table patch_sets modify push_certficate text;
```

For PostgreSQL, execute the command:

``` sh
  alter table patch_sets alter column push_certficate type text;
```

For other database types, execute the appropriate equivalent command.

Note that the misspelled `push_certficate` is the actual name of the
column.

When upgrading from a version earlier than 2.12, this manual step is not
necessary and should be omitted.

### Online Reindexing

To use online reindexing when upgrading to 2.12.x, the server must
first be upgraded to 2.8 (or 2.9) and then through 2.10 and 2.11 to 2.12.x. If
reindexing will be done offline, you may ignore this warning and upgrade directly
to 2.12.x.

### Bouncy Castle Upgrade

When upgrading from version 2.8.4 or older with a site that uses
Bouncy Castle Crypto, new versions of the libraries will be downloaded. The old
libraries should be manually removed from site's `lib` folder to prevent the
startup failure described in [issue 3084](https://code.google.com/p/gerrit/issues/detail?id=3084).

### Solr Index Support

The Solr secondary index is no longer supported. With this release
the only supported secondary index is Lucene.

### `ref-updated` Event Format Change

The format of the `ref-updated` event has changed. Users of the
[Jenkins Gerrit Trigger plugin](https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger)
with jobs triggering on `ref-updated` should upgrade to at least
[version 2.15.1](https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger#GerritTrigger-Version2.15.1%28releasedSept142015%29).
If an upgrade of the plugin is not possible, a workaround is
to change the branch configuration to type `Path` with a pattern like
`refs/*/master` instead of `Plain` and `master`.


## New Features

### New Change Submission Workflows

* New 'Submit Whole Topic' setting.

  When the
  [`change.submitWholeTopic`](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/config-gerrit.html#change.submitWholeTopic)
  setting is enabled, all changes belonging to the same
  topic will be submitted at the same time.

  This setting should be considered experimental, and is disabled by default.

* Submission of changes may include ancestors.

  If a change is submitted that has submittable ancestor changes, those changes
  will also be submitted.

* The merge queue is removed.

  Changes that cannot be submitted due to missing dependencies will no longer
  enter the 'Submitted, Merge Pending' state.


### GPG Keys and Signed Pushes

Signed push can be enabled by setting
[`receive.enableSignedPush`](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/config-gerrit.html#receive.enableSignedPush)
to true. When a client pushes with `git push --signed`, Gerrit ensures that the push
certificate is valid and signed with a valid public key stored in the
`refs/meta/gpg-keys` branch of the `All-Users` repository.

When signed push is enabled, and
[`gerrit.editGpgKeys`](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/config-gerrit.html#gerrit.editGpgKeys)
is set to true, users may upload their public GPG
key via the REST API or UI. If this setting is not enabled, GPG keys may only be added by administrators
with direct access to the `All-Users` repository.

Administrators may also configure
[`receive.certNonceSeed`](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/config-gerrit.html#receive.certNonceSeed)
and
[`receive.certNonceSlop`](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/config-gerrit.html#receive.certNonceSlop).

### Secondary Index

* [Issue 3333](http://code.google.com/p/gerrit/issues/detail?id=3333):
Support searching for changes by author and committer.

  Changes are indexed by the git author and committer of the latest patch set,
  and can be searched with the `author:` and `committer:` operators.

  Changes are matched on either the exact whole email address, or on parts of the
  name or email address.

* Add `from:` search operator to match by owner of change or author of comments.

* Add `commentby:` search operator to search by author of comments.

* Change the `topic:` search operator to search by the exact topic name.

* Add `intopic:` search operator to search by topics containing the search term.

* [Issue 3291](http://code.google.com/p/gerrit/issues/detail?id=3291):
Add `has:edit` search operator to match changes that have edit revisions on them.

* Allow configuration of maximum query size.

  [`index.maxTerms`](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/config-gerrit.html#index.maxTerms)
  can be set to limit the number of leaf index terms.

* Expose Lucene index writers for plugins.

  Plugins can now reconfigure various Lucene performance related parameters
  at runtime.

* Make Lucene index writers auto-commit writers.

  Plugins can now temporarily turn on auto-committing in situations where it makes
  sense to enforce all changes to be written to disk ASAP.

### UI

#### General

* Edit and diff preferences can be modified from the user preferences screen.

  Previously it was only possible to edit these preferences from the actual
  diff and edit screens.

* Add 'Edits' to the 'My' dashboard menu to list changes on which the user
has an unpublished edit revision.

* Support for URL aliases.

  Administrators may define
  [URL aliases](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/config-gerrit.html#urlAlias)
  to map plugin screens into the Gerrit URL namespace.

  Plugins may use user-specific URL aliases to replace certain screens for certain
  users.


#### Project Screen

* New tab to list the project's tags, similar to the branch list.


#### Inline Editor

* Store and load edit preferences in git.

  Edit preferences are stored and loaded to/from the `All-Users` repository.

* Add 'auto close brackets' feature.

* Add 'match brackets' feature.

* Make the cursor blink rate customizable.

* Add support for Emacs and Vim key maps.


#### Change Screen

* [Issue 3318](http://code.google.com/p/gerrit/issues/detail?id=3318):
Highlight 'Reply' button if there are draft comments on any patch set.

  If any patch set of the change has a draft comment by the current user,
  the 'Reply' button is highlighted.
 
  The icons depicting draft comments are removed from the revisions drop-down
  list.

* [Issue 1100](http://code.google.com/p/gerrit/issues/detail?id=1100):
Publish all draft comments when replying to a change.

  All draft comments, including those on older patch sets, are published when
  replying to a change.

* Show file size increase/decrease for binary files.

* Show uploader if different from change owner.

* Show push certificate status.

* Show change subject as tooltip on related changes list.

  This helps to identify changes when the subject is truncated in the list.


#### Side-By-Side Diff

* [Issue 3293](http://code.google.com/p/gerrit/issues/detail?id=3293):
Add syntax highlighting for Puppet.

* [Issue 3447](http://code.google.com/p/gerrit/issues/detail?id=3447):
Add syntax highlighting for VHDL.


#### Group Screen

* [Issue 1479](http://code.google.com/p/gerrit/issues/detail?id=1479): Group audit log.

  The group screen now includes an 'Audit Log' panel showing member additions,
  removals, and the user who made the change.

### API

Several new APIs are added.

#### Accounts

* Suggest accounts.

#### Tags

* List tags.

* Get tag.


### REST API

New REST API endpoints and new options on existing endpoints.


#### Accounts

* [Set Username](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-accounts.html#set-username):
Set the username of an account.

* [Get Account Details](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-accounts.html#get-detail):
Get the details of an account.

  In addition to the [AccountInfo](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-accounts.html#account-info)
  fields returned by the existing
  [Get Account endpoint](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-accounts.html#get-account),
  the new REST endpoint returns the registration date of the account and the
  timestamp of when contact information was filed for this account.


#### Changes

* [Set Review](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-changes.html#set-review):
Add an option to omit duplicate comments.

* [Download Content](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-changes.html#get-safe-content):
Download the content of a file from a certain revision, in a
safe format that poses no risk for inadvertent execution of untrusted code.

* [Get Submitted Together](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-changes.html#submitted-together):
Get the list of all changes that will be submitted at
the same time as the change.

* [Issue 1100](http://code.google.com/p/gerrit/issues/detail?id=1100):
[Set Review](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-changes.html#set-review):
Add an option to publish draft comments on all revisions.

#### Config

* [Get Server Info](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-config.html#get-info):
Return information about the Gerrit server configuration.

* [Confirm Email](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-config.html#confirm-email):
Confirm that the user owns an email address.


#### Groups

* [List Groups](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-groups.html#list-group):
Add option to suggest groups, allowing group auto-completion to be used in a plugin's UI.

* [Get Audit Log](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-groups.html#get-audit-log):
Get the audit log of a Gerrit internal group, showing member
additions, removals, and the user who made the change.


#### Projects

* [Run GC](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-projects.html#run-gc):
Add `aggressive` option to specify whether or not to run an aggressive
garbage collection.

* [List Tags](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/rest-api-projects.html#list-tags):
Support filtering by substring and regex, and pagination with `--start` and `--end`.

### SSH

* Add support for ZLib Compression.

  To enable compression use the
  [`sshd.enableCompression` setting](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/config-gerrit.html#sshd.enableCompression).

* Add support for hmac-sha2-256 and hmac-sha2-512 as MACs.

### Plugins

#### General

* Gerrit client can now pass JavaScriptObjects to extension panels.

* New UI extension point for header bar in change screen.

* New UI extension point to password screen.

* New UI extension points to project info screen.

* New UI extension point for pop down buttons on change screen.

* New UI extension point for buttons in header bar on change screen.

* New UI extension point at bottom of the user preferences screen.

* New UI extension point for the 'Included In' drop-down panel.

  By implementing the
  [Included In interface](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/dev-plugins.html#included-in),
  plugins may add entries to the 'Included In' dropdown menu on the change screen.

* Plugins can extend Gerrit screens with GWT controls.

* Plugins can add custom settings screens.

* Referencing groups in `project.config`.

  Plugins can refer to groups so that when they are renamed, the project
  config will also be updated in this section.

* API
    * Allow to use `CurrentSchemaVersion`.
    * Allow to use `InternalChangeQuery.query()`.
    * Allow to use `JdbcUtil.port()`.
    * Allow to use GWTORM `Key` classes.


### Other

* [Issue 3401](http://code.google.com/p/gerrit/issues/detail?id=3401):
Add option to
[disable registration of new email addresses](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/config-gerrit.html#sendemail.allowRegisterNewEmail).

* [Issue 2061](http://code.google.com/p/gerrit/issues/detail?id=2061):
Add Support for `git-upload-archive`.

  This allows use the standard `git archive` command to create an archive
  of the content of a repository.

* Add a background job to automatically abandon inactive changes.

  The
  [changeCleanup](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/config-gerrit.html#changeCleanup)
  configuration can be set to periodically check for inactive changes and automatically abandon them.

* Add support for the
[DB2 database](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/database-setup.html#createdb_db2).

* [Issue 3441](http://code.google.com/p/gerrit/issues/detail?id=3441):
Add support for the
[Apache Derby database](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/database-setup.html#createdb_derby).

* Download commands plugin: Use commit IDs for download commands when change refs are hidden.

  Git has a configuration option to hide refs from the initial advertisement
  (`uploadpack.hideRefs`). This option can be used to hide the change refs from
  the client. As consequence this prevented fetching changes by change ref from
  working.

  Setting `download.checkForHiddenChangeRefs` in the `gerrit.config` to true
  allows the download commands plugin to check for hidden change refs.

* Add a new 'Maintain Server' global capability.

  Members of a group with the 'Maintain Server' capability may view caches, tasks,
  and queues, and invoke the index REST API on changes.

## Bugfixes

* [Issue 3499](http://code.google.com/p/gerrit/issues/detail?id=3499):
Fix syntax highlighting of raw string literals in go.

* [Issue 3643](http://code.google.com/p/gerrit/issues/detail?id=3643):
Fix syntax highlighting of ES6 string templating using backticks.

* [Issue 3653](http://code.google.com/p/gerrit/issues/detail?id=3653):
Correct timezone in sshd log after DST change.

  When encountering a DST switch, the timezone wasn't updated until
  the server was reloaded.

* [Issue 3306](http://code.google.com/p/gerrit/issues/detail?id=3306):
Allow admins to read, push and create on `refs/users/default`.

* [Issue 3212](http://code.google.com/p/gerrit/issues/detail?id=3212):
Fix failure to run `init` when `--site-path` option is not explicitly given.

* Make email validation case insensitive.

  While [RFC 5321 section 2.3.11](https://tools.ietf.org/html/rfc5321#section-2.3.11)
  allows for the local-part (the part left of the '@') of an email address to be case
  sensitive, the domain portion is case insensitive according to
  [RFC 1035 section 3.1](https://tools.ietf.org/html/rfc1035#section-3.1),
  and in practice, even the local-part is typically case insensitive also.

* `commit-msg` hook: Don't add `Change-Id` line on temporary commits.

  Commits created with `git commit --fixup` or `git commit --squash` are not
  intended to be pushed to Gerrit, and don't need a `Change-Id` line.

  This also prevents changes from being accidentally uploaded, at least for
  projects that have the 'Require Change-Id' configuration enabled.

* [Issue 3444](http://code.google.com/p/gerrit/issues/detail?id=3444):
download-commands plugin: Fix clone with commit-msg hook when project name
contains '/'.

* Use full ref name in `refName` attribute of `ref-updated` events.

  The [refUpdate attribute](https://gerrit-documentation.storage.googleapis.com/Documentation/2.12/json.html#refUpdate)
  in `ref-updated` events did not include the full name
  of the ref in the `refName` attribute, i.e. `master` was used instead of
  `refs/heads/master`.

  Support for the new format is added in
  [version 2.15.1 of the Jenkins Gerrit Trigger plugin](https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger#GerritTrigger-Version2.15.1%28releasedSept142015%29).

  Users who are unable to upgrade the plugin may instead change the
  trigger's branch configuration to type `Path` with a pattern like
  `refs/*/master` instead of `Plain` and `master`.

* [Issue 3714](https://code.google.com/p/gerrit/issues/detail?id=3714):
Improve visibility of comments on dark themes.

* Fix highlighting of search results and trailing whitespaces in intraline
diff chunks.

* Fix server error when listing annotated/signed tag that has no tagger info.

* Don't create new account when claimed OAuth identity is unknown.

  The Claimed Identity feature was enabled to support old Google OpenID accounts,
  that cannot be activated anymore. In some corner cases, when for example the URL
  is not from the production Gerrit site, for example on a staging instance, the
  OpenID identity may deviate from the original one. In case of mismatch, the lookup
  of the user for the claimed identity would fail, causing a new account to be
  created.

* Suggest to upgrade installed plugins per default during site initialization
to new Gerrit version.

  The default was 'No' which resulted in some sites not upgrading core
  plugins and running the wrong versions.

* [Issue 3698](https://code.google.com/p/gerrit/issues/detail?id=3698):
Fix creation of the administrator user on databases with pre-allocated
auto-increment column values.

  When using a database configuration where auto-increment column values are
  pre-allocated, it was possible that the 'Administrators' group was created
  with an ID other than `1`. In this case, the created admin user was not added
  to the correct group, and did not have the correct admin permissions.

* [Issue 3018](https://code.google.com/p/gerrit/issues/detail?id=3018):
Fix query for changes using a label with a group operator.

  The `group` operator was being ignored when searching for changes with labels
  because the search index does not contain group information.

* Fix online reindexing of changes that don't already exist in the index.

  Changes are now always reloaded from the database during online reindex.

* Fix reading of plugin documentation.

  Under some circumstances it was possible to fail with an IO error.

## Documentation Updates

* [Issue 412](https://code.google.com/p/gerrit/issues/detail?id=412):
Update documentation of `commentlink.match` regular expression to clarify
that the expression is applied to the rendered HTML.

* Remove warning about unstable change edit REST API endpoints.

  These endpoints should be considered stable since version 2.11.

* Document that `ldap.groupBase` and `ldap.accountBase` are repeatable.

## Dependency Updates

* Upgrade Asciidoctor to 1.5.2

* Upgrade AutoValue to 1.1

* Upgrade Bouncy Castle to 1.52

* Upgrade CodeMirror to 5.7

* Upgrade gson to 2.3.1

* Upgrade guava to 19.0-RC2

* Upgrade gwtorm to 1.14-20-gec13fdc

* Upgrade H2 to 1.3.176

* Upgrade httpcomponents to 4.4.1

* Upgrade Jetty to 9.2.13.v20150730

* Upgrade JGit to 4.1.1.201511131810-r

* Upgrade joda-time to 2.8

* Upgrade JRuby to 1.7.18

* Upgrade jsch to 0.1.53

* Upgrade JUnit to 4.11

* Upgrade Lucene to 5.3.0

* Upgrade Prolog Cafe 1.4.1

* Upgrade servlet API to 8.0.24

* Upgrade Truth to version 0.27

## Bugfix Releases

### 2.12.5 {#2.12.5}

* New preference to enable line wrapping in diff screen and inline editor.

* Fix the diff and edit preference dialogs for smaller screens.

  On smaller screens the options at the bottom of the dialogs would
  get cut off, making it difficult to change them.

* [Issue 4521](https://bugs.chromium.org/p/gerrit/issues/detail?id=4521):
Fix internal server error during validation of email addresses.

  When creating a new account or adding a new email address to an existing
  account, the email validation crashed.

* Lucene stability improvements.

  Each Lucene index is now written using a dedicated background thread. Lucene
  threads may not be cancelled, to prevent interruptions while writing.

* Don't try to change username that is already set.

  Since Gerrit version 2.1.4 it is not allowed to change the username once
  it has been set, and attempting to do so results in an exception.

  If `ldap.accountSshUserName` is set in the `gerrit.config` using
  `${userPrincipalName.localPart}` to initialize the username from the user's
  email address, and then the email address is changed, the username gets
  resolved to something different and the account manager tried to change it.
  As a result, an exception was raised and the user could no longer log in.

  Instead of trying to change the username, a warning is logged.

* [Issue 4006](https://bugs.chromium.org/p/gerrit/issues/detail?id=4006):
Prevent search limit parameter from exceeding maximum integer value.

* Fix internal server error when generating task names.

* Print proper names for query tasks in the output of the `show-queue` command.

* Double-check change status when auto-abandoning changes.

  It was possible that changes could be updated in the time between the query
  results being returned and the change being abandoned.

### 2.12.4 {#2.12.4}

* [Issue 4400](https://bugs.chromium.org/p/gerrit/issues/detail?id=4400):
Fix `AlreadyClosedException` in Lucene index.

  If a Lucene indexing thread was interrupted by an SSH connection being
  closed, this would also close file handles being used to read the index.

  Lucene queries are now executed on background threads to isolate them
  from SSH threads.

  This may also reduce latency for user dashboards on a multi-core system as
  each query for the different sections can now run on separate threads and
  return results when ready.

* [Issue 4249](https://bugs.chromium.org/p/gerrit/issues/detail?id=4249):
Fix 'Duplicate stages not allowed' error during indexing.

* [Issue 4238](https://bugs.chromium.org/p/gerrit/issues/detail?id=4238):
Fix 'not found' error when browsing tree in gitweb.

  The `refs/heads/` prefix was incorrectly being added to `HEAD`, causing a
  '404 Not Found' error.

* Allow to read repositories that do not end with `.git`.

* [Issue 4262](https://bugs.chromium.org/p/gerrit/issues/detail?id=4262):
Fix GPG push certificate for first patch set of new changes.

  The GPG certificate was not being set for the first patch set of new
  changes.

* [Issue 4296](https://bugs.chromium.org/p/gerrit/issues/detail?id=4296):
Fix internal error when a query does not contain any token.

* [Issue 4241](https://bugs.chromium.org/p/gerrit/issues/detail?id=4241):
Fix 'Cannot format velocity template' error when sending notification emails.

* Fix `sshd.idleTimeout` setting being ignored.

  The `sshd.idleTimeout` setting was not being correctly set on the SSHD
  backend, causing idle sessions to not time out.

* [Issue 4324](https://bugs.chromium.org/p/gerrit/issues/detail?id=4324):
Set the correct uploader on new patch sets created via the inline editor.

* Log a warning instead of failing when invalid commentlinks are configured.

* [Issue 4136](https://bugs.chromium.org/p/gerrit/issues/detail?id=4136):
Fix support for `HEAD` requests in the REST API.

  Sending a `HEAD` request failed with '404 Not Found'.

* Return proper error response when trying to confirm an email that is already
used by another user.

* [Issue 4318](https://bugs.chromium.org/p/gerrit/issues/detail?id=4318)
Fix 'Rebase if Necessary' merge strategy to prevent introducing a duplicate
commit when submitting a merge commit.

* [Issue 4332](https://bugs.chromium.org/p/gerrit/issues/detail?id=4332):
Allow `local` as a valid TLD for outgoing emails.

* Bypass hostname verification when `sendemail.sslVerify` is disabled.

* [Issue 4398](https://bugs.chromium.org/p/gerrit/issues/detail?id=4398):
Replication: Consider ref visibility when scheduling replication.

  It was possible for refs to be replicated to remotes despite not being
  visible to groups mentioned in the `authGroup` setting.

* [Issue 4036](https://bugs.chromium.org/p/gerrit/issues/detail?id=4036):
Fix hanging query when using `is:watched` without authentication.

### 2.12.3 {#2.12.3}

* Fix SSL security issue in the SMTP email relay.

  The hostname of the SSL socket was not verified. This made the read
  from the socket insecure since without verifying the hostname it may
  be [vulnerable to a man-in-the-middle attack](https://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf).

* [Issue 3895](https://bugs.chromium.org/p/gerrit/issues/detail?id=3895):
Fix failure to submit with 'Rebase if Necessary' after changes were reordered
with interactive rebase.

* [Issue 4052](https://bugs.chromium.org/p/gerrit/issues/detail?id=4052):
Fix failure to start server after upgrade from version 2.9.4.

* [Issue 3891](https://bugs.chromium.org/p/gerrit/issues/detail?id=3891):
Fix query with `label:` operator and zero value.

* [Issue 4112](https://bugs.chromium.org/p/gerrit/issues/detail?id=4112):
Fix failure to submit changes caused by empty user edit ref.

* [Issue 4087](https://bugs.chromium.org/p/gerrit/issues/detail?id=4087):
Fix failure to submit change when a branch is created on the change ref.

* [Issue 4155](https://bugs.chromium.org/p/gerrit/issues/detail?id=4155):
Fix tags REST API to correctly return all tags.

* [Issue 4154](https://bugs.chromium.org/p/gerrit/issues/detail?id=4154):
Add support for `.team` and several more TLDs in email address validation.

  Update commons-validator to 1.5.1.

* [Issue 4163](https://bugs.chromium.org/p/gerrit/issues/detail?id=4163):
Prevent removal of non-voting reviewers on submit of change.

* [Issue 2647](https://bugs.chromium.org/p/gerrit/issues/detail?id=2647):
Fix usage of `CTRL-C` on change screen.

* [Issue 4236](https://bugs.chromium.org/p/gerrit/issues/detail?id=4236):
Fix internal error when pushing an amended commit with the `%edit` option.

* [Issue 3426](https://bugs.chromium.org/p/gerrit/issues/detail?id=3426):
Fix pushing changes with `%base` option or `newChangeForAllNotInTarget` option.

* Show 'Submitted Together' tab for changes with same topic.

* Improve submit button tooltip messages shown when change is not submittable.

* Fix firing of the `topic-changed` hook.

* Remove `--dry-run` option from the `Reindex` site program.

  The implementation of the option was removed, but the option was mistakenly
  added back to the command and did not actually work.

* Print proper task names in the output of the `show-queues` command.

* Replication plugin: Double check if a ref is missing locally before deleting
from remote.

* Show an error message when trying to add a non-existent group to an ACL.


### 2.12.2 {#2.12.2}

* Upgrade Apache commons-collections to version 3.2.2.

  Includes a fix for a [remote code execution exploit](https://issues.apache.org/jira/browse/COLLECTIONS-5800).

* [Issue 3919](https://code.google.com/p/gerrit/issues/detail?id=3919):
Explicitly set parent project to 'All-Projects' when a project is created
without giving the parent.

* Don't add message twice on abandon or restore via ssh review command.

  When abandoning or reviewing a change via the ssh `review` command, and
  providing a message with the `--message` option, the message was added to
  the change twice.

* Clear the input box after cancelling add reviewer action.

  When the action was cancelled, the content of the input box was still
  there when opening it again.

* Fix internal server error when aborting ssh command.

* [Issue 3969](https://code.google.com/p/gerrit/issues/detail?id=3969):
Fix internal server error when submitting a change with 'Rebase If Necessary'
strategy.

### 2.12.1 {#2.12.1}

#### General

* Fix column type for signed push certificates.

  The column type `VARCHAR(255)` was too small, preventing some PGP push
  certificates from being stored.

* Add the `DRAFT_COMMENTS` option to the list changes REST API endpoint
and mark it as deprecated.

  It was removed in version 2.12 because it's not needed any more by the UI,
  but this caused failures for clients that still use it.

  Now it is added back, although it does not do anything and is marked as
  deprecated.

* [Issue 3669](https://code.google.com/p/gerrit/issues/detail?id=3669):
Fix schema migration when migrating to 2.12.x directly from a version
earlier than 2.11.

* [Issue 3733](https://code.google.com/p/gerrit/issues/detail?id=3733):
Correctly detect symlinked log directory on startup.

  If `$site_path/logs` was a symlink, the server would not start.

* [Issue 3871](https://code.google.com/p/gerrit/issues/detail?id=3871):
Throw an explicit exception when failing to load a change from the database.

  If a change could not be loaded from the database, for example if it was
  manually removed from the changes table but references to it were remaining
  in other tables, a null change was returned which would then lead to an
  'Internal Server Error' that was difficult to track down. Now an error is
  raised earlier which will help administrators to find the root cause.

* [Issue 3743](https://code.google.com/p/gerrit/issues/detail?id=3743):
Use submitter identity as committer when using 'Rebase if Necessary' merge
strategy.

  When submitting a change that required rebase, the committer was being
  set to 'Gerrit Code Review' instead of the name of the submitter.

* [Issue 3758](https://code.google.com/p/gerrit/issues/detail?id=3758):
Fix serving of static resources when deployed in application container.

  When deployed in a container, for example Tomcat, it was not possible to
  load the UI because static content could not be loaded from the WAR file.

* [Issue 3790](https://code.google.com/p/gerrit/issues/detail?id=3790):
Fix documentation link when deployed in application container.

  When deployed in a container, for example Tomcat, the 'Documentation' menu
  was missing.

* [Issue 3786](https://code.google.com/p/gerrit/issues/detail?id=3786):
Fix SQL statement syntax in schema migration.

  An extra semicolon was preventing migration from 2.11.x to 2.12 when using
  an Oracle database.

* Send email using email queue instead of the default queue.

  Some emails sent asynchronously were already being sent using that queue
  but some were not. This was confusing for a gerrit administrator because
  if there is a build up of `send-email` tasks in the queue, he would
  think that increasing `sendemail.threadPoolSize` would help but it did not
  because some of the email were sent using the default queue which is
  configurable using `execution.defaultThreadPoolSize`.

* Fix XSRF token cookie to honor `auth.cookieSecure` setting.

* [Issue 3767](https://code.google.com/p/gerrit/issues/detail?id=3767):
Fix replication of first patch set for new changes.

  When new changes were pushed from the command line, the first patch
  set did not get replicated to destinations.

* [Issue 3771](https://code.google.com/p/gerrit/issues/detail?id=3771):
Remove `index.defaultMaxClauseCount` configuration option.

  When `index.maxTerms` was either not set (thus no limit) or set to a value
  higher than `index.defaultMaxClauseCount` it was possible that viewing the
  related changes tab could cause a 'Too many clauses' error for changes that
  have a lot of related changes.

  The `index.defaultMaxClauseCount` configuration option is removed, and the
  existing `index.maxTerms` is reused. The default value of `index.maxTerms`
  is reduced from 'no limit' to 1024.

* [Issue 3919](https://code.google.com/p/gerrit/issues/detail?id=3919):
Explicitly set parent project to 'All-Projects' when a project is created
without giving the parent.

* [Issue 3948](https://code.google.com/p/gerrit/issues/detail?id=3948):
Fix submit of project parent updates on `refs/meta/config`.

  When submitting a change on `refs/meta/config` to update a project's parent,
  the error 'The change must be submitted by a Gerrit administrator' was being
  displayed even when the submitter was an admin. The submit was successful
  when clicking 'Submit' a second time.

* [Issue 3811](https://code.google.com/p/gerrit/issues/detail?id=3811):
Fix submittability of merge commits that resolve merge conflicts.

  If a series of changes contained a change that conflicted with the destination
  branch, but the conflict was solved by a merge commit at the tip of the
  series, the series was not submittable.

* [Issue 3883](https://code.google.com/p/gerrit/issues/detail?id=3883):
Respect the `core.commentchar` setting from `.gitconfig` in `commit-msg` hook.

#### UI

* [Issue 3894](https://code.google.com/p/gerrit/issues/detail?id=3894):
Fix display of 'Related changes' after change is rebased in web UI:

* [Issue 3071](https://code.google.com/p/gerrit/issues/detail?id=3071):
Fix display of submodule differences in side-by-side view.

* [Issue 3718](https://code.google.com/p/gerrit/issues/detail?id=3718):
Hide avatar images when no avatars are available.

  The UI was showing a transparent empty image with a border.

* [Issue 3731](https://code.google.com/p/gerrit/issues/detail?id=3731):
Fix syntax higlighting of tcl files.

* [Issue 3863](https://code.google.com/p/gerrit/issues/detail?id=3863):
Fix display of active row marker in tag list.

  Clicking on one of the rows would cause the tag name to disappear.

* [Issue 1207](https://code.google.com/p/gerrit/issues/detail?id=1207):
Fix keyboard shortcuts for non-US keyboards on side-by-side diff screen.

  The forward/backward navigation keys `[` and `]` only worked on keyboards where
  these characters could be typed without using any modifier key (like CTRL, ALT,
  etc..).

  Note that the problem still exists on the unified diff screen.

* Improve tooltip on 'Submit' button when 'Submit whole topic' is enabled
and the topic can't be submitted due to some changes not being ready.

#### Plugins

* [Issue 3821](https://code.google.com/p/gerrit/issues/detail?id=3821):
Fix repeated reloading of plugins when running on OpenJDK 8.

  OpenJDK 8 uses nanotime precision for file modification time on systems that
  are POSIX 2008 compatible. This leads to precision incompatibility when
  comparing the plugin's JAR file timestamp, resulting in the plugin being
  reloaded every minute.

* [Issue 3741](https://code.google.com/p/gerrit/issues/detail?id=3741):
Fix handling of merge validation exceptions emitted by plugins.

  If a plugin raised an exception, it was reported to the user as 'Change is
  new', rather than 'Missing dependency'.

* Allow plugins to get the caller in merge validation requests.

  Plugins that implement the `MergeValidationListener` interface now get the
  caller (the user who initiated the merge) in the `onPreMerge` method.

  Existing plugins that implement this interface must be adapted to the new
  method signature.

* [Issue 3892](https://code.google.com/p/gerrit/issues/detail?id=3892):
Allow plugins to suggest reviewers based on either change or project
resources.

#### Documentation

* Update documentation of `commentlink` to reflect changed search URL.

* Add missing documentation of valid `database.type` values.

#### Upgrades

* Upgrade JGit to 4.1.2.201602141800-r.
