Files @ f33cc4af706b
Branch filter:

Location: kallithea/kallithea/templates/changelog/changelog.html - annotation

domruf
tests: finally block also needs to be executed if api_call itself fails

The cleanup code (finally block) should be executed as soon as something what
changes the db fails.

I don't remember which one but one of these tests failed and caused all the
others to fail as well because the database wasn't cleaned up after the first
failure. That made finding the root cause more difficult then it should have
been.
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
37354e1ab283
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
37354e1ab283
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
432e86d1e555
432e86d1e555
432e86d1e555
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
ec39e73be935
d1addaf7a91e
ec39e73be935
d1addaf7a91e
d1addaf7a91e
432e86d1e555
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
42bc65838fd1
144878118c95
d1addaf7a91e
2ddd4fb23b4e
322e17eb356a
2ddd4fb23b4e
79e13a32dd76
2ddd4fb23b4e
2ddd4fb23b4e
2ddd4fb23b4e
2ddd4fb23b4e
322e17eb356a
322e17eb356a
2ddd4fb23b4e
2ddd4fb23b4e
2ddd4fb23b4e
432e86d1e555
2ddd4fb23b4e
432e86d1e555
432e86d1e555
432e86d1e555
9581233e9275
d1addaf7a91e
9581233e9275
c2e3923eebe4
aaa2478f9d60
d1addaf7a91e
27f498ee6db0
2ddd4fb23b4e
0111c18298a0
2ddd4fb23b4e
d1addaf7a91e
d1addaf7a91e
2ea889757ba1
0111c18298a0
2ea889757ba1
d1addaf7a91e
b8734b428786
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
8c5d1e94f9ee
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
b1bec568c0a2
40f65bfc04d0
d1addaf7a91e
d1addaf7a91e
b1bec568c0a2
b1bec568c0a2
40f65bfc04d0
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
83087ae63bd6
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
0fa831892e32
d1addaf7a91e
d1addaf7a91e
27c7922c745d
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
b3299a079fa6
d1addaf7a91e
f9f0922a3158
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
06e49be38d78
d1addaf7a91e
d1addaf7a91e
ce7c4addc2ae
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
ce7c4addc2ae
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
ce7c4addc2ae
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
07bfe091845e
07bfe091845e
2ea889757ba1
2ea889757ba1
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
dba66b0768f4
d1addaf7a91e
e271a8766951
081c47cfad7b
081c47cfad7b
d1addaf7a91e
d1addaf7a91e
081c47cfad7b
081c47cfad7b
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
322e17eb356a
07bfe091845e
07bfe091845e
322e17eb356a
07bfe091845e
07bfe091845e
322e17eb356a
322e17eb356a
322e17eb356a
322e17eb356a
322e17eb356a
322e17eb356a
322e17eb356a
322e17eb356a
322e17eb356a
322e17eb356a
322e17eb356a
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
d1addaf7a91e
d1addaf7a91e
081c47cfad7b
081c47cfad7b
07bfe091845e
a4b814804263
a4b814804263
a4b814804263
a4b814804263
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
a4b814804263
07bfe091845e
07bfe091845e
a4b814804263
a4b814804263
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
081c47cfad7b
07bfe091845e
081c47cfad7b
27f498ee6db0
081c47cfad7b
081c47cfad7b
081c47cfad7b
07bfe091845e
d1addaf7a91e
081c47cfad7b
081c47cfad7b
081c47cfad7b
322e17eb356a
d1addaf7a91e
081c47cfad7b
a4b814804263
d1addaf7a91e
d1addaf7a91e
e271a8766951
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
07bfe091845e
d1addaf7a91e
081c47cfad7b
081c47cfad7b
d1addaf7a91e
07bfe091845e
d1addaf7a91e
d1addaf7a91e
ee2993beec85
d1addaf7a91e
ee2993beec85
d1addaf7a91e
ee2993beec85
ee2993beec85
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
ee2993beec85
ee2993beec85
ee2993beec85
ee2993beec85
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
f22d103ba9e8
d1addaf7a91e
42bc65838fd1
42bc65838fd1
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
0111c18298a0
0111c18298a0
4f4d2e899a02
4f4d2e899a02
0111c18298a0
0111c18298a0
0111c18298a0
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
0111c18298a0
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
0111c18298a0
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
dba66b0768f4
42bc65838fd1
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
d1addaf7a91e
## -*- coding: utf-8 -*-

<%inherit file="/base/base.html"/>

