## 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.exmaple file to a .vm
## file and edit it appropriately.
##
## This Template:
## --------------
## The ReplacePatchSet.vm template will determine the contents of the email
## related to a user submitting a new patchset for a change.  It is a
## ChangeEmail: see ChangeSubject.vm and ChangeFooter.vm.
##
#if($email.reviewerNames)
Hello $StringUtils.join($email.reviewerNames, ', '),

I'd like you to reexamine a change.#if($email.changeUrl)  Please visit

    $email.changeUrl

to look at the new patch set (#$patchSet.patchSetId).
#end
#else
$fromName has uploaded a new patch set (#$patchSet.patchSetId).
#end

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

$email.changeDetail
  git pull ssh://$email.sshHost/$projectName $patchSet.refName
