/**
 * 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, $index in $email.reviewerNames}
        {if $index > 0},{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, $index in $email.removedReviewerNames}
        {if $index > 0},{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}
