// 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}
{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}
