// Copyright 2012 Google Inc. All Rights Reserved.
//
// 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 gitiles}

/**
 * Detail page showing a shortlog for a commit.
 *
 * @param title human-readable revision name.
 * @param repositoryName name of this repository.
 * @param? menuEntries menu entries.
 * @param? customVariant variant name for custom styling.
 * @param breadcrumbs breadcrumbs for this page.
 * @param? tags optional list of tags encountered when peeling this object, with
 *     keys corresponding to gitiles.tagDetail.
 */
{template .logDetail stricthtml="false"}
{call .header data="all" /}

{if $tags}
  {for $tag in $tags}
    {call gitiles.tagDetail data="$tag" /}
  {/for}
{/if}

{call .streamingPlaceholder /}

{call .footer}
  {param customVariant: $customVariant /}
{/call}
{/template}


/**
 * Header for list of log entries.
 *
 * @param? previousUrl URL for the previous page of results.
 */
{template .logEntriesHeader stricthtml="false"}
{if $previousUrl}
  <nav class="LogNav">
    <a class="LogNav-prev" href="{$previousUrl}">{msg desc="text for previous URL"}&laquo; Previous{/msg}</a>
  </nav>
{/if}

<ol class="CommitLog">
{/template}


/**
 * Wrapper for a single log entry with pretty format and variant.
 *
 * @param variant variant name for log entry template.
 * @param entry log entry; see .logEntry.
 */
{template .logEntryWrapper}
<li class="CommitLog-item CommitLog-item--{$variant}">
  {delcall gitiles.logEntry variant="$variant ?: 'default'" data="$entry" /}
</li>
{/template}


/**
 * Footer for the list of log entries.
 *
 * @param? nextUrl URL for the next page of results.
 */
{template .logEntriesFooter stricthtml="false"}
</ol>
{if $nextUrl}
  <nav class="LogNav">
    <a class="LogNav-next" href="{$nextUrl}">{msg desc="text for next URL"}Next &raquo;{/msg}</a>
  </nav>
{/if}
{/template}


/**
 * Single log entry indicating the full log is empty.
 */
{template .emptyLog}
<li class="CommitLog-item CommitLog-item--empty">{msg desc="informational text for when the log is empty"}No commits.{/msg}</li>
{/template}


/**
 * Single pretty log entry, similar to --pretty=oneline.
 *
 * @param abbrevSha abbreviated SHA-1.
 * @param sha commit SHA-1.
 * @param url URL to commit detail page.
 * @param shortMessage short commit message.
 * @param message list of commit message parts, where each part contains:
 *     text: raw text of the part.
 *     url: optional URL that should be linked to from the part.
 * @param author author information with at least "name" and "relativeTime" keys.
 * @param committer committer information with at least "time" and "relativeTime" keys.
 * @param branches list of branches for this entry, with "name" and "url" keys.
 * @param tags list of tags for this entry, with "name" and "url" keys.
 * @param diffTree unused in this variant.
 * @param rename if this entry was a rename or a copy of the path, an object containg:
 *     changeType: the change type, "RENAME" or "COPY".
 *     oldPath: the old path prior to the rename or copy.
 *     newPath: the new path after the rename or copy.
 *     score: the similarity score of the rename or copy.
 */
{deltemplate gitiles.logEntry variant="'oneline'"}
<a class="u-sha1 u-monospace CommitLog-sha1" href="{$url}">{$abbrevSha}</a>
{sp}<a href="{$url}">{$shortMessage}</a>
{sp}<span class="CommitLog-author" title="{$author.email}">{msg desc="commit author name"}by {$author.name}{/msg}</span>
{sp}<span class="CommitLog-time" title="{$author.time}">· {$author.relativeTime}</span>
{if length($branches)}
  {for $branch in $branches}
    {sp}<a class="CommitLog-branchLabel" href="{$branch.url}">{$branch.name}</a>
  {/for}
{/if}
{if length($tags)}
  {for $tag in $tags}
    {sp}<a class="CommitLog-tagLabel" href="{$tag.url}">{$tag.name}</a>
  {/for}
{/if}

