// 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 about a single revision.
 *
 * @param title human-readable revision name.
 * @param repositoryName name of this repository.
 * @param? menuEntries menu entries.
 * @param? customVariant variant name for styling.
 * @param breadcrumbs breadcrumbs for this page.
 * @param? hasBlob set to true if the revision or its peeled value is a blob.
 * @param? hasReadme set to true if the treeDetail has readmeHtml.
 * @param objects list of objects encountered when peeling this object. Each
 *     object has a "type" key with one of the
 *     org.eclipse.jgit.lib.Contants.TYPE_* constant strings, and a "data" key
 *     with an object whose keys correspond to the appropriate object detail
 *     template from ObjectDetail.soy.
 */
{template .revisionDetail stricthtml="false"}
{if $hasBlob}
  {call .header data="all"}
    {param css: [gitiles.PRETTIFY_CSS_URL] /}
  {/call}
{elseif $hasReadme}
  {call .header data="all"}
    {param css: [gitiles.DOC_CSS_URL, gitiles.PRETTIFY_CSS_URL] /}
  {/call}
{else}
  {call .header data="all" /}
{/if}

{foreach $object in $objects}
  {switch $object.type}
    {case 'commit'}
      {call .commitDetail data="$object.data" /}
    {case 'tree'}
      {call .treeDetail data="$object.data" /}
    {case 'blob'}
      {call .blobDetail data="$object.data" /}
    {case 'tag'}
      {call .tagDetail data="$object.data" /}
    {default}
      <div class="error">
        {msg desc="Error message for an unknown object type"}Object has unknown type.{/msg}
      </div>
  {/switch}
{/foreach}

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