{#-
       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.
-#}
{{c.revision_widget.display(value=commit, prev=prev, next=next)}}
<table>
  <tbody>
    {% for diff in commit.diffs.added %}
    <tr>
      <td>add</td>
      <td><a href="{{commit.url()}}tree/{{h.really_unicode(diff)}}" rel="nofollow">{{h.really_unicode(diff)}}</a></td>
    </tr>
    {% endfor %}{% for diff in commit.diffs.removed %}
    <tr>
      <td>remove</td>
      <td><a href="{{prev[0].url()}}tree/{{h.really_unicode(diff)}}" rel="nofollow">{{h.really_unicode(diff)}}</a></td>
    </tr>
    {% endfor %}{% for diff in commit.diffs.changed %}
    <tr>
      <td>change</td>
      <td>
        <a href="{{commit.url()}}tree/{{h.really_unicode(diff)}}" rel="nofollow">{{h.really_unicode(diff)}}</a>
        <a href="{{commit.url()}}tree/{{h.really_unicode(diff)}}?diff={{prev[0]._id}}" rel="nofollow">(diff)</a>
      </td>
    </tr>
    {% endfor %}{% for diff in commit.diffs.copied %}
    <tr>
      <td>copy</td>
      <td>
        <a href="{{prev[0].url()}}tree/{{h.really_unicode(diff.old)}}" rel="nofollow">{{h.really_unicode(diff.old)}}</a>
        <br/>to<br/>
        <a href="{{commit.url()}}tree/{{h.really_unicode(diff.new)}}" rel="nofollow">{{h.really_unicode(diff.new)}}</a>
      </td>
    </tr>
    {% endfor %}{% for diff in commit.diffs.renamed %}
    <tr>
      {% if diff.ratio < 1 %}
        <td>rename (with changes)</td>
      {% else %}  
        <td>rename</td>
      {% endif %}
      <td>
        <a href="{{prev[0].url()}}tree/{{h.really_unicode(diff.old)}}" rel="nofollow">{{h.really_unicode(diff.old)}}</a>
        <br/>to<br/>
        <a href="{{commit.url()}}tree/{{h.really_unicode(diff.new)}}" rel="nofollow">{{h.really_unicode(diff.new)}}</a>
      </td>
      <td>
        {% if diff.ratio < 1  %}
          <a href="{{commit.url()}}tree/{{h.really_unicode(diff.new)}}?diff={{prev[0]._id}}?prev-file={{h.really_unicode(diff.old)}}" rel="nofollow">(diff)</a>
        {% endif %}
      </td>  
    </tr>
    {% endfor %}
  </tbody>
</table>
