<%inherit file="/base/base.mako"/> <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/> <%def name="title()"> %if c.compare_home: ${_('%s Compare') % c.repo_name} %else: ${_('%s Compare') % c.repo_name} - ${'%s@%s' % (c.source_repo.repo_name, c.source_ref)} > ${'%s@%s' % (c.target_repo.repo_name, c.target_ref)} %endif %if c.rhodecode_name: · ${h.branding(c.rhodecode_name)} %endif </%def> <%def name="breadcrumbs_links()"></%def> <%def name="menu_bar_nav()"> ${self.menu_items(active='repositories')} </%def> <%def name="menu_bar_subnav()"> ${self.repo_menu(active='compare')} </%def> <%def name="main()"> <script type="text/javascript"> // set fake commitId on this commit-range page templateContext.commit_data.commit_id = "${h.EmptyCommit().raw_id}"; </script> <div class="box"> <div class="summary changeset"> <div class="summary-detail"> <div class="summary-detail-header"> <span class="breadcrumbs files_location"> <h4> ${_('Compare Commits')} % if c.file_path: ${_('for file')} <a href="#${('a_' + h.FID('',c.file_path))}">${c.file_path}</a> % endif % if c.commit_ranges: <code> r${c.commit_ranges[0].idx}:${h.short_id(c.commit_ranges[0].raw_id)}...r${c.commit_ranges[-1].idx}:${h.short_id(c.commit_ranges[-1].raw_id)} </code> % endif </h4> </span> <div class="clear-fix"></div> </div> <div class="fieldset"> <div class="left-label-summary"> <p class="spacing">${_('Target')}:</p> <div class="right-label-summary"> <div class="code-header" > <div class="compare_header"> ## The hidden elements are replaced with a select2 widget ${h.hidden('compare_source')} </div> </div> </div> </div> </div> <div class="fieldset"> <div class="left-label-summary"> <p class="spacing">${_('Source')}:</p> <div class="right-label-summary"> <div class="code-header" > <div class="compare_header"> ## The hidden elements are replaced with a select2 widget ${h.hidden('compare_target')} </div> </div> </div> </div> </div> <div class="fieldset"> <div class="left-label-summary"> <p class="spacing">${_('Actions')}:</p> <div class="right-label-summary"> <div class="code-header" > <div class="compare_header"> <div class="compare-buttons"> % if c.compare_home: <a id="compare_revs" class="btn btn-primary"> ${_('Compare Commits')}</a> %if c.rhodecode_db_repo.fork: <a class="btn btn-default" title="${h.tooltip(_('Compare fork with %s' % c.rhodecode_db_repo.fork.repo_name))}" href="${h.route_path('repo_compare', repo_name=c.rhodecode_db_repo.fork.repo_name, source_ref_type=c.rhodecode_db_repo.landing_ref_type, source_ref=c.rhodecode_db_repo.landing_ref_name, target_repo=c.repo_name,target_ref_type='branch' if request.GET.get('branch') else c.rhodecode_db_repo.landing_ref_type, target_ref=request.GET.get('branch') or c.rhodecode_db_repo.landing_ref_name, _query=dict(merge=1))}" > ${_('Compare with origin')} </a> %endif <a class="btn disabled tooltip" disabled="disabled" title="${_('Action unavailable in current view')}">${_('Swap')}</a> <a class="btn disabled tooltip" disabled="disabled" title="${_('Action unavailable in current view')}">${_('Comment')}</a> <div id="changeset_compare_view_content"> <div class="help-block">${_('Compare commits, branches, bookmarks or tags.')}</div> </div> % elif c.preview_mode: <a class="btn disabled tooltip" disabled="disabled" title="${_('Action unavailable in current view')}">${_('Compare Commits')}</a> <a class="btn disabled tooltip" disabled="disabled" title="${_('Action unavailable in current view')}">${_('Swap')}</a> <a class="btn disabled tooltip" disabled="disabled" title="${_('Action unavailable in current view')}">${_('Comment')}</a> % else: <a id="compare_revs" class="btn btn-primary"> ${_('Compare Commits')}</a> <a id="btn-swap" class="btn btn-primary" href="${c.swap_url}">${_('Swap')}</a> ## allow comment only if there are commits to comment on % if c.diffset and c.diffset.files and c.commit_ranges: <a id="compare_changeset_status_toggle" class="btn btn-primary">${_('Comment')}</a> % else: <a class="btn disabled tooltip" disabled="disabled" title="${_('Action unavailable in current view')}">${_('Comment')}</a> % endif % endif </div> </div> </div> </div> </div> </div> ## commit status form <div class="fieldset" id="compare_changeset_status" style="display: none; margin-bottom: -80px;"> <div class="left-label-summary"> <p class="spacing">${_('Commit status')}:</p> <div class="right-label-summary"> <%namespace name="comment" file="/changeset/changeset_file_comment.mako"/> ## main comment form and it status <% def revs(_revs): form_inputs = [] for cs in _revs: tmpl = '<input type="hidden" data-commit-id="%(cid)s" name="commit_ids" value="%(cid)s">' % {'cid': cs.raw_id} form_inputs.append(tmpl) return form_inputs %> <div> ${comment.comments(h.route_path('repo_commit_comment_create', repo_name=c.repo_name, commit_id='0'*16), None, is_compare=True, form_extras=revs(c.commit_ranges))} </div> </div> </div> </div> <div class="clear-fix"></div> </div> <!-- end summary-detail --> </div> <!-- end summary --> ## use JS script to load it quickly before potentially large diffs render long time ## this prevents from situation when large diffs block rendering of select2 fields <script type="text/javascript"> var cache = {}; var formatSelection = function(repoName){ return function(data, container, escapeMarkup) { var selection = data ? this.text(data) : ""; return escapeMarkup('{0}@{1}'.format(repoName, selection)); } }; var feedCompareData = function(query, cachedValue){ var data = {results: []}; //filter results $.each(cachedValue.results, function() { var section = this.text; var children = []; $.each(this.children, function() { if (query.term.length === 0 || this.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) { children.push({ 'id': this.id, 'text': this.text, 'type': this.type }) } }); data.results.push({ 'text': section, 'children': children }) }); //push the typed in changeset data.results.push({ 'text': _gettext('specify commit'), 'children': [{ 'id': query.term, 'text': query.term, 'type': 'rev' }] }); query.callback(data); }; var loadCompareData = function(repoName, query, cache){ $.ajax({ url: pyroutes.url('repo_refs_data', {'repo_name': repoName}), data: {}, dataType: 'json', type: 'GET', success: function(data) { cache[repoName] = data; query.callback({results: data.results}); } }) }; var enable_fields = ${"false" if c.preview_mode else "true"}; $("#compare_source").select2({ placeholder: "${'%s@%s' % (c.source_repo.repo_name, c.source_ref)}", containerCssClass: "drop-menu", dropdownCssClass: "drop-menu-dropdown", formatSelection: formatSelection("${c.source_repo.repo_name}"), dropdownAutoWidth: true, query: function(query) { var repoName = '${c.source_repo.repo_name}'; var cachedValue = cache[repoName]; if (cachedValue){ feedCompareData(query, cachedValue); } else { loadCompareData(repoName, query, cache); } } }).select2("enable", enable_fields); $("#compare_target").select2({ placeholder: "${'%s@%s' % (c.target_repo.repo_name, c.target_ref)}", dropdownAutoWidth: true, containerCssClass: "drop-menu", dropdownCssClass: "drop-menu-dropdown", formatSelection: formatSelection("${c.target_repo.repo_name}"), query: function(query) { var repoName = '${c.target_repo.repo_name}'; var cachedValue = cache[repoName]; if (cachedValue){ feedCompareData(query, cachedValue); } else { loadCompareData(repoName, query, cache); } } }).select2("enable", enable_fields); var initial_compare_source = {id: "${c.source_ref}", type:"${c.source_ref_type}"}; var initial_compare_target = {id: "${c.target_ref}", type:"${c.target_ref_type}"}; $('#compare_revs').on('click', function(e) { var source = $('#compare_source').select2('data') || initial_compare_source; var target = $('#compare_target').select2('data') || initial_compare_target; if (source && target) { var url_data = { repo_name: "${c.repo_name}", source_ref: source.id, source_ref_type: source.type, target_ref: target.id, target_ref_type: target.type }; window.location = pyroutes.url('repo_compare', url_data); } }); $('#compare_changeset_status_toggle').on('click', function(e) { $('#compare_changeset_status').toggle(); }); </script> ## table diff data <div class="table"> % if not c.compare_home: <div id="changeset_compare_view_content"> <div class="pull-left"> <div class="btn-group"> <a class="${('collapsed' if c.collapse_all_commits else '')}" href="#expand-commits" onclick="toggleCommitExpand(this); return false" data-toggle-commits-cnt=${len(c.commit_ranges)} > % if c.collapse_all_commits: <i class="icon-plus-squared-alt icon-no-margin"></i> ${_ungettext('Expand {} commit', 'Expand {} commits', len(c.commit_ranges)).format(len(c.commit_ranges))} % else: <i class="icon-minus-squared-alt icon-no-margin"></i> ${_ungettext('Collapse {} commit', 'Collapse {} commits', len(c.commit_ranges)).format(len(c.commit_ranges))} % endif </a> </div> </div> <div style="padding:0 10px 10px 0px" class="pull-left"></div> ## commit compare generated below <%include file="compare_commits.mako"/> ${cbdiffs.render_diffset_menu(c.diffset)} ${cbdiffs.render_diffset(c.diffset)} </div> % endif </div> </div> </%def>