Release notes for Gerrit 2.5
============================

Gerrit 2.5 is now available:

link:http://code.google.com/p/gerrit/downloads/detail?name=gerrit-2.5.war[http://code.google.com/p/gerrit/downloads/detail?name=gerrit-2.5.war]

Gerrit 2.5 includes the bug fixes done with
link:ReleaseNotes-2.4.1.html[Gerrit 2.4.1] and
link:ReleaseNotes-2.4.2.html[Gerrit 2.4.2]. These bug fixes are *not*
listed in these release notes.

Schema Change
-------------
*WARNING:* This release contains schema changes.  To upgrade:
----
  java -jar gerrit.war init -d site_path
----

*WARNING:* Upgrading to 2.5.x requires the server be first upgraded to 2.1.7 (or
a later 2.1.x version), and then to 2.5.x.  If you are upgrading from 2.2.x.x or
newer, you may ignore this warning and upgrade directly to 2.5.x.

Upgrade Warnings
----------------

[[replication]]
Replication
~~~~~~~~~~~

Gerrit 2.5 no longer includes replication support out of the box.
Servers that reply upon `replication.config` to copy Git repository
data to other locations must also install the replication plugin.

Cache Configuration
~~~~~~~~~~~~~~~~~~~

Disk caches are now backed by individual H2 databases, rather than
Ehcache's own private format. Administrators are encouraged to clear
the `'$site_path'/cache` directory before starting the new server.

The `cache.NAME.diskLimit` configuration variable is now expressed in
bytes of disk used. This is a change from previous versions of Gerrit,
which expressed the limit as the number of entries rather than bytes.
Bytes of disk is a more accurate way to size what is held. Admins that
set this variable must update their configurations, as the old values
are too small. For example a setting of `diskLimit = 65535` will only
store 64 KiB worth of data on disk and can no longer hold 65,000 patch
sets. It is recommended to delete the diskLimit variable (if set) and
rely on the built-in default of `128m`.

The `cache.diff.memoryLimit` and `cache.diff_intraline.memoryLimit`
configuration variables are now expressed in bytes of memory used,
rather than number of entries in the cache. This is a change from
previous versions of Gerrit and gives administrators more control over
how memory is partioned within a server. Admins that set this variable
must update their configurations, as the old values are too small.
For example a setting of `memoryLimit = 1024` now means only 1 KiB of
data (which may not even hold 1 patch set), not 1024 patch sets.  It
is recommended to set these to `10m` for 10 MiB of memory, and
increase as necessary.

The `cache.NAME.maxAge` variable now means the maximum amount of time
that can elapse between reads of the source data into the cache, no
matter how often it is being accessed. In prior versions it meant how
long an item could be held without being requested by a client before
it was discarded. The new meaning of elapsed time before consulting
the source data is more useful, as it enables a strict bound on how
stale the cached data can be. This is especially useful for slave
servers account and permission data, or the `ldap_groups` cache, where
updates are often made to the source without telling Gerrit to reload
the cache.

New Features
------------

Plugins
~~~~~~~

The Gerrit server functionality can be extended by installing plugins.
Depending on how tightly the extension code is coupled with the Gerrit
server code, there is a distinction between
link:../Documentation/dev-plugins.html#plugin[plugins] and
link:../Documentation/dev-plugins.html#extension[extensions].

* link:#replication[Move replication logic to replication plugin]
+
This splits all of the replication code out of the core server
and moves it into a standard plugin.

* link:../Documentation/dev-plugins.html[Documentation about
  plugin development] including instructions for:
** link:../Documentation/dev-plugins.html#getting-started[how to get
   started with plugin development]
** link:../Documentation/dev-plugins.html#deployment[plugin
   deployment/installation]

* link:../Documentation/dev-plugins.html#API[API for plugins and
  extensions]

* Support for link:../Documentation/dev-plugins.html#ssh[SSH command
  plugins]
+
Allows plugin developers to declare additional SSH commands.

* Enable link:#ssh-alias[aliases for SSH commands]
+
Site administrators can alias SSH commands from a plugin into the
`gerrit` namespace.
+
The aliases are configured statically at server startup, but are
resolved dynamically at invocation time to the currently loaded
version of the plugin. If the plugin is not loaded, or does not
define the command, "not found" is returned to the user.

* Support for link:../Documentation/dev-plugins.html#http[HTTP
  plugins]
+
Plugins may contribute to the /plugins/NAME/ URL space.

* Automatic registration of plugin bindings
+
If a plugin has no modules declared in the manifest, automatically
generate the modules for the plugin based on the class files that
appear in the plugin and the `@Export` annotations that appear on
these concrete classes.
+
For any non-abstract command that extends SshCommand, plugins may
declare the command with `@Export("name")` to
link:../Documentation/dev-plugins.html#ssh[bind the implementation
as that SSH command].
+
Likewise link:../Documentation/dev-plugins.html#http[HTTP servlets
can also be bound to URLs].

* link:../Documentation/dev-plugins.html#data-directory[Support a data
  directory for plugins on demand]

* Support serving static/ and Documentation/ from plugins
+
The static/ and Documentation/ resource directories of a plugin can be
served over HTTP for any loaded and running plugin, even if it has no
other HTTP handlers. This permits a plugin to supply icons or other
graphics for the web UI, or documentation content to help users learn
how to use the plugin.

* link:../Documentation/dev-plugins.html#documentation[Auto-formatting
  of plugin HTTP pages from Markdown files]
+
If Gerrit detects that a requested plugin resource does not exist, but
instead a file with a `.md` extension does exist, Gerrit opens the
`.md` file and reformats it as html.

* Support of link:../Documentation/dev-plugins.html#macros[macros in
  Markdown plugin documentation]

* link:../Documentation/dev-plugins.html#auto-index[Automatic
  generation of an index for the plugin documentation]

* Support for audit plugins
+
Plugins can implement an `AuditListener` to be informed about auditable
actions:
+
----
  @Listener
  public class MyAuditTrail extends AuditListener
----
+
The plugin must define a plugin module that binds the implementation of
the audit listener in the `configure()` method:
+
----
  DynamicSet.bind(binder(), AuditListener.class).to(MyAuditTrail.class);
----

* Web UI for plugins
+
Administrators can see the list of installed plugins in the WebUI
under `Admin` > `Plugins`. For each plugin the plugin status is shown
and it is possible to navigate to the plugin documentation.

* Servlet to list plugins
+
Administrators can retrieve plugin information from a REST interface
by loading `<server-url>/a/plugins/`.

* Support SSH commands to
** link:../Documentation/cmd-plugin-ls.html[list the installed
   plugins]
** link:../Documentation/cmd-plugin-install.html[install plugins]
** link:../Documentation/cmd-plugin-enable.html[enable plugins]
** link:../Documentation/cmd-plugin-remove.html[disable plugins]
** link:../Documentation/cmd-plugin-reload.html[reload plugins]

* Support installation of core plugin on site initialization

* Automatically load/unload/reload plugins
+
The PluginScanner thread runs every 1 minute by default and loads any
newly created plugins, unloads any deleted plugins, and reloads any
plugins that have been modified.
+
The check frequency can be configured by setting
link:../Documentation/config-gerrit.html#plugins.checkFrequency[
plugins.checkFrequency] in the Gerrit config file. By configuration
the scanner can also be disabled.

* link:../Documentation/dev-plugins.html#classpath[Loading of plugins
  in own ClassLoader]

* Plugin cleanup in the background
+
When a plugin is stopped, schedule a Plugin Cleaner task to run
1 minute later to try and clean out the garbage and release the
JAR from `$site_path/tmp`.

* Export `LifecycleListener` as extension point
+
Extensions may need to know when they are starting or stopping.
Export the interface that they can use to learn this information.

* Support injection of `ServerInformation` into extensions and plugins
+
Plugins can take this value by injection and learn the current
server state during their own LifecycleListener. This enables a
plugin to determine if it is loading as part of server startup, or
because it was dynamically installed or reloaded by an administrator.

* link:../Documentation/dev-plugins.html#getting-started[Maven
  archetype for creating gerrit plugin projects]

