## Copyright (C) 2010 The Android Open Source Project
##
## Licensed under the Apache License, Version 2.0 (the "License");
## you may not use this file except in compliance with the License.
## You may obtain a copy of the License at
##
## http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS,
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## See the License for the specific language governing permissions and
## limitations under the License.
##
##
## Template Type:
## -------------
## This is a velocity mail template, see: http://velocity.apache.org and the
## gerrit-docs:config-mail.txt for more info on modifying gerrit mail templates.
##
## Template File Names and extensions:
## ----------------------------------
## Gerrit will use templates ending in ".vm" but will ignore templates ending
## in ".vm.example".  If a .vm template does not exist, the default internal
## gerrit template which is the same as the .vm.example will be used.  If you
## want to override the default template, copy the .vm.example file to a .vm
## file and edit it appropriately.
##
## This Template:
## --------------
## 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 and ChangeFooter.vm.
##
#if ($email.coverLetter || $email.inlineComments)
$fromName has posted comments on this change.

Change subject: $change.subject
......................................................................


#if ($email.coverLetter)
$email.coverLetter

#end
#if($email.inlineComments)$email.inlineComments#end
#end