<%block name="title">
    ${_('%s Changelog') % c.repo_name}
    %if c.changelog_for_path:
      /${c.changelog_for_path}
    %endif
</%block>

<%def name="breadcrumbs_links()">
    <% size = c.size if c.size <= c.total_cs else c.total_cs %>
    ${_('Changelog')}
    %if c.changelog_for_path:
     - /${c.changelog_for_path}
    %endif
    %if c.revision:
    @ ${h.short_id(c.first_revision.raw_id)}
    %endif
    - ${ungettext('showing %d out of %d revision', 'showing %d out of %d revisions', size) % (size, c.total_cs)}
</%def>

<%block name="header_menu">
    ${self.menu('repositories')}
</%block>

<%def name="main()">
${self.repo_context_bar('changelog', c.first_revision.raw_id if c.first_revision else None)}
<div class="box">
    <!-- box / title -->
    <div class="title">
        ${self.breadcrumbs()}
    </div>
    <div class="table">
        % if c.pagination:
            <div>
                <div style="overflow:auto; ${'display:none' if c.changelog_for_path else ''}">
                    <div class="container_header">
                        <div style="float:left; margin-left:20px;">
                          ${h.form(h.url.current(),method='get',style="display:inline")}
                            ${h.submit('set',_('Show'),class_="btn btn-small")}
                            ${h.text('size',size=3,value=c.size)}
                            ${_('revisions')}
                            %if c.branch_name:
                            ${h.hidden('branch', c.branch_name)}
                            %endif
                          ${h.end_form()}
                          <a href="#" class="btn btn-small" id="rev_range_clear" style="display:none">${_('Clear selection')}</a>
                        </div>
                        <div style="float: right; margin: 0px 0px 0px 4px">
                            <a href="#" class="btn btn-small" id="rev_range_container" style="display:none"></a>
                            %if c.revision:
                                <a class="btn btn-small" href="${h.url('changelog_home', repo_name=c.repo_name)}">
                                    ${_('Go to tip of repository')}
                                </a>
                            %endif
                            %if c.db_repo.fork:
                                <a id="compare_fork"
                                   title="${_('Compare fork with %s' % c.db_repo.fork.repo_name)}"
                                   href="${h.url('compare_url',repo_name=c.db_repo.fork.repo_name,org_ref_type=c.db_repo.landing_rev[0],org_ref_name=c.db_repo.landing_rev[1],other_repo=c.repo_name,other_ref_type='branch' if request.GET.get('branch') else c.db_repo.landing_rev[0],other_ref_name=request.GET.get('branch') or c.db_repo.landing_rev[1], merge=1)}"
                                   class="btn btn-small"><i class="icon-git-compare"></i> ${_('Compare fork with parent repository (%s)' % c.db_repo.fork.repo_name)}</a>
                            %endif
                            ## text and href of open_new_pr is controlled from javascript
                            <a id="open_new_pr" class="btn btn-small"></a>
                            ${_("Branch filter:")} ${h.select('branch_filter',c.branch_name,c.branch_filters)}
                        </div>
                    </div>
                </div>

                <div id="changelog" style="clear:both">

                <div id="graph_nodes">
                    <canvas id="graph_canvas" style="width:0"></canvas>
                </div>
                <div id="graph_content" style="${'margin: 0px' if c.changelog_for_path else ''}">

                <table id="changesets">
                <tbody>
                %for cnt,cs in enumerate(c.pagination):
                    <tr id="chg_${cnt+1}" class="container ${'mergerow' if len(cs.parents) > 1 else ''}">
                        <td class="checkbox">
                            %if c.changelog_for_path:
                                ${h.checkbox(cs.raw_id,class_="changeset_range", disabled="disabled")}
                            %else:
                                ${h.checkbox(cs.raw_id,class_="changeset_range")}
                            %endif
                        <td class="status">
                          %if c.statuses.get(cs.raw_id):
                            <div class="changeset-status-ico">
                            %if c.statuses.get(cs.raw_id)[2]:
                              <a class="tooltip" title="${_('Changeset status: %s by %s\nClick to open associated pull request %s') % (c.statuses.get(cs.raw_id)[1], c.statuses.get(cs.raw_id)[5].username, c.statuses.get(cs.raw_id)[4])}" href="${h.url('pullrequest_show',repo_name=c.statuses.get(cs.raw_id)[3],pull_request_id=c.statuses.get(cs.raw_id)[2])}">
                                <i class="icon-circle changeset-status-${c.statuses.get(cs.raw_id)[0]}"></i>
                              </a>
                            %else:
                              <a class="tooltip" title="${_('Changeset status: %s by %s') % (c.statuses.get(cs.raw_id)[1], c.statuses.get(cs.raw_id)[5].username)}"
                                 href="${c.comments[cs.raw_id][0].url()}">
                                  <i class="icon-circle changeset-status-${c.statuses.get(cs.raw_id)[0]}"></i>
                              </a>
                            %endif
                            </div>
                          %endif
                        </td>
                        <td class="author">
                            ${h.gravatar(h.email_or_none(cs.author), size=16)}
                            <span title="${cs.author}" class="user">${h.shorter(h.person(cs.author),22)}</span>
                        </td>
                        <td class="hash" style="width:${len(h.show_id(cs))*6.5}px">
                            <a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id)}">
                                <span class="changeset_hash">${h.show_id(cs)}</span>
                            </a>
                        </td>
                        <td class="date">
                            <div class="date tooltip" title="${h.fmt_date(cs.date)}">${h.age(cs.date,True)}</div>
                        </td>
                        <td class="expand_commit" commit_id="${cs.raw_id}" title="${_('Expand commit message')}">
                            <i class="icon-align-left" style="color:#999"></i>
                        </td>
                        <td class="mid">
                            <div class="log-container">
                                <div class="message" id="C-${cs.raw_id}">${h.urlify_commit(cs.message, c.repo_name,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</div>
                                <div class="extra-container">
                                    %if c.comments.get(cs.raw_id):
                                        <div class="comments-container">
                                            <div class="comments-cnt" title="${_('Changeset has comments')}">
                                                <a href="${c.comments[cs.raw_id][0].url()}">
                                                    ${len(c.comments[cs.raw_id])}
                                                    <i class="icon-comment-discussion"></i>
                                                </a>
                                            </div>
                                        </div>
                                    %endif
                                    %if h.is_hg(c.db_repo_scm_instance):
                                        %for book in cs.bookmarks:
                                            <div class="booktag" title="${_('Bookmark %s') % book}">
                                                ${h.link_to(book,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}
                                            </div>
                                        %endfor
                                    %endif
                                    %for tag in cs.tags:
                                        <div class="tagtag" title="${_('Tag %s') % tag}">
                                            ${h.link_to(tag,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}
                                        </div>
                                    %endfor
                                    %if (not c.branch_name) and cs.branch:
                                        <div class="branchtag" title="${_('Branch %s' % cs.branch)}">
                                            ${h.link_to(cs.branch,h.url('changelog_home',repo_name=c.repo_name,branch=cs.branch))}
                                        </div>
                                    %endif
                                </div>
                            </div>
                        </td>
                    </tr>
                %endfor
                </tbody>
                </table>

                <input type="checkbox" id="singlerange" style="display:none"/>

                </div>

                <div class="pagination-wh pagination-left">
                    ${c.pagination.pager('$link_previous ~2~ $link_next')}
                </div>
            </div>
        </div>

        <script type="text/javascript" src="${h.url('/js/graph.js', ver=c.kallithea_version)}"></script>
        <script type="text/javascript">
            $(document).ready(function(){
                var $checkboxes = $('.changeset_range');

                pyroutes.register('changeset_home', "${h.url('changeset_home', repo_name='%(repo_name)s', revision='%(revision)s')}", ['repo_name', 'revision']);

                var checkbox_checker = function(e) {
                    var $checked_checkboxes = $checkboxes.filter(':checked');
                    var $singlerange = $('#singlerange');

                    $('#rev_range_container').hide();
                    $checkboxes.show();
                    $singlerange.show();

                    if ($checked_checkboxes.length > 0) {
                        $checked_checkboxes.first().parent('td').append($singlerange);
                        var singlerange = $singlerange.prop('checked');
                        var rev_end = $checked_checkboxes.first().prop('name').substr(0, 12);
                        if ($checked_checkboxes.length > 1 || singlerange) {
                            var rev_start = $checked_checkboxes.last().prop('name').substr(0, 12);
                            $('#rev_range_container').prop('href',
                                pyroutes.url('changeset_home', {'repo_name': '${c.repo_name}',
                                                                'revision': rev_start + '...' + rev_end}));
                            $('#rev_range_container').html(
                                 _TM['Show Selected Changesets {0} &rarr; {1}'].format(rev_start, rev_end));
                            $('#rev_range_container').show();
                            $('#open_new_pr').prop('href', pyroutes.url('pullrequest_home',
                                                                        {'repo_name': '${c.repo_name}',
                                                                         'rev_start': rev_start,
                                                                         'rev_end': rev_end}));
                            $('#open_new_pr').html(_TM['Open New Pull Request for {0} &rarr; {1}'].format(rev_start, rev_end));
                        } else {
                            $('#open_new_pr').prop('href', pyroutes.url('pullrequest_home',
                                                                        {'repo_name': '${c.repo_name}',
                                                                         'rev_end': rev_end}));
                            $('#open_new_pr').html(_TM['Open New Pull Request from {0}'].format(rev_end));
                        }

                        $('#rev_range_clear').show();
                        $('#compare_fork').hide();

                        var disabled = true;
                        $checkboxes.each(function(){
                            var $this = $(this);
                            if (disabled) {
                                if ($this.prop('checked')) {
                                    $this.closest('tr').removeClass('out-of-range');
                                    disabled = singlerange;
                                } else {
                                    $this.closest('tr').addClass('out-of-range');
                                }
                            } else {
                                $this.closest('tr').removeClass('out-of-range');
                                disabled = $this.prop('checked');
                            }
                        });

                        if ($checked_checkboxes.length + (singlerange ? 1 : 0) >= 2) {
                            $checkboxes.hide();
                            $checked_checkboxes.show();
                            if (!singlerange)
                                $singlerange.hide();
                        }
                    } else {
                        $('#singlerange').hide().prop('checked', false);
                        $('#rev_range_clear').hide();
                        %if c.revision:
                            $('#open_new_pr').prop('href', pyroutes.url('pullrequest_home',
                                                                        {'repo_name': '${c.repo_name}',
                                                                         'rev_end':'${c.first_revision.raw_id}'}));
                            $('#open_new_pr').html(_TM['Open New Pull Request from {0}'].format('${c.revision}'));
                        %else:
                            $('#open_new_pr').prop('href', pyroutes.url('pullrequest_home',
                                                                        {'repo_name': '${c.repo_name}',
                                                                        'branch':'${c.first_revision.branch}'}));
                            $('#open_new_pr').html(_TM['Open New Pull Request from {0}'].format('${c.first_revision.branch}'));
                        %endif
                        $('#compare_fork').show();
                        $checkboxes.closest('tr').removeClass('out-of-range');
                    }
                };
                checkbox_checker();
                $checkboxes.click(function() {
                    checkbox_checker();
                    r.render(jsdata,100);
                });
                $('#singlerange').click(checkbox_checker);

                $('#rev_range_clear').click(function(e){
                    $checkboxes.prop('checked', false);
                    checkbox_checker();
                    r.render(jsdata,100);
                });

                var $msgs = $('.message');
                // get first element height
                var el = $('#graph_content .container')[0];
                var row_h = el.clientHeight;
                $msgs.each(function() {
                    var m = this;

                    var h = m.clientHeight;
                    if(h > row_h){
                        var offset = row_h - (h+12);
                        $(m.nextElementSibling).css('display', 'block');
                        $(m.nextElementSibling).css('margin-top', offset+'px');
                    }
                });

                $('.expand_commit').on('click',function(e){
                    var cid = $(this).attr('commit_id');
                    $('#C-'+cid).toggleClass('expanded');

                    //redraw the graph, r and jsdata are bound outside function
                    r.render(jsdata,100);
                });

                // change branch filter
                $("#branch_filter").select2({
                    dropdownAutoWidth: true,
                    minimumInputLength: 1,
                    sortResults: branchSort
                    });

                $("#branch_filter").change(function(e){
                    var selected_branch = e.currentTarget.options[e.currentTarget.selectedIndex].value;
                    if(selected_branch != ''){
                        window.location = pyroutes.url('changelog_home', {'repo_name': '${c.repo_name}',
                                                                          'branch': selected_branch});
                    }else{
                        window.location = pyroutes.url('changelog_home', {'repo_name': '${c.repo_name}'});
                    }
                    $("#changelog").hide();
                });

                var jsdata = ${c.jsdata|n};
                var r = new BranchRenderer('graph_canvas', 'graph_content', 'chg_');
                r.render(jsdata,100);
            });

        </script>
        %else:
            ${_('There are no changes yet')}
        %endif
    </div>
</div>
</%def>