= Gerrit Code Review - Mail Templates

Gerrit uses velocity templates for the bulk of the standard mails it sends out.
There are builtin default templates which are used if they are not overridden.
These defaults are also provided as examples so that administrators may copy
them and easily modify them to tweak their contents.


== Template Locations and Extensions:

The default example templates reside under:  `'$site_path'/etc/mail` and are
terminated with the double extension `.vm.example`. Modifying these example
files will have no effect on the behavior of Gerrit.  However, copying an
example template to an equivalently named file without the `.example` extension
and modifying it will allow an administrator to customize the template.


== Supported Mail Templates:

Each mail that Gerrit sends out is controlled by at least one template.  These
are listed below.  Change emails are influenced by two additional templates,
one to set the subject line, and one to set the footer which gets appended to
all the change emails (see `ChangeSubject.vm` and `ChangeFooter.vm` below.)

=== Abandoned.vm

The `Abandoned.vm` template will determine the contents of the email related
to a change being abandoned.  It is a `ChangeEmail`: see `ChangeSubject.vm` and
`ChangeFooter.vm`.

=== AddKey.vm

The `AddKey.vm` template will determine the contents of the email related to
SSH and GPG keys being added to a user account. This notification is not sent
when the key is administratively added to another user account.

=== ChangeFooter.vm

The `ChangeFooter.vm` template will determine the contents of the footer
text that will be appended to emails related to changes (all `ChangeEmail`s).

=== ChangeSubject.vm

The `ChangeSubject.vm` template will determine the contents of the email
subject line for ALL emails related to changes.

=== Comment.vm

The `Comment.vm` template will determine the contents of the email related to
a user submitting comments on changes.  It is a `ChangeEmail`: see
`ChangeSubject.vm`, `ChangeFooter.vm` and `CommentFooter.vm`.

=== CommentFooter.vm

The `CommentFooter.vm` template will determine the contents of the footer
text that will be appended to emails related to a user submitting comments on
changes.  See `ChangeSubject.vm`, `Comment.vm` and `ChangeFooter.vm`.

=== Footer.vm

The `Footer.vm` template will determine the contents of the footer text
appended to the end of all outgoing emails after the ChangeFooter and
CommentFooter.

=== Merged.vm

The `Merged.vm` template will determine the contents of the email related to
a change successfully merged to the head.  It is a `ChangeEmail`: see
`ChangeSubject.vm` and `ChangeFooter.vm`.

=== MergeFail.vm

The `MergeFail.vm` template will determine the contents of the email related
to a failure upon attempting to merge a change to the head.  It is a
`ChangeEmail`: see `ChangeSubject.vm` and `ChangeFooter.vm`.

=== NewChange.vm

The `NewChange.vm` template will determine the contents of the email related
to a user submitting a new change for review. This includes changes created
by actions made by the user in the Web UI such as cherry picking a commit or
reverting a change.  It is a `ChangeEmail`: see `ChangeSubject.vm` and
`ChangeFooter.vm`.

=== RegisterNewEmail.vm

The `RegisterNewEmail.vm` template will determine the contents of the email
related to registering new email accounts.

=== ReplacePatchSet.vm

The `ReplacePatchSet.vm` template will determine the contents of the email
related to a user submitting a new patchset for a change.  This includes
patchsets created by actions made by the user in the Web UI such as editing
the commit message, cherry picking a commit, or rebasing a change.  It is a
`ChangeEmail`: see `ChangeSubject.vm` and `ChangeFooter.vm`.

=== Restored.vm

The `Restored.vm` template will determine the contents of the email related
to a change being restored.  It is a `ChangeEmail`: see `ChangeSubject.vm` and
`ChangeFooter.vm`.

=== Reverted.vm

The `Reverted.vm` template will determine the contents of the email related
to a change being reverted.  It is a `ChangeEmail`: see `ChangeSubject.vm` and
`ChangeFooter.vm`.


== Mail Variables and Methods

Mail templates can access and display objects currently made available to them
via the velocity context.  While the base objects are documented here, it is
possible to call public methods on these objects from templates.  Those methods
are not documented here since they could change with every release.  As these
templates are meant to be modified only by a qualified sysadmin, it is accepted
that writing templates for Gerrit emails is likely to require some basic
knowledge of the class structure to be useful.  Browsing the source code might
be necessary for anything more than a minor formatting change.

=== Warning

Be aware that modifying templates can cause them to fail to parse and therefore
not send out the actual email, or worse, calling methods on the available
objects could have internal side effects which would adversely affect the
health of your Gerrit server and/or data.

=== All OutgoingEmails

All outgoing emails have the following variables available to them:

$email::
+
A reference to the class constructing the current `OutgoingEmail`.  With this
reference it is possible to call any public method on the OutgoingEmail class
or the current child class inherited from it.

$messageClass::
+
A String containing the messageClass.

$StringUtils::
+
A reference to the Apache `StringUtils` class.  This can be very useful for
formatting strings.

=== Change Emails

All change related emails have the following additional variables available to them:

$change::
+
A reference to the current `Change` object.

$changeId::
+
Id of the current change (a `Change.Key`).

$coverLetter::
+
The text of the `ChangeMessage`.

$branch::
+
A reference to the branch of this change (a `Branch.NameKey`).

$fromName::
+
The name of the from user.

$projectName::
+
The name of this change's project.

$patchSet::
+
A reference to the current `PatchSet`.

$patchSetInfo::
+
A reference to the current `PatchSetInfo`.


== SEE ALSO

* link:http://velocity.apache.org/[velocity]

GERRIT
------
Part of link:index.html[Gerrit Code Review]

SEARCHBOX
---------