* Enables the use of session management in Jetty
+
This enables plugins to make use of servlet sessions.

REST API
~~~~~~~~
Gerrit now supports a REST like API available over HTTP. The API is
suitable for automated tools to build upon, as well as supporting some
ad-hoc scripting use cases.

* link:../Documentation/rest-api.html[Documentation of the REST API]

* Support REST endpoints to
** link:../Documentation/rest-api.html#changes[query changes]
** link:../Documentation/rest-api.html#projects[list projects]
** link:../Documentation/rest-api.html#suggest-projects[suggest
   projects]
** link:../Documentation/rest-api.html#accounts_self_capabilities[query
   the global capabilities of the calling user]

* Support link:../Documentation/rest-api.html#authentication[anonymous
  and authenticated access] to the REST endpoints

* Support link:../Documentation/rest-api.html#output[JSON output
  format] for the REST endpoints

The new REST API is used from the Gerrit WebUI.

Some of the methods from the old internal JSON-RPC interface were
completely replaced by the new REST API and got deleted:

* `ProjectAdminService.visibleProjects(AsyncCallback<ProjectList>)`
* `ProjectAdminService.suggestParentCandidates(AsyncCallback<List<Project>>)`
* `ChangeListService.myStarredChangeIds(AsyncCallback<Set<Change.Id>>)`
* `ChangeListService.allQueryNext(String, String, int, AsyncCallback<SingleListChangeInfo>)`
* `ChangeListService.allQueryPrev(String, String, int, AsyncCallback<SingleListChangeInfo>)`
* `ChangeListService.forAccount(Account.Id, AsyncCallback<AccountDashboardInfo>)`

[[query-deprecation]]
In addition the `/query` API has been deprecated. By default it is
still available but server administrators may disable it by setting
the link:../Documentation/config-gerrit.html#site.enableDeprecatedQuery[
`site.enableDeprecatedQuery`] parameter in the Gerrit config file. This
allows to enforce tools to move to the new API.

Web
~~~

Change Screen
^^^^^^^^^^^^^

* Display commit message in a box
+
The commit message on the change screen is now placed in a box with a
title and emphasis on the commit summary. The star icon and the
permalink are displayed in the box header. The header from the change
screen is removed as it only held duplicate information.

* Open the dependency section automatically when the change is needed
  by an open change

* Only show a change as needed by if its current patch set depends on
  the change

* Show only changes of the same project in the 'Depends On' section
+
If two projects share the same history it can happen that the same
commit is pushed for both projects, resulting in two changes. If now
a successor commit is pushed for one of the projects, the resulting
successor change was wrongly listing both changes in the 'Depends On'
section. Now only the predecessor change of the own project is listed.

* link:http://code.google.com/p/gerrit/issues/detail?id=1383[issue 1383]:
  Display the approval table on the PublishCommentsScreen.
+
So far the approval table that shows the reviewers and their current
votes was only shown on the ChangeScreen. Now it is also shown on the
PublishCommentScreen. This allows the reviewer to see all existing
votes and reviewers when doing their own voting and publishing of
comments. Seeing the existing votes helps the reviewer in
understanding which votes are still required before the change can be
submitted.

* link:http://code.google.com/p/gerrit/issues/detail?id=1380[issue 1380]:
  Display time next to change comments
+
When a comment was posted yesterday, or any time older than 1 day but
less than 1 year ago, display the time too. Display "May 2 17:37" rather
than just "May 2".

* Only show "Can Merge" when the change is new or draft

* Allow auto suggesting reviewers to draft changes
+
Auto completing users for draft changes did't work as the other
users didn't have access to the drafts. The visibility check for
the reviewer suggestion is now skipped.

* link:http://code.google.com/p/gerrit/issues/detail?id=1294[issue 1294]:
  Shorten subject of parent commit for displaying in the UI
+
If the parent commit has a very long subject (> 80 characters) shorten
the subject for displaying it in the Gerrit web UI on the change screen.
This avoids that the 'Parent(s)' cell for the patch set becomes very
wide.

* If subject is shortened for displaying in the UI indicate this by '...'
+
If a commit has a very long subject line (> 80 characters) it is
shortened when it is displayed in the Gerrit Web UI. Indicate to the
user that the subject was shortened by appending '...' to the shortened
subject.
+
Also the subject is now cropped after a whitespace if possible.

* Insert Change-Id for revert commits
+
The 'Revert Change' action on a merged change allows to create a new
change that reverts the merged change. The commit message of the revert
commit now contains a Change-Id.
+
It is convenient if a Change-Id is automatically created and inserted
into the commit message of the revert commit since it makes rebasing of
the revert commit easier.

* Use more gentle shade of red to highlight outdated dependencies

Patch Screens
^^^^^^^^^^^^^

* New patch screen header
+
A new patch screen header was added that is displayed above both the
side-by-side and unified views. The new header contains actual links to
the available patchsets and shows which patchset is being currently
displayed.

* link:http://code.google.com/p/gerrit/issues/detail?id=1192[issue 1192]:
  Add download links to the unified diff view

* Improvement of the side-by-side viewer table
+
The line number column for the right side was moved to be on the far
right of the table, so that the layout now looks like this:
+
----
  1 |  foo       |       bar   | 1
  2 |  hello     |       hello | 2
----
+
This looks nicer when reading a lot of code, as the line numbers are
less relevant than the code itself which is now in the center of the
UI.
+
Line numbers are still links to create comment editors, but they
use a light shade of gray and skip the underline decoration, making
them less visually distracting.
+
Skip lines now use a paler shade of blue and also hide the fact they
contain anchors, until you hover over them and the anchor shows up.
+
The expand before and after are changed to be arrows showing in
which direction the lines will appear above or below the skip
line.

* link:http://code.google.com/p/gerrit/issues/detail?id=626[issue 626]:
  Option to display line endings
+
There is a new user preference that allows to display Windows EOL/Cr-Lf.
'\r' is shown in a dotted-line box (similar to how '\r' is displayed in
GitWeb).

* Streamlined review workflow
+
A link was added next to the "Reviewed" checkbox that marks the current
patch as reviewed and goes to the next unreviewed patch.

* Add key commands to mark a patch as reviewed
+
Add key commands
+
. to toggle the reviewed flag for a patch ('m')
+
and
+
. to mark the patch as reviewed and navigate to the next unreviewed
patch ('M').

* Use download icons instead of the `Download` text links

User Dashboard
^^^^^^^^^^^^^^
* Support for link:../Documentation/user-custom-dashboards.html[custom
  dashboards]

* link:http://code.google.com/p/gerrit/issues/detail?id=1407[issue 1407]:
  Improve highlighting of unreviewed changes in the user's dashboard
+
A change will be highlighted as unreviewed if
+
. the user is reviewer of the change but hasn't published any change
  message for the current patch set
. the user has published a change message for the current patch set,
  but afterwards the change owner has published a change message on
  the change

* Sort outgoing reviews in the user dashboard by created date

* Sort incoming reviews in the user dashboard by updated date
+
Sorting the incoming reviews by last updated date, descending, places
the most recently updated reviews at the top of the list for a user,
and the oldest stale at the bottom. This may help users to identify
items to take immediate action on, as they appear closer to the top.

Access Rights Screen
^^^^^^^^^^^^^^^^^^^^

* Display error if modifying access rights for a ref is forbidden
+
If a user is owner of at least one ref he is able to edit the access
rights on a project. If he adds access rights for other refs, these
access rights were silently ignored on save. Instead of this now an
error message is displayed to inform the user that he doesn't have
permissions to do the update for these refs.
+
In case of such an error the project access screen stays in the edit
mode so that the unsaved modifications are not lost. The user may now
propose the changes to the access rights through code review.

* Allow to propose changes to access rights through code review
+
Users that are able to upload changes for code review for the
`refs/meta/config` branch can now propose changes to the project access
rights through code review directly from the ProjectAccessScreen.
+
When editing the project access rights there is a new button
'Save for Review' which will create a new change for the access
rights modifications. Project owners are automatically added as
reviewer to this change. If a project owner agrees to the access rights
modifications he can simply approve and submit the change.

