{#-
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you 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.
-#}
{% from 'allura:templates/jinja_master/lib.html' import email_gravatar, abbr_date with context %}
<div class="commit-details">
    <div class="commit-message">
        <div class="first-line">{{ h.hide_private_info(g.markdown_commit.convert(h.really_unicode(value.message.split('\n')[0]))) }}</div>
        {{ h.hide_private_info(g.markdown_commit.convert(h.really_unicode('\n'.join(value.message.split('\n')[1:])).strip())) }}
    </div>
    <div class="commit-details">

        <div class="commit-authorship">
            <p>
            <label>Authored by:</label>
            {% if value.author_url %}
                <a href="{{value.author_url}}" rel="nofollow">{{email_gravatar(value.authored.email, title=h.really_unicode(value.authored.name), size=16)}}</a>
                <a href="{{value.author_url}}" rel="nofollow">{{h.really_unicode(value.authored.name)}}</a>
            {% else %}
                {{email_gravatar(value.authored.email, title=h.really_unicode(value.authored.name), size=16)}} {{h.really_unicode(value.authored.name)}}
            {% endif %}

            {% if value.authored.date %}{{abbr_date(value.authored.date)}}{% endif %}
            </p>

            {% if value.committed.email != value.authored.email %}
                <p>
                <label>Committed by:</label>
                {% if value.committer_url %}
                    <a href="{{value.committer_url}}" rel="nofollow">{{email_gravatar(value.committed.email, title=h.really_unicode(value.committed.name), size=16)}}</a>
                    <a href="{{value.committer_url}}" rel="nofollow">{{h.really_unicode(value.committed.name)}}</a>
                {% else %}
                    {{email_gravatar(value.committed.email, title=h.really_unicode(value.committed.name), size=16)}} {{h.really_unicode(value.committed.name)}}
                {% endif %}
                {% if value.committed.date %}{{abbr_date(value.committed.date)}}{% endif %}
                </p>
            {% endif %}
        </div>

        <div class="commit-links">
            <a class="commit-tree-link" href="{{value.url()}}tree/" rel="nofollow">Browse code at this revision</a>
            <div class="commit-ancestry">
                {% if prev %}
                <p class="commit-parents">
                  Parent{% if prev|length > 1 %}s{% endif %}:
                  {% for ci in prev %}<a href="{{ci.url()}}" rel="nofollow">{{ci.shorthand_id()}}</a>{% endfor %}
                </p>
                {% endif %}
                {% if next %}
                <p class="commit-children">
                  Child{% if next|length > 1 %}ren{% endif %}:
                  {% for ci in next %}<a href="{{ci.url()}}" rel="nofollow">{{ci.shorthand_id()}}</a>{% endfor %}
                </p>
                {% endif %}
            </div>
        </div>

        <div class="clearfix"></div>
    </div>
</div>
