/**
 * 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.NewChangeHtml}

import * as mailTemplate from 'com/google/gerrit/server/mail/Private.soy';

{template NewChangeHtml}
  {@param diffLines: ?}
  {@param email: ?}
  {@param fromName: ?}
  {@param ownerName: ?}
  {@param patchSet: ?}
  {@param projectName: ?}
  <p>
    {if $email.reviewerNames}
      {$fromName} would like{sp}
      {for $reviewerName in $email.reviewerNames}
        {if not isFirst($reviewerName)}
          {if isLast($reviewerName)}{sp}and{else},{/if}{sp}
        {/if}
        {$reviewerName}
      {/for}{sp}
      to <strong>review</strong> this change
      {if $fromName != $ownerName}{sp}authored by {$ownerName}{/if}.
    {else}
      {$ownerName} has uploaded this change for <strong>review</strong>.
    {/if}
  </p>

  {if $email.changeUrl}
    <p>
      {call mailTemplate.ViewChangeButton data="all" /}
    </p>
  {/if}

  {call mailTemplate.Pre}
    {param content: $email.changeDetail /}
  {/call}

  {if $email.sshHost}
    {call mailTemplate.Pre}
      {param content kind="html"}
        git pull ssh:{print '//'}{$email.sshHost}/{$projectName}
        {sp}{$patchSet.refName}
      {/param}
    {/call}
  {/if}

  {if $email.includeDiff}
    {call mailTemplate.UnifiedDiff}
      {param diffLines: $diffLines /}
    {/call}
  {/if}
{/template}