{if $rename}
  <span class="CommitLog-rename">
    [
    {switch $rename.changeType}
      {case 'RENAME'}
        Renamed
      {case 'COPY'}
        Copied
    {/switch}
    {if $rename.score != 100}
      {sp}({$rename.score}%)
    {/if}
    {sp}from {$rename.oldPath}]
  </span>
{/if}

{/deltemplate}


/**
 * Default single log entry (oneline format).
 *
 * @param abbrevSha abbreviated SHA-1.
 * @param sha commit SHA-1.
 * @param url URL to commit detail page.
 * @param shortMessage short commit message.
 * @param message list of commit message parts, where each part contains:
 *     text: raw text of the part.
 *     url: optional URL that should be linked to from the part.
 * @param author author information with at least "name" and "relativeTime" keys.
 * @param committer committer information with at least "time" and "relativeTime" keys.
 * @param branches list of branches for this entry, with "name" and "url" keys.
 * @param tags list of tags for this entry, with "name" and "url" keys.
 * @param diffTree unused in this variant.
 * @param rename if this entry was a rename or a copy of the path, an object containg:
 *     changeType: the change type, "RENAME" or "COPY".
 *     oldPath: the old path prior to the rename or copy.
 *     newPath: the new path after the rename or copy.
 *     score: the similarity score of the rename or copy.
 */
{deltemplate gitiles.logEntry variant="'default'"}
{delcall gitiles.logEntry variant="'oneline'" data="all" /}
{/deltemplate}


/**
 * Single pretty log entry, similar to --pretty=full.
 *
 * @param abbrevSha abbreviated SHA-1.
 * @param sha commit SHA-1.
 * @param url URL to commit detail page.
 * @param shortMessage short commit message.
 * @param message list of commit message parts, where each part contains:
 *     text: raw text of the part.
 *     url: optional URL that should be linked to from the part.
 * @param author author information with at least "name" and "relativeTime" keys.
 * @param committer committer information with at least "time" and "relativeTime" keys.
 * @param branches list of branches for this entry, with "name" and "url" keys.
 * @param tags list of tags for this entry, with "name" and "url" keys.
 * @param diffTree unused in this variant.
 * @param rename if this entry was a rename or a copy of the path, an object containg:
 *     changeType: the change type, "RENAME" or "COPY".
 *     oldPath: the old path prior to the rename or copy.
 *     newPath: the new path after the rename or copy.
 *     score: the similarity score of the rename or copy.
 */
{deltemplate gitiles.logEntry variant="'full'"}
<div class="u-monospace Metadata">
<table>
  <tr>
    <th class="Metadata-title">{msg desc="Header for commit SHA entry"}commit{/msg}</th>
    <td class="sha1">
      <a href="{$url}">{$sha}</a>
    </td>
    <td>
      {if length($branches)}
        {for $branch in $branches}
          {sp}<a href="{$branch.url}" class="branch-label">{$branch.name}</a>
        {/for}
      {/if}
      {if length($tags)}
        {for $tag in $tags}
          {sp}<a href="{$tag.url}" class="tag-label">{$tag.name}</a>
        {/for}
      {else}
        {sp}
      {/if}
    </td>
  </tr>
  <tr>
    <th class="Metadata-title">{msg desc="Header for commit author"}author{/msg}</th>
    <td>{call .person_ data="$author" /}</td>
    <td>{$author.time}</td>
  </tr>
  <tr>
    <th class="Metadata-title">{msg desc="Header for committer"}committer{/msg}</th>
    <td>{call .person_ data="$committer" /}</td>
    <td>{$committer.time}</td>
  </tr>

  {if $rename}
    <tr>
      <td colspan="3">
        <span class="CommitLog-rename">
          [
          {switch $rename.changeType}
            {case 'RENAME'}
              Renamed
            {case 'COPY'}
              Copied
          {/switch}
          {if $rename.score != 100}
            {sp}({$rename.score}%)
          {/if}
          {sp}from {$rename.oldPath}]
        </span>
      </td>
    </tr>
  {/if}

</table>
</div>
<pre class="u-pre u-monospace MetadataMessage">
  {$message}
</pre>
{/deltemplate}
