/**
 * Copyright (C) 2016 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.
 */

{namespace com.google.gerrit.server.mail.template.NewChange}

/**
 * The .NewChange template will determine the contents of the email related to a
 * user submitting a new change for review.
 */
{template NewChange kind="text"}
  {@param change: ?}
  {@param email: ?}
  {@param fromName: ?}
  {@param ownerName: ?}
  {@param patchSet: ?}
  {@param projectName: ?}
  {if $email.reviewerNames or $email.removedReviewerNames}
   {if $email.reviewerNames}
      Hello{sp}
      {for $reviewerName in $email.reviewerNames}
        {if not isFirst($reviewerName)},{sp}{/if}
        {$reviewerName}
      {/for},

      {\n}
      {\n}

      I'd like you to do a code review.
      {\n}
    {/if}
    {if $email.removedReviewerNames}
      {$fromName} has removed{sp}
      {for $reviewerName in $email.removedReviewerNames}
        {if not isFirst($reviewerName)},{sp}{/if}
        {$reviewerName}
      {/for}{sp}
      from this change.{sp}
      {\n}
    {/if}
    {if $email.changeUrl}
      Please visit

      {\n}
      {\n}

      {sp}{sp}{sp}{sp}{$email.changeUrl}

      {\n}
      {\n}

      to review the following change.
    {/if}
  {else}
    {$ownerName} has uploaded this change for review.
    {if $email.changeUrl} ( {$email.changeUrl} ){/if}
  {/if}{\n}

  {\n}
  {\n}

  Change subject: {$change.subject}{\n}
  ......................................................................{\n}

  {\n}

  {$email.changeDetail}{\n}

  {if $email.sshHost}
    {\n}
    {sp}{sp}git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
        {sp}{$patchSet.refName}
    {\n}
  {/if}

  {if $email.includeDiff}
    {\n}
    {$email.unifiedDiff}
    {\n}
  {/if}
{/template}