* Show all access rights in WebUI if user can read `refs/meta/config`
+
Users who can read the `refs/meta/config` branch, can see all access
rights by fetching this branch and looking at the `project.config`
file. Now they can see the same information in the web UI.

* Allow extra group suggestions for project owners
+
When suggesting groups to a user, only groups that are visible to the
user are suggested. These are those group that the user is member of.
For project owners now also groups to which they are not a member are
suggested when editing the access rights of the project.

Other
^^^^^

* link:http://code.google.com/p/gerrit/issues/detail?id=1592[issue 1592]:
  Ask user to login if change is not found
+
Accessing a change URL was failing with 'Application Error - The page
you requested was not found, or you do not have permission to view this
page' if the user was not signed in and the change was not visible to
`Anonymous Users`. Instead Gerrit now asks the user to login and
afterwards shows the change to the user if it exists and is visible.
If the change doesn't exist or is not visible, the user will still get
the NotFoundScreen after sign in.

* Link to owner query from user names
+
Instead of linking from a user name to the user's dashboards, link to
a search for changes owned by that user.

* link:../Documentation/config-gerrit.html#gerrit.reportBugUrl[Allow
  configuring the `Report Bug` URL]
+
Let site administrators direct users to their own ticket queue, as for
many servers most of the reported bugs are small internal problems like
asking for a repository to be created or updating group memberships.

* On project creation allow choosing the parent project from a popup
+
In the create project UI a user can now browse all projects and select
one as parent for the new project.

* Check for open changes on branch deletion
+
Check for open changes when deleting a branch in the Gerrit WebUI.
Delete a branch only if there are no open changes for this branch.
This makes users aware of open changes when deleting a branch.

* Enable ProjectBranchesScreen for the `All-Projects` project
+
This allows to see the branches of the `All-Projects` project in the
web UI.

* Show for each project in the project list a link to the repository
  browser (e.g. GitWeb).

* Move the project listing menu items to a new top-level item
+
Finding the project listing was very opaque to end users. Nobody
expected to look under `Admin` and furthermore, anonymous users were
unable to find that link at all.
+
Introduced a new top-level `Projects` menu that has `List` in it to
take you to the project listing.
+
In addition the `Create new project` link from the top of that listing
was moved to this new menu.

* Move the Groups and Plugins menu items to the top level
+
The top-level Admin menu is removed as it is now unnecessary after the
Projects, Groups and Plugins menu items were moved to the top-level.

* Move form for group creation to own screen
+
Move the form for the group creation from the GroupListScreen to an
own new CreateGroupScreen and add a link to this screen at the
beginning of the GroupListScreen. The link to the CreateGroupScreen is
only visible if the user has the permission to create new groups.

* Drop the `Owners` column from the group list screen
+
The `Owners` column on the group list screen has been dropped in order
to link:#performance-issue-on-showing-group-list[speed up the loading
of the group list screen].

* Drop the `Group Type` column from the group list screen
+
Since link:#migrate-ldap-groups[the LDAP group type was removed] there
is no need to display the group type on the group list screen anymore.
There are only 3 `SYSTEM` groups using well known names, and everything
else has the type `INTERNAL`.

* When adding a user to a group create an account for the user if needed
+
Trying to add a user to a group that doesn't have an account fails with
'... is not a registered user.'. Now adding a user to a group does not
immediately fail if there is no account for the user, but it tries to
authenticate the user and if the authentication is successful a user
account is automatically created, so that the user can be added to the
group. This only works if LDAP is used as user backend.
+
This allows to add users to groups that did not log in into Gerrit
before.

* Differentiate between draft changes and draft comments
+
Show the draft changes of the user when he clicks on `My` > `Drafts`.
The user's draft comments are now available under `My` >
`Draft Comments`.

* Show NotFoundScreen if a user that can't create projects tries to
  access the ProjectCreationScreen

* Add Edit, Reload next to non-editable Full Name field
+
If the user database is actually an external system users might need go
to another server to edit their account data, and then re-import their
account data by going through a login cycle. This is highly similar to
LDAP where the directory provides account data and its refreshed every
time the user visits the `/login/` URL handler.
+
The URL for the external system can be configured for the
link:#custom-extension[`CUSTOM_EXTENSION`] auth type.

Access Rights
~~~~~~~~~~~~~

* Restrict rebasing of a change in the web UI to the change owner and
  the submitter

* Add a new link:../Documentation/access-control.html#category_rebase[
  access right to permit rebasing changes in the web UI]

* link:http://code.google.com/p/gerrit/issues/detail?id=930[issue 930]:
  Add new link:../Documentation/access-control.html#category_abandon[
  access right for abandoning changes]

* Check if user can upload in order to restore
+
Restoring a change is similar to uploading a new change. If a branch
gets closed by removing the access rights to upload new changes it
shouldn't be possible to restore changes for this branch.

[[hide-config]]
* Make read access to `refs/meta/config` by default exclusive to
  project owners
+
When initializing a new site a set of default access rights is
configured on the `All-Projects` project. These default access rights
include read access on `refs/*` for `Anonymous Users` and read access
on `refs/meta/config` for `Project Owners`. Since the read access on
`refs/meta/config` for `Project Owners` was not exclusive,
`Anonymous users` were able to access the `refs/meta/config` branch
which by default should only be accessible by the project owners.

Search
~~~~~~
* Offer suggestions for the search operators in the search panel
+
There are many search operators and it's difficult to remember all of
them. Now the search operators are suggested as the user types the
query.

* Support alias `self` in queries
+
Writing an expression like "owner:self status:open" will now identify
changes that the caller owns and are still open. This `self` alias
is valid in contexts where a user is expected as an argument to a
query operator.

* Add parent(s) revision information to output of query command

* Add owner username to output of query command

* `/query` API has been link:#query-deprecation[deprecated]

SSH
~~~
* link:http://code.google.com/p/gerrit/issues/detail?id=1095[issue 1095]
  link:../Documentation/cmd-set-account.html[SSH command to manage
  accounts]

* On link:../Documentation/cmd-create-account.html[account creation] a
  password for HTTP can be specified.

* link:../Documentation/cmd-set-project.html[SSH command to manage
  project settings]

* link:../Documentation/cmd-test-submit-rule.html[SSH command to test
  submit rules]
+
The command creates a fresh Prolog environment and loads a Prolog
script from stdin. `can_submit` is then queried and the results are
returned to the user.

* link:../Documentation/cmd-ban-commit.html[SSH command to ban
  commits]

[[ssh-alias]]
* Enable aliases for SSH commands
+
Site administrators can define aliases for SSH commands in the
link:../Documentation/config-gerrit.html#ssh-alias[`ssh-alias` section]
of the Gerrit configuration.

* Add submit records to the output of the
  link:../Documentation/cmd-query.html[query] SSH command:
+
Add a command line option to the `query` SSH command to include submit
records in the output.
+
This facilitates the querying of information relating to the submit
status from the command line and by API clients, including information
such as whether the change can be submitted as-is, and whether the
submission criteria for each review label has been met.

* Support JSON output format for the
  link:../Documentation/cmd-ls-projects.html[ls-projects] SSH command

* Support creation of multiple branches in
  link:../Documentation/cmd-create-project.html[create-project] SSH
  command
+
In case if a project has some kind of waterfall automerging
a->b->c it is convenient to create all these branches at the
project creation time.
+
e.g. '.. gerrit create-project -b master -b foo -b bar ...'

* Add verbose output option to
  link:../Documentation/cmd-ls-groups.html[ls-groups] command
+
The verbose mode enabled by the new option makes the ls-groups
command output a tab-separated table containing all available
information about each group (though not its members).

Documentation
~~~~~~~~~~~~~

Commands
^^^^^^^^

* document for the link:../documentation/cmd-create-group.html[`create-group`]
  command that for unknown users an account is automatically created if
  the LDAP authentication succeeds

* Update documentation and help text for the
  link:../documentation/cmd-review.html[`review`] SSH command
+
The review command can be applied to multiple changes, but the
help text was written in singular tense.
+
Add a paragraph in the documentation explaining that the
`--force-message` option will not be effective if the `review` command
fails because the user is not permitted to change the label.

