// 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 autoescape="strict"}

/**
 * Detail page for a path within a tree.
 *
 * @param title human-readable name of this path.
 * @param repositoryName name of this repository.
 * @param? menuEntries menu entries.
 * @param? customVariant variant name for custom styling.
 * @param breadcrumbs breadcrumbs for this page.
 * @param type path type, matching one of the constant names defined in
 *         org.eclipse.jgit.lib.FileMode.
 * @param data path data, matching the params for one of .treeDetail,
 *     .blobDetail, .symlinkDetail, or .gitlinkDetail as appropriate.
 */
{template .pathDetail}
{if $type == 'REGULAR_FILE' or $type == 'EXECUTABLE_FILE'}
  {call .header data="all"}
    {param css: [gitiles.PRETTIFY_CSS_URL] /}
  {/call}
{elseif $data.readmeHtml}
  {call .header data="all"}
    {param css: [gitiles.DOC_CSS_URL, gitiles.PRETTIFY_CSS_URL] /}
  {/call}
{else}
  {call .header data="all" /}
{/if}

{switch $type}
  {case 'TREE'}{call .treeDetail data="$data" /}
  {case 'SYMLINK'}{call .symlinkDetail data="$data" /}
  {case 'REGULAR_FILE'}{call .blobDetail data="$data" /}
  {case 'EXECUTABLE_FILE'}{call .blobDetail data="$data" /}
  {case 'GITLINK'}{call .gitlinkDetail data="$data" /}
  {default}
    <div class="error">
      {msg desc="Error message for an unknown object type"}Object has unknown type.{/msg}
    </div>
{/switch}

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

/**
 * Detail for a symbolic link.
 *
 * @param target target of this symlink.
 * @param? targetUrl optional URL for the target, if it is within this repo.
 */
{template .symlinkDetail}
<div class="symlink-detail">
  {msg desc="Lead-in text for the symbolic link target."}Symbolic link to{/msg}
  {sp}{if $targetUrl}<a href="{$targetUrl}">{$target}</a>{else}{$target}{/if}
</div>
{/template}

/**
 * Detail for a git submodule link.
 *
 * @param sha submodule commit SHA.
 * @param remoteUrl URL of the remote repository.
 * @param? httpUrl optional HTTP URL pointing to a web-browser-compatible URL of
 *     the remote repository.
 */
{template .gitlinkDetail}
<div class="gitlink-detail">
  {msg desc="Lead-in text for the git link URL"}Submodule link to {$sha} of{/msg}
  {if $remoteUrl}
    {sp}{if $httpUrl}<a href="{$httpUrl}">{$remoteUrl}</a>{else}{$remoteUrl}{/if}
  {else}
    {sp}{msg desc="Text describing an unknown submodule URL"}a submodule with an unknown URL{/msg}
  {/if}
</div>
{/template}