* Clarify that `init --batch` doesn't drop old database objects

* Update the list of unsupported slave commands

* Fix link:../Documentation/cmd-stream-events.html[`stream-events`]
  documentation
+
Some attributes contained in the events were not described, for a few
others the name was given in a wrong case.

* Fix and complete synopsis of commands

Access Control
^^^^^^^^^^^^^^

* Clarify the ref format for
  link:../Documentation/access-control.html#category_push_merge[`Push
  Merge Commit`]
+
Elaborate on the required format of the ref used for `Push Merge Commit`
access right entries to avoid user confusion when granting access to
`refs/heads/*` still doesn't allow them to push any merge commits.

* Document the
  link:../Documentation/access-control.html#capability_emailReviewers[
  `emailReviewers`] capability

Error
^^^^^
* Improve documentation of link:../Documentation/error-change-closed.html[
  `change closed` error]
+
The `change closed` error can also occur when trying to submit a
review label with the SSH review command onto a change that has
been closed (submitted and merged, or abandoned) or onto a patchset
that has been replaced by a newer patchset.

* Correct documentation of `invalid author` and `invalid committer`
  errors
+
The error messages `you are not committer ...` and `you are not
author ...` were replaced with `invalid author` and `invalid
committer`.

* Describe that the `prohibited by Gerrit` error is returned if pushing
  a tag fails because the tagger is somebody else and the `Forge
  Committer` access right is not assigned.

Dev
^^^

* Update push URL in link:../SUBMITTING_PATCHES[SUBMITTING_PATCHES]
+
Pushes are now accepted at the same address as clone/fetch/pull.

* Update link:../Documentation/dev-contributing.html[contributor
  document]
+
We now prefer to use Guava (previously known as Google Collections).

* Fixed broken link to source code
+
Updated the documentation source code links to point to:
http://code.google.com/p/gerrit/source/checkout

* State link:../Documentation/dev-eclipse.html#known-problems[known issues]
  when debugging Gerrit with Eclipse

* Improved the section on
  link:../Documentation/dev-eclipse.html#hosted-mode[hosted mode
  debugging]
+
The existing section on hosted mode debugging left out a couple of
steps, and the requirement to use `DEVELOPMENT_BECOME_ANY_ACCOUNT`
instead of `OpenID` was not mentioned anywhere.

* Add a link:../Documentation/dev-release.html[release preparation
  document]
+
Document what it takes to make a Gerrit stable or stable-fix release,
and how to release Gerrit subprojects.

Other
^^^^^
* Add link:../Documentation/prolog-cookbook.html[Cookbook for Prolog
  submit rules]
+
A new document providing a step by step introduction into implementing
specific submit policies using Prolog based submit rules was added.

* Describe link:../Documentation/refs-notes-review.html[
  `refs/notes/review` and its contents]

* link:../Documentation/config-mail.html[Document `RebasedPatchSet.vm`
  and `Reverted.vm` mail templates]

* Specify output file for curl commands in documentation
+
For downloading the `commit-msg` hook and the `gerrit-cherry-pick`
script users can either use scp or curl. Specify the output file for
each curl command so that the result is equal to the matching scp
command.

* Document that user must be in repository root to install `commit-msg`
  hook

* Add some clarifications to the
  link:../Documentation/install-quick.html[quick installation guide]

* Add missing documentation about
  link:../Documentation/config-gerrit.html#hooks[hook configuration]
+
Add documentation of hook config for `change-restored`, `ref-updated`
and `cla-signed` hooks.

* Document that the commit message hook file should be executable

* Mention that also MySQL supports replication, not just Postgres

* Make sorting of release notes consistent so that the release notes
  for the newest release is always on top

* Various corrections
+
Correct typos, spelling mistakes, and grammatical errors.

Dev
~~~
* Add link:../Documentation/dev-release.html#plugin-api[script for
  releasing plugin API jars]

* Pushes are now accepted at the same address as clone/fetch/pull
+
To submit patches commits can be pushed to
https://gerrit.googlesource.com/gerrit

* Add `-Pchrome`, `-Pwebkit`, `-Pfirefox` aliases for building
+
This makes it easier to build for the browser you want to
test on, rather than remembering what its GWT name is.

* Disable assertions for KeyCommandSet when running in gwtdebug mode
+
The assertions in the KeyCommandSet class cause exceptions when a
KeyCommand is registered several times.

* Add the run profiles to the favorites menu

* Add Intellij IDEA files to ignore list

* Move local Maven repository to Google Cloud Storage

* Make sure asciidoc uses unix line endings in generated HTML.
+
Use an explicit asciidoc attribute to make sure the produced HTML will
always contain unix line endings.  This will help in producing build
results that are better comparable by size.

* Remove timestamp from all `org.eclipse.core.resources.prefs` files
+
Eclipse overwrites these files when we import projects using m2e.
Eclipse 3 writes a timestamp at the top of these files making the Git
working tree dirty.  Eclipse 4 (Juno) still overwrites these files but
doesn't write the timestamp.  This should help to keep the working tree
clean.  However, since the timestamp is currently present in these
files, Eclispe 4 would still make them dirty by overwriting and
effectively removing the timestamp.
+
This change removes the timestamp from these files. This helps those
using Eclipse 4 and doesn't make it worse for those still using Eclispe
3.

* Add Maven profile to skip build of plugin modules
+
Building the plugin modules ('Plugin API' and 'Plugin Archetype') may
take a significant amount of time (since many jars are downloaded).
During development it is not needed to build the plugin modules. A new
Maven profile was added that skips the build of the plugin modules,
so that developers have a faster turnaround. This profile is called
`no-plugins` and it's active by default. To include the plugin modules
into the build activate the `all` profile:
+
----
  mvn clean package -P all
----
+
The script to make release builds has been adapted to activate the
`all` profile so that the plugin modules are always built for release
builds.

Mail
~~~~

* Add unified diff to newchange mail template
+
Add `$email.UnifiedDiff` as new macro to the `NewChange.vm` mail
template. This macro is expanded to a unified diff of the patch.

* link:../Documentation/config-gerrit.html#sendemail.includeDiff[
  sendemail.includeDiff]: Enable `$email.UnifiedDiff` in `NewChange.vm`
+
Instead of making site administrators hack the email template, allow
admins to enable the diff feature by setting a configuration variable
in `gerrit.config`.

* link:../Documentation/config-gerrit.html#sendemail.maximumDiffSize[
  sendemail.maximumDiffSize]: Limit the size of diffs sent by email
+
If a unified diff included in an email will exceed the limit configured
by the system administrator, only the affected file paths are listed in
the email instead. This gives interested parties some context on the
size and scope of the change, without killing their inbox.

* Catch all exceptions when emailing change update

* Allow unique from address generation
+
Allow the from email address to be a ParameterizedString that handles
the `${userHash}` variable. The value of the variable is the md5 hash
of the user name. This allows unique generation of email addresses, so
GMAIL threads names of users in conversations correctly. For example,
the from pattern for gerrit-review defined in the Gerrit configuration
looks like this:
+
----
  [sendemail]
    from = ${user} <noreply-gerritcodereview+${userHash}@google.com>
----

* Show new change URLs in the body of the new change email
+
Some email clients hide the signature section of an email
automatically.  If there are no reviewers listed on a new change,
such as when a change is pushed over HTTP and a notification is
automatically sent out to any subscribed watchers, the URL was
hidden inside of the signature and not readily available.
+
Show the URL right away in the body.

Miscellaneous
~~~~~~~~~~~~~
* Back in-memory caches with Guava, disk caches with H2
+
Instead of using Ehcache for in-memory caches, use Guava. The Guava
cache code has been more completely tested by Google in high load
production environments, and it tends to have fewer bugs. It enables
caches to be built at any time, rather than only at server startup.
+
By creating a Guava cache as soon as it is declared, rather than
during the LifecycleListener.start() for the CachePool, we can promise
any downstream consumer of the cache that the cache is ready to
execute requests the moment it is supplied by Guice. This fixes a
startup ordering problem in the GroupCache and the ProjectCache, where
code wants to use one of these caches during startup to resolve a
group or project by name.
+
Tracking the Gauva backend caches with a DynamicMap makes it possible
for plugins to define their own in-memory caches using CacheModule's
cache() function to declare the cache. It allows the core server to
make the cache available to administrators over SSH with the gerrit
show-caches and gerrit `flush-caches` commands.
+
Persistent caches store in a private H2 database per cache, with a
simple one-table schema that stores each entry in a table row as a
pair of serialized objects (key and value). Database reads are gated
by a BloomFilter, to reduce the number of calls made to H2 during
cache misses. In theory less than 3% of cache misses will reach H2 and
find nothing. Stores happen on a background thread quickly after the
put is made to the cache, reducing the risk that a diff or web_session
record is lost during an ungraceful shutdown.
+
Cache databases are capped around 128M worth of stored data by running
a prune cycle each day at 1 AM local server time. Records are removed
from the database by ordering on the last access time, where last
accessed is the last time the record was moved from disk to memory.

* Add OpenID SSO support.
+
Setting `OPENID_SSO` for
link:../Documentation/config-gerrit.html#auth.type[`auth.type`] in the
`gerrit.config` will allow the admin to specify an SSO entry point URL
so that users clicking on "Sign In" are sent directly to that URL.

* Git over HTTP BasicAuth against Gerrit basic auth.
+
Allows the configuration of native Gerrit username/password
authentication scheme used for Git over HTTP BasicAuth, as alternative
of the default DigestAuth scheme against the random generated password
on Gerrit DB.
+
Example setting for link:../Documentation/config-gerrit.html#auth.type[
`auth.type`] and link:../Documentation/config-gerrit.html#auth.gitBasicAuth[
`auth.gitBasicAuth`]:
+
----
  [auth]
    type = LDAP
    gitBasicAuth = true
----
+
With this configuration Git over HTTP protocol will be authenticated
using `HTTP-BasicAuth` and credentials checked on LDAP.

* Abstract group systems into GroupBackend interface
+
Group backends are supposed to use unique prefixes to isolate the
namespaces. E.g. the group backend for LDAP is using `ldap/` as prefix
for the group names.
+
This means that to refer to an LDAP group in the WebUI the group name
needs to be prefixed with the `ldap/` string. E.g. if there is a group
in LDAP which is called "Developers", Gerrit will suggest this group
when the user types `ldap/De`.

[[migrate-ldap-groups]]
* Migrate existing internal LDAP groups
+
Previously, LDAP groups were mirrored in the AccountGroup table and
given an Id and UUID the same as internal groups. Update these groups
to be backed by only a GroupReference, with a special "ldap:" UUID
prefix. Migrate all existing references to the UUID in ownerGroupUUID
and any `project.config`.
+
This made the LDAP group type obsolete and it was removed.

* link:https://code.google.com/p/gerrit/issues/detail?id=548[issue 548]:
  Make commands to download patch sets
  link:../Documentation/config-gerrit.html#download.command[configurable]
+
For patch sets on the ChangeScreen different commands for downloading
the patch sets are offered. For some installations not all commands are
needed. Allow Gerrit administrators to configure which download
commands should be offered.

* Add more link:../Documentation/config-gerrit.html#theme[theme color
  options]
+
** Add a theme option to change outdated background color
** Add odd/even row background color for tables such as list of open
reviews.  This makes them more visible without clicking on them.

* link:../Documentation/user-notify.html[Add `notify` section in
  `project.config`]
+
The notify section allows project owners to include emails to users
directly from `project.config`. This removes the need to create fake
user accounts to always BCC a group mailing list.

* Include the contributor agreements in the `project.config` and
  migrate contributor agreements to `All-Projects`
+
Update the parsing of `project.config` to support the contributor
agreements.
+
Add a new schema to move the ContributorAgreement, AccountAgreement,
and AccountGroupAgreement information into the `All-Projects`
`project.config`.

* Add `sameGroupVisibility` to `All-Projects` `project.config`
+
The `sameGroupVisiblity` is needed to restrict the visibility of
accounts when `accountVisibility` is `SAME_GROUP`. Namely, this is a
way to make sure the `autoVerify` group in a `contributor-agreements`
section is never suggested.

* Add change topic in hook arguments
+
It was not possible for hook scripts to include topic-specific
behaviour because the topic name was not included in the arguments.

* Add `--is-draft` argument on `patchset-created` hook
+
The `--is-draft` argument will be passed with either `true` if
the patchset is a draft, or `false` otherwise.
+
This can be used by hooks that need to behave differently if the
change is a draft.

* Log sign in failures on info level
+
If for a user signing in into the Gerrit web UI fails, this can have
many reasons, e.g. username is wrong, password is wrong, user is marked
as inactive, user is locked in the user backend etc. In all cases the
user just gets a generic error message 'Incorrect username or
password.'. Gerrit administrators had trouble to find the exact reason
for the sign in problem because the corresponding AccountException was
not logged.

* Do not log 'Object too large' as error with full stacktrace
+
If a user pushes an object which is larger than the configured
`receive.maxObjectSizeLimit` parameter, the push is rejected with an
'Object too large' error. In addition an error log entry with the full
stacktrace was written into the error log.
+
This is not really a server error, but just a user doing something that
is not allowed, and thus it should not be logged as error. For a Gerrit
administrator it might still be interesting how often the limit is hit.
This is why it makes sense to still log this on info level.
+
For the user pushing a too large object we now do not print the
'fatal: Unpack error, check server log' message anymore, but only the
'Object too large' error message.

* Add better explanations to rejection messages
+
Provide information to the user why a certain push was rejected.

* Automatic schema upgrade on Gerrit startup
+
In case when Gerrit administrator(s) don't have a direct access to the
file system where the review site is located it gets difficult to
perform a schema upgrade (run the init program). For such cases it is
convenient if Gerrit performs schema upgrade automatically on its
startup.
+
Since this is a potentially dangerous operation, by default it will not
be performed. The configuration parameter
link:../Documentation/config-gerrit.html#site.upgradeSchemaOnStartup[
site.upgradeSchemaOnStartup] is used to switch on automatic schema
upgrade.

* Shorten column names that are longer than 30 characters
+
Some databases can't deal with column names that are longer than 30
characters. Examples are MaxDB and
link:http://groups.google.com/group/repo-discuss/browse_thread/thread/ecb713d42c04ae8a/cc963525d8247a17?lnk=gst#cc963525d8247a17[Oracle].
+
Gerrit had two column names in the `accounts` table that exceeded the
30 characters: `displayPatchSetsInReverseOrder`,
`displayPersonNameInReviewCategory`
+
These 2 columns were renamed so that their names fit within the 30
character range.

* Increase the maximum length for tracking ID's to 32 characters
+
So far tracking ID's had a maximum length of only 20 characters.

* Set `GERRIT_SITE` in Gerrit hooks as environment variable
+
Allows development of hooks parametrised on Gerrit location. This can
be useful to allow hooks to load the Gerrit configuration when needed
(from `$GERRIT_SITE`) or even store their additional config files under
`$GERRIT_SITE/etc` and retrieve them at startup.

* Add an exponentially rolling garbage collection script
+
`git-exproll.sh` is a git garbage collection script aimed specifically
at reducing exccessive garbage collection and particularly large
packfile churn for Gerrit installations.
+
Excessive garbage collection on "dormant" repos is wasteful of both CPU
and disk IO.  Large packfile churn can lead to heavy RAM and FS usage
on Gerrit servers when the Gerrit process continues to hold open the
old delete packfiles.  This situation is most detrimental when jgit is
configured with large caching parameters.  Aside from these downsides,
running git gc often can be very beneficial to performance on servers.
This script attempts to implement a git gc policy which avoids the
downsides mentioned above so that git gc can be comfortably run very
regularly.
+
`git-exproll.sh` uses keep files to manage which files will get
repacked.  It also uses timestamps on the repos to detect dormant repos
to avoid repacking them at all.  The primary packfile objective is to
keep around a series of packfiles with sizes spaced out exponentially
from each other, and to roll smaller packfiles into larger ones once
the smaller ones have grown.  This strategy attempts to balance disk
space usage with avoiding rewriting large packfiles most of the time.
+
The exponential packing objective above does not save a large amount of
time or CPU, but it does prevent the packfile churn.  Depending on repo
usage, however the dormant repo detection and avoidance can result in a
very large time savings.

* Automatically flush persistent H2 cache if the existing cache entries
  are incompatible with the cache entry class and thus can't be
  deserialized

* Unpack JARs for running servers in `$site_path/tmp`
+
Instead of unpacking a running server into `~/.gerritcodereview/tmp`
only use that location for commands like init where there is no active
site. From gerrit.sh always use `$site_path/tmp` for the JARs to
isolate servers that run on the same host under the same UNIX user
account.

[[custom-extension]]
* Allow for the `CUSTOM_EXTENSION` `auth.type` to configure URLs for
  editing the user name and obtaining an HTTP password
+
Allow `CUSTOM_EXTENSION` auth type to supply by `auth.editFullNameUrl`
a URL in the web UI that links users to the other account system,
where they can edit their name, and then use another reload URL to
cycle through the `/login/` step and refresh the data cached by Gerrit.
+
Allow `CUSTOM_EXTENSION` auth type to supply by `auth.httpPasswordUrl`
a URL in the web UI that allows users to obtain an HTTP password.
+
Like the rest of the `CUSTOM_EXTENSION` stuff, this is hack that will
eventually go away when there is proper support for authentication
plugins.

Performance
~~~~~~~~~~~
[[performance-issue-on-showing-group-list]]
* Fix performance issues on showing the list of groups in the Gerrit
  WebUI
+
Loading `Admin` > `Groups` on large servers was very slow. The entire
group membership database was downloaded to the browser when showing
just the list of groups.
+
Now the amount of data that needs to be downloaded to the browser is
reduced by using the more leightweight `AccountGroup` type instead of
the `GroupDetail` type when showing the groups in a list format. As a
consequence the `Owners` column that showed the name of the owner group
had been dropped.

* Add index for accessing change messages by patch set
+
This improves the performance of loading the dashboards.

* Add a fast path to avoid checking every commit on push
+
If a user can forge author, committer and gerrit server identity, and
can upload merges, don't bother checking the commit history of what is
being uploaded. This can save time on servers that are trying to accept
a large project import using the push permission.

* Improve performance of `ReceiveCommits` by reducing `RevWalk` load
+
JGit RevWalk does not perform well when a large number of objects are
added to the start set by `markStart` or `markUninteresting`. Avoid
putting existing `refs/changes/` or `refs/tags/` into the `RevWalk` and
instead use only the `refs/heads` namespace and the name of the branch
used in the `refs/for/` push line.
+
Catch existing changes by looking for their exact commit SHA-1, rather
than complete ancestory. This should have roughly the same outcome for
anyone pushing a new commit on top of an existing open change, but
with lower computional cost at the server.

* Lookup changes in parallel during `ReceiveCommits`
+
If the database has high query latency, the loop that locates existing
changes on the destination branch given Change-Id can be slow. Start
all of the queries as commits are discovered, but don't block on
results until all queries were started.
+
If the database can build the `ResultSet` in the background, this may
hide some of the query latency by allowing the queries to overlap when
more than one lookup must be performed for a push.

* Perform change update on multiple threads
+
When multiple changes need to be created or updated for a single push
operation they are now inserted into the database by parallel threads,
up to the maximum allowed thread count. The current thread is used
when the thread pool is already fully in use, falling back to the
prior behavior where each concurrent push operation can do its own
concurrent database update. The thread pool exists to reduce latency
so long as there are sufficient threads available.
+
This helps push times on databases that are high latency, such as
database servers that are running on a different machine from the
Gerrit server itself, e.g. gerrit.googlesource.com.
+
The new thread pool is
link:../Documentation/config-gerrit.html#receive.changeUpdateThreads[
disabled by default], limiting the overhead to servers that have good
latency with their database, such as using in-process H2 database, or
a MySQL or PostgreSQL on the same host.

* Use `BatchRefUpdate` to execute reference changes
+
Some storage backends for JGit are able to update multiple references
in a single pass efficiently. Take advantage of this by pushing
any normal reference updates (such as direct push or branch create)
into a single `BatchRefUpdate` object.

* Assume labels are correct in ListChanges
+
To reduce end-user latency when displaying changes in a search result
or user dashboard, assume the labels are accurate in the database at
display time and don't recompute the access privileges of a reviewer.

* Notify the cache that the git_tags was modified
+
The tag cache was updated in-place, which prevented the H2 based
storage from writing out the updated tag information. This meant
servers almost never had the right data stored on disk and had to
recompute it at startup.
+
Anytime the value is now modified in place, put it back into the
cache so it can be saved for use on the next startup.

* Special case hiding `refs/meta/config` from Git clients
+
VisibleRefFilter requires a lot of server CPU to accurately provide
the correct listing to clients when they cannot read `refs/*`.
+
Since the default configuration is now to link:#hide-config[
hide `refs/meta/config`], use a special case in VisibleRefFilter that
permits showing every reference except `refs/meta/config` if a user can
read every other reference in the repository.

* Avoid second remote call to lookup approvals when loading change
  results
+
By using the new link:../Documentation/rest-api.html#changes[`/changes/`]
REST endpoint the web UI client now obtains the label information
during the query and avoids a second round trip to lookup the current
approvals for each displayed change. For most users this should improve
the way the page renders. The verified and code review columns will be
populated before the table is made visible, preventing the layout from
"jumping" the way the old UI did when the 2nd RPC finally finished and
supplied the label data.

* Load patch set approvals in parallel
+
ResultSet is a future-like interface, the database system is free to
execute each result set asynchronously in the background if it
supports that. gwtorm's default SQL backend always runs queries
immediately and then returns a ListResultSet, so for most installs this
has no real impact in ordering.
+
For the system that runs gerrit-review, each query has a high cost in
network latency, the system treats ResultSet as a future promise to
supply the matching rows. Getting all of the necessary ResultSets up
front allows the database to send all requests to the backend as early
as possible, allowing the network latency to overlap.

Upgrades
--------
* Update Gson to 2.1
* Update GWT to 2.4.0
* Update JGit to 2.0.0.201206130900-r.23-gb3dbf19

* Use gwtexpui 1.2.6
+
** Hide superfluous status text from clippy flash widget
** Fix diappearance of text in CopyableLabel when clicking on it

* Update Guava to 12.0.1
+
This fixes a performance problem with LoadingCache where the cache's
inner table did not dynamically resize to handle a larger number
of cached items, causing O(N) lookup performance for most objects.

Bug Fixes
---------

Security
~~~~~~~~
* Ensure that only administrators can change the global capabilities
+
Only Gerrit server administrators (members of the groups that have
the `administrateServer` capability) should be able to edit the
global capabilities because being able to edit the global capabilities
means being able to assign the `administrateServer` capability.
+
Because of this on the `All-Projects` project it is disallowed to assign
+
. the `owner` access rights on `refs/*`
+
Project owners (members of groups to which the `owner` access right
is assigned) are able to edit the access control list of the projects
they own. Hence being owner of the `All-Projects` project would allow
to edit the global capabilities and assign the `administrateServer`
capabilitiy without being Gerrit administrator.
+
In earlier Gerrit versions (2.1.x) it was already implemented like
this but the corresponding checks got lost.
+
. the 'push' access right on `refs/meta/config`
+
Being able to push configuration changes to the `All-Projects` project
allows to edit the global capabilities and hence a user with this
access right could assign the `administrateServer` capability without
being Gerrit administrator.
+
From the Gerrit WebUI (ProjectAccessScreen) it is not possible anymore
to assign on the `All-Projects` project the `owner` access right on
`refs/*` and the `push` access right on `refs/meta/config`.
+
In addition it is ensured that an `owner` access right that is assigned
for `refs/*` on the `All-Projects` project has no effect and that only
Gerrit administrators with the `push` access right can push
configuration changes to the `All-Projects` project.
+
It is still possible to assign both access rights (`owner` on `refs/*`
and `push` on `refs/meta/config`) on the `All-Projects` project by directly
editing its `project.config` file and pushing to `refs/meta/config`.
To fix this it would be needed to reject assigning these access rights
on the `All-Projects` project as invalid configuration, however doing this
would mean to break existing configurations of the `All-Projects` project
that assign these access rights. At the moment there is no migration
framework in place that would allow to migrate `project.config` files.
Hence this check is currently not done and these access rights in this
case have simply no effect.

Web
~~~

* Do not show "Session cookie not available" on sign in
+
When LDAP is used for authentication, clicking on the 'Sign In' link
opens a user/password dialog. In this dialog the "Session cookie not
available." message was always shown as warning. This warning was
pretty useless since the user was about to sign in because he had no
current session.
+
This problem was discussed on the
link:https://groups.google.com/forum/#!topic/repo-discuss/j-t77m8-7I0/discussion[
Gerrit mailing list].

* Reject restoring a change if its destination branch does not exist
  anymore

* Reject submitting a change if its destination branch does not exist
  anymore
+
If a branch got deleted and there was an open change for this branch,
it was still possible to submit this open change. As result the
destination branch was implicitly recreated, even if the user
submitting the change had no privileges to create branches.

* link:http://code.google.com/p/gerrit/issues/detail?id=1352[issue 1352]:
  Don't display "Download" link for `/COMMIT_MSG`
+
The commit message file is special, it doesn't actually exist and
cannot be downloaded. Don't offer the download link in the side by
side viewer.

* Dependencies were lost in the ChangeScreen's "Needed By" table
+
Older patchsets are now iterated for decendents, so that the dependency
chain does not break on new upstream patchsets.

* link:http://code.google.com/p/gerrit/issues/detail?id=1442[issue 1442]:
  Only show draft change dependency if current user is owner or reviewer
+
In the change screen, the dependencies panel was showing draft changes
in the "Depends On" and "Needed By" lists for all users, and when there
was no user logged in.

* link:http://code.google.com/p/gerrit/issues/detail?id=1558[issue 1558]:
  Create a draft patch set when a draft patch set is rebased
+
Rebasing a draft patch set created a non-draft patch set. It was
unexpected that rebasing a draft patch set published the modifications
done in the draft patch set.

* link:http://code.google.com/p/gerrit/issues/detail?id=1176[issue 1176]:
  Fix disappearance of download command in Firefox
+
Clicking on the download command for a patch set in Firefox made the
download command disappear.

* link:http://code.google.com/p/gerrit/issues/detail?id=1587[issue 1587]:
  Fix disappearance of action buttons when selecting the last patch set
  as `Old Version History`

* Fix updating patch list when `Old Version History` is changed
+
If a collapsed patch set panel was expanded and re-closed it's patch
list wasn't updated anymore when the selection for `Old Version History`
was changed.

* link:http://code.google.com/p/gerrit/issues/detail?id=1523[issue 1523]:
  Update diff base to match old version history
+
When changing the diff base in the `Old Version History` on the change
screen and then entering the Side-By-Side view for a file, clicking on
the back button in the browser (reentering the change screen) was
causing the files to be wrongly compared with `Base` again.

* Don't NPE if current patch set is not available
+
Broken changes may have the current patch set field incorrectly
specified, causing currentPatchSet to be unable to locate the
correct data and return it. When this happens don't NPE, just
claim the change is not reviewed.

* link:https://code.google.com/p/gerrit/issues/detail?id=1555[issue 1555]:
  Fix displaying of file diff if draft patch has been deleted
+
Displaying any file diff for a patch set failed if the change had any
gaps in its patch set history. Patch sets can be missing, if they
have been drafts and were deleted.

* link:https://code.google.com/p/gerrit/issues/detail?id=856[issue 856]:
  Fix displaying of comments on deleted files
+
Published and draft comments that are posted on deleted files were not
loaded and displayed.

* link:https://code.google.com/p/gerrit/issues/detail?id=735[issue 735]:
  Fix `ArrayIndexOutOfBoundsException` on navigation to next/previous
  patch
+
An `ArrayIndexOutOfBoundsException` could occur when navigating from
one patch to the next/previous patch if the next/previous patch was a
newly added binary file. The exception occurred if the user was not
signed in or if the user was signed in and had `Syntax Coloring` in the
preferences enabled.

* link:https://code.google.com/p/gerrit/issues/detail?id=816[issue 816]:
  Fix wrong file indention in Side-by-Sie diff viewer on right side

* Only set reviewed attribute on open changes
+
If a change is merged or abandoned, do not consider the reviewed
property for the calling user, so that the change is not highlighted
as unreviewed on the user's dashboard.

* Change PatchTable pointer when loading patch
+
This patch fixes an issue with the "file list" table displayed by
clicking on the "Files" sub-menu when viewing a diff.
+
Originally when navigating between patch screens the highlighted row
(pointer) of the file list table would not change when not directly
interacting with the table e.g. by clicking on the previous or next
file link.
+
This patch updates the file list table whenever a new patch screen is loaded
so that the pointer corresponds to the current patch being displayed.

* Don't hyperlink non-internal groups
+
When an external group (such as LDAP) is used in a permission rule,
don't attempt to link to the group in the internal account system UI.
The group won't load successfully. Instead just display the name and
put the UUID into a tooltip to show the full DN.

* Fix: Popup jumps back to original position when resizing screen
+
On 'Watched Projects' screen, the 'Browse' button displays a popup
window. If the user moves it and then resizes the screen, it won't snap
back to the original position.

* link:http://code.google.com/p/gerrit/issues/detail?id=1457[issue 1457]:
  Prevent groups from being renamed to empty string

* Fixed AccountGroupInfoScreen search callback
+
If the search returned no results, the search button would not be
enabled and the status panel was not shown. Fixed the panel and button
to always be enabled.

* Fix NullPointerException on `/p/`
+
Requesting just `/p/` caused a NullPointerException as the redirection
logic had no project name to form a URL from. Detect requests for `/p/`
and redirect to 'Admin' > 'Projects' to show the projects the caller
has access to.

Mail
~~~~

* Fix: Rebase did not mail all reviewers

* Fix email showing in AccountLink instead of names
+
Prefer the full name for the display text of the link.

* Fix signature delimiter for e-mail messages
+
Make sure the signature delimiter is "-- " (two dashes and a space).

* link:http://code.google.com/p/gerrit/issues/detail?id=1397[issue 1397]:
  Don't wait for banner message from SMTP server after STARTTLS
  negotiation
+
According to RFC 2847 section 5.2, SMTP server won't send the banner
message again after STARTTLS negotiation. The original code will hang
until SMTP server kicks it off due to timeout and can't send email with
STARTTLS enabled, aka. `sendemail.smtpEncryption = tls`.

* Extract all mail templates during site init
+
The example mail templates `RebasedPatchSet.vm`, `Restored.vm` and
`Reverted.vm` were not extracted during the initialization of a new
site.

SSH
~~~
* Fix reject message if bypassing code review is not allowed
+
If a user is not allowed to bypass code review, but tries to push a
commit directly, Gerrit rejected this push with the error message
"can not update the reference as a fast forward". This message was
confusing to the user since the push only failed due to missing
access rights. Go back to the old message that says "prohibited
by Gerrit".

* Fix reject message if pushing tag is rejected because tagger is
  somebody else
+
Pushing a tag that has somebody else as tagger requires the `Forge
Committer` access right. If this access right was missing Gerrit
was rejecting the push with "can not create new references". This error
message was misleading because the user may have thought that the
`Create Reference` access right was missing which was actually assigned.
+
The same reject message was also returned on push of an annotated tag
if the `Push Annotated Tag` access right was missing. Also in this case
the error message was not ideal.
+
Go back to the old more generic message which says `prohibited by
Gerrit`.

* link:http://code.google.com/p/gerrit/issues/detail?id=1437[issue 1437]:
  Send event to stream when draft change is published
+
When a change is uploaded as a draft, a `patchset-created` event is
sent to the event stream, but since drafts are private to the owner,
the event is not publicly visible.  When the draft is later published,
no publicly visible event was sent. As result of this external tools
that rely on the event stream to detect new changes didn't receive
events for any changes that were first uploaded as draft.
+
There is now a new event, `draft-published`, which is sent to the
event stream when a draft change is published.  The content of this
event is the same as `patchset-created`.

* Fix: Wrong ps/rev in `change-merged` stream-event
+
When using cherry-pick as merge strategy, the wrong ref was set in the
`change-merged` stream-event.
+
The issue stems from Gerrit would not acknowledge the resulting new
pachset (the actual cherry-pick).

* Fix the `export-review-notes` command's Guice bindings
+
The `export-review-notes` command was broken becasue of the CachePool
class being bound twice. The startup of the command failed because of
that.

* Fix sorting of SSH help text
+
Commands were displaying in random order, sort commands before output.

* `replicate` command: Do not log errors for wrong user input
+
If the user provided an invalid combination of command options or an
non existing project name this was logged in the `error.log` but
printing the error out to the user is sufficient.

Authentication
~~~~~~~~~~~~~~

* Fix NPE in LdapRealm caused by non-LDAP users
+
Servers that are connected to LDAP but have non-LDAP user accounts
created by `gerrit create-account` (e.g. batch role accounts for
build systems) were crashing with a NullPointerException when the
LdapRealm tried to discover which LDAP groups the non-LDAP user
was a member of in the directory.

* Fix domain field of HTTP digest authentication
+
Per RFC 2617 the domain field is optional. If it is not present,
the digest token is valid on any URL on the server. When set it
must be a path prefix describing the URLs that the password would
be valid against.
+
When a canonical URL is known, supply that as the only domain that
is valid. When the URL is missing (e.g. because the provider is
still broken) rely on the context path of the application instead.

Replication
~~~~~~~~~~~

* Fix inconsistent behaviour when replicating `refs/meta/config`
+
In `replication.config`, if `authGroup` is set to be used together with
`mirror = true`, refs blocked through the `authGroup` are deleted from
the slave/mirror. The same correctly applies if the `authGroup` is used
to block `refs/meta/config`.
+
However, if `replicatePermission` was set to `false`, Gerrit was
refusing to clean up `refs/meta/config` on the slave/mirror.

* Fix bug with member assignment order in PushReplication.
+
The groupCache was being used before it was set in the class. Fix the
ordering of the assignment.

Approval Categories
~~~~~~~~~~~~~~~~~~~

* Make `NoBlock` and `NoOp` approval category functions work
+
The approval category functions `NoBlock` and `NoOp` have not worked
since the integration of Prolog.
+
`MAY` was introduced as a new submit record status to complement `OK`,
`REJECT`, `NEED`, and `IMPOSSIBLE`. This allows the expression of
approval categories (labels) that are optional, i.e. could either be
set or unset without ever influencing whether the change could be
submitted. Previously there was no way to express this property in
the submit record.
+
This enables the `NoBlock` and `NoOp` approval category functions to
work as they now emit may() terms from the Prolog rules. Previously
they returned ok() terms lacking a nested user term, leading to
exceptions in code that expected a user context if the label was `OK`.

* Fix category block status without negative score
+
Categories without blocking or approval scores will result in the
blocking/approved image appearing in the category column after changes
are merged should the score by the reviewer match the minimum or
maximum value respectively.
+
A check to ignore "No Score" values of 0 was added.

* Don't remove dashes from approval category name
+
If an approval category name contained a dash, it was removed by
Gerrit. On the other side a space in an approval category name is
converted to a dash. This was confusing for writing Prolog submit
rules. If, for example, one defined a new category named `X-Y`, then in
the Prolog code the proper name for that category would have been `XY`
which was unintuitive.

* Fix NPE in `PRED__load_commit_labels_1`
+
If a change query uses reviewer information and loads the approvals
map, but there are no approvals for a given patch set available, the
collection came out null, which cannot be iterated. Make it always be
an empty list.

Other
~~~~~

* link:http://code.google.com/p/gerrit/issues/detail?id=1554[issue 1554]:
  Fix cloning of new projects from slave servers
+
If a new project is created in Gerrit the replication creates the
repository for this new project directly in the filesystem of the slave
server. The slave server was not discovering this new repository and as
result any attempt to clone the corresponding project from the slave
server failed.

* link:http://code.google.com/p/gerrit/issues/detail?id=1548[issue 1548]:
  Create a ref for the patch set that is created when a change is
  cherry-picked and trigger the replication for it:
+
If Cherry Pick is chosen as submit type, on submit a new commit is
created by the cherry-pick. For this commit a new patch set is created
which is added to the change. Using any of the download commands to
fetch this new patch set failed with 'Couldn't find remote ref' because
no ref for the new patch set was created.

* Set link:../Documentation/config-gerrit.html#transfer.timeout[transfer
  timeout] for pushes through HTTP
+
The transfer timeout was only set when pushing via SSH.

* link:../Documentation/config-gerrit.html#receive.maxObjectSizeLimit[
  Limit maximum Git object size] when pushing through HTTP
+
The limit for the maximum object size was only set when pushing via SSH.

* Fix units of `httpd.maxwait`
+
The default unit here is minutes, but Jetty wants to get milliseconds
from the maxWait field. Convert the minutes returned by getTimeUnit to
be milliseconds, matching what Jetty expects.
+
This should resolve a large number of 503 errors for Git over HTTP.

* link:http://code.google.com/p/gerrit/issues/detail?id=1493[issue 1493]:
  Fix wrong "change ... closed" message on direct push
+
Pushing a commit directly into the central repository with bypassing
code review wrongly resulted in a "change ... closed" message if the
commit was already pushed for review and if a Change-Id was included in
the commit message. Despite of the error message the push succeeded and
the corresponding change got closed. Now the message is not printed
anymore.

* Fix NPE that can hide guice CreationException on site init
+
Note that the `--show-stack-trace` option is needed to print the stack
trace when a program stops with a Die exception.

* Do not automatically add author/committer as reviewer to drafts

* Do not automatically add reviewers from footer lines to drafts

* Fix NullPointerException in MergeOp
+
The body of the commit object may have been discarded earlier to
save memory, so ensure it exists before asking for the author.

* link:http://code.google.com/p/gerrit/issues/detail?id=1396[issue 1396]:
  Initialize the submodule commit message buffer

* Fix file name matching in `commit_delta` to perform substring
  matching
+
The `commit_delta` predicate was matching the entire file name against
the given regular expression while other predicates (`commit_edits`,
`commit_message_matches`) performed substring matching. It was
inconsistent that for `commit_delta` it was needed to write something
like:
+
----
  commit_delta('.*\.java')
----
+
to match all `*.java` files, while for `commit_edits` it was:
+
----
  commit_edits('\.java$', '...')
----
+
to match the same set of (Java) files.

* Create index for submodule subscriptions on site upgrade

* Fix URL to Jetty XML DTDs so they can be properly validated

* Fix resource leak when `changeMerge.test` is `true`

* Fix possible synchronization issue in TaskThunk

* Fix possible NPEs in `ReplaceRequest.cmd` usage in `ReceiveCommits`
+
The `cmd` field is populated by `validate(boolean)`. If this method
fails, results on some `ReplaceRequests` may not be set. Guard the
attempt to access the field with a null check.

* Match no labels if current patch set is not available
+
If the current patch set cannot be loaded from `ChangeData`, assume no
label information. This works around an NullPointerException inside of
`ChangeControl` where the `PatchSet` is otherwise required.

* Create new patch set references before database records
+
Ensure the commit used by a new change or replacement patch set
always exists in the Git repository by writing the reference first
as part of the overall `BatchRefUpdate`, then inserting the database
records if all of the references stored successfully.

* Fix rebase patch set and revert change to update Git first
+
Update the Git reference before writing to the database. This way the
repository cannot be corrupted if the server goes down between the two
actions.

* Make sure we use only one type of NoteMerger for review notes creation

* Fix generation of owner group in GroupDetail
+
Set the GroupDetail.ownerGroup to the AccountGroup.ownerGroupUUID
instead of the groupUUID.

* Ensure that ObjectOutputStream in H2CacheImpl is closed
