##// END OF EJS Templates
swap the select values with revisions dynamically when switching the repos on pull request view...
marcink -
r2847:1cd0a0c0 beta
parent child Browse files
Show More
@@ -1,133 +1,138
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 rhodecode.controllers.compare
3 rhodecode.controllers.compare
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 compare controller for pylons showoing differences between two
6 compare controller for pylons showoing differences between two
7 repos, branches, bookmarks or tips
7 repos, branches, bookmarks or tips
8
8
9 :created_on: May 6, 2012
9 :created_on: May 6, 2012
10 :author: marcink
10 :author: marcink
11 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
11 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
12 :license: GPLv3, see COPYING for more details.
12 :license: GPLv3, see COPYING for more details.
13 """
13 """
14 # This program is free software: you can redistribute it and/or modify
14 # This program is free software: you can redistribute it and/or modify
15 # it under the terms of the GNU General Public License as published by
15 # it under the terms of the GNU General Public License as published by
16 # the Free Software Foundation, either version 3 of the License, or
16 # the Free Software Foundation, either version 3 of the License, or
17 # (at your option) any later version.
17 # (at your option) any later version.
18 #
18 #
19 # This program is distributed in the hope that it will be useful,
19 # This program is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU General Public License for more details.
22 # GNU General Public License for more details.
23 #
23 #
24 # You should have received a copy of the GNU General Public License
24 # You should have received a copy of the GNU General Public License
25 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 # along with this program. If not, see <http://www.gnu.org/licenses/>.
26 import logging
26 import logging
27 import traceback
27 import traceback
28
28
29 from webob.exc import HTTPNotFound
29 from webob.exc import HTTPNotFound
30 from pylons import request, response, session, tmpl_context as c, url
30 from pylons import request, response, session, tmpl_context as c, url
31 from pylons.controllers.util import abort, redirect
31 from pylons.controllers.util import abort, redirect
32 from pylons.i18n.translation import _
32 from pylons.i18n.translation import _
33
33
34 from rhodecode.lib.vcs.exceptions import EmptyRepositoryError, RepositoryError
34 from rhodecode.lib.vcs.exceptions import EmptyRepositoryError, RepositoryError
35 from rhodecode.lib import helpers as h
35 from rhodecode.lib import helpers as h
36 from rhodecode.lib.base import BaseRepoController, render
36 from rhodecode.lib.base import BaseRepoController, render
37 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
37 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
38 from rhodecode.lib import diffs
38 from rhodecode.lib import diffs
39
39
40 from rhodecode.model.db import Repository
40 from rhodecode.model.db import Repository
41 from rhodecode.model.pull_request import PullRequestModel
41 from rhodecode.model.pull_request import PullRequestModel
42 from webob.exc import HTTPBadRequest
42
43
43 log = logging.getLogger(__name__)
44 log = logging.getLogger(__name__)
44
45
45
46
46 class CompareController(BaseRepoController):
47 class CompareController(BaseRepoController):
47
48
48 @LoginRequired()
49 @LoginRequired()
49 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
50 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
50 'repository.admin')
51 'repository.admin')
51 def __before__(self):
52 def __before__(self):
52 super(CompareController, self).__before__()
53 super(CompareController, self).__before__()
53
54
54 def __get_cs_or_redirect(self, rev, repo, redirect_after=True):
55 def __get_cs_or_redirect(self, rev, repo, redirect_after=True,
56 partial=False):
55 """
57 """
56 Safe way to get changeset if error occur it redirects to changeset with
58 Safe way to get changeset if error occur it redirects to changeset with
57 proper message
59 proper message. If partial is set then don't do redirect raise Exception
60 instead
58
61
59 :param rev: revision to fetch
62 :param rev: revision to fetch
60 :param repo: repo instance
63 :param repo: repo instance
61 """
64 """
62
65
63 try:
66 try:
64 type_, rev = rev
67 type_, rev = rev
65 return repo.scm_instance.get_changeset(rev)
68 return repo.scm_instance.get_changeset(rev)
66 except EmptyRepositoryError, e:
69 except EmptyRepositoryError, e:
67 if not redirect_after:
70 if not redirect_after:
68 return None
71 return None
69 h.flash(h.literal(_('There are no changesets yet')),
72 h.flash(h.literal(_('There are no changesets yet')),
70 category='warning')
73 category='warning')
71 redirect(url('summary_home', repo_name=repo.repo_name))
74 redirect(url('summary_home', repo_name=repo.repo_name))
72
75
73 except RepositoryError, e:
76 except RepositoryError, e:
74 log.error(traceback.format_exc())
77 log.error(traceback.format_exc())
75 h.flash(str(e), category='warning')
78 h.flash(str(e), category='warning')
76 redirect(h.url('summary_home', repo_name=repo.repo_name))
79 if not partial:
80 redirect(h.url('summary_home', repo_name=repo.repo_name))
81 raise HTTPBadRequest()
77
82
78 def index(self, org_ref_type, org_ref, other_ref_type, other_ref):
83 def index(self, org_ref_type, org_ref, other_ref_type, other_ref):
79
84
80 org_repo = c.rhodecode_db_repo.repo_name
85 org_repo = c.rhodecode_db_repo.repo_name
81 org_ref = (org_ref_type, org_ref)
86 org_ref = (org_ref_type, org_ref)
82 other_ref = (other_ref_type, other_ref)
87 other_ref = (other_ref_type, other_ref)
83 other_repo = request.GET.get('repo', org_repo)
88 other_repo = request.GET.get('repo', org_repo)
84
89
85 c.swap_url = h.url('compare_url', repo_name=other_repo,
90 c.swap_url = h.url('compare_url', repo_name=other_repo,
86 org_ref_type=other_ref[0], org_ref=other_ref[1],
91 org_ref_type=other_ref[0], org_ref=other_ref[1],
87 other_ref_type=org_ref[0], other_ref=org_ref[1],
92 other_ref_type=org_ref[0], other_ref=org_ref[1],
88 repo=org_repo)
93 repo=org_repo)
89
94
90 c.org_repo = org_repo = Repository.get_by_repo_name(org_repo)
95 c.org_repo = org_repo = Repository.get_by_repo_name(org_repo)
91 c.other_repo = other_repo = Repository.get_by_repo_name(other_repo)
96 c.other_repo = other_repo = Repository.get_by_repo_name(other_repo)
92
97
93 if c.org_repo is None or c.other_repo is None:
98 if c.org_repo is None or c.other_repo is None:
94 log.error('Could not found repo %s or %s' % (org_repo, other_repo))
99 log.error('Could not found repo %s or %s' % (org_repo, other_repo))
95 raise HTTPNotFound
100 raise HTTPNotFound
96
101
97 if c.org_repo.scm_instance.alias != 'hg':
102 if c.org_repo.scm_instance.alias != 'hg':
98 log.error('Review not available for GIT REPOS')
103 log.error('Review not available for GIT REPOS')
99 raise HTTPNotFound
104 raise HTTPNotFound
100
105 partial = request.environ.get('HTTP_X_PARTIAL_XHR')
101 self.__get_cs_or_redirect(rev=org_ref, repo=org_repo)
106 self.__get_cs_or_redirect(rev=org_ref, repo=org_repo, partial=partial)
102 self.__get_cs_or_redirect(rev=other_ref, repo=other_repo)
107 self.__get_cs_or_redirect(rev=other_ref, repo=other_repo, partial=partial)
103
108
104 c.cs_ranges, discovery_data = PullRequestModel().get_compare_data(
109 c.cs_ranges, discovery_data = PullRequestModel().get_compare_data(
105 org_repo, org_ref, other_repo, other_ref
110 org_repo, org_ref, other_repo, other_ref
106 )
111 )
107
112
108 c.statuses = c.rhodecode_db_repo.statuses([x.raw_id for x in
113 c.statuses = c.rhodecode_db_repo.statuses([x.raw_id for x in
109 c.cs_ranges])
114 c.cs_ranges])
110 c.target_repo = c.repo_name
115 c.target_repo = c.repo_name
111 # defines that we need hidden inputs with changesets
116 # defines that we need hidden inputs with changesets
112 c.as_form = request.GET.get('as_form', False)
117 c.as_form = request.GET.get('as_form', False)
113 if request.environ.get('HTTP_X_PARTIAL_XHR'):
118 if partial:
114 return render('compare/compare_cs.html')
119 return render('compare/compare_cs.html')
115
120
116 c.org_ref = org_ref[1]
121 c.org_ref = org_ref[1]
117 c.other_ref = other_ref[1]
122 c.other_ref = other_ref[1]
118 # diff needs to have swapped org with other to generate proper diff
123 # diff needs to have swapped org with other to generate proper diff
119 _diff = diffs.differ(other_repo, other_ref, org_repo, org_ref,
124 _diff = diffs.differ(other_repo, other_ref, org_repo, org_ref,
120 discovery_data)
125 discovery_data)
121 diff_processor = diffs.DiffProcessor(_diff, format='gitdiff')
126 diff_processor = diffs.DiffProcessor(_diff, format='gitdiff')
122 _parsed = diff_processor.prepare()
127 _parsed = diff_processor.prepare()
123
128
124 c.files = []
129 c.files = []
125 c.changes = {}
130 c.changes = {}
126
131
127 for f in _parsed:
132 for f in _parsed:
128 fid = h.FID('', f['filename'])
133 fid = h.FID('', f['filename'])
129 c.files.append([fid, f['operation'], f['filename'], f['stats']])
134 c.files.append([fid, f['operation'], f['filename'], f['stats']])
130 diff = diff_processor.as_html(enable_comments=False, diff_lines=[f])
135 diff = diff_processor.as_html(enable_comments=False, diff_lines=[f])
131 c.changes[fid] = [f['operation'], f['filename'], diff]
136 c.changes[fid] = [f['operation'], f['filename'], diff]
132
137
133 return render('compare/compare_diff.html')
138 return render('compare/compare_diff.html')
@@ -1,189 +1,196
1 <%inherit file="/base/base.html"/>
1 <%inherit file="/base/base.html"/>
2
2
3 <%def name="title()">
3 <%def name="title()">
4 ${c.repo_name} ${_('New pull request')}
4 ${c.repo_name} ${_('New pull request')}
5 </%def>
5 </%def>
6
6
7 <%def name="breadcrumbs_links()">
7 <%def name="breadcrumbs_links()">
8 ${h.link_to(_(u'Home'),h.url('/'))}
8 ${h.link_to(_(u'Home'),h.url('/'))}
9 &raquo;
9 &raquo;
10 ${h.link_to(c.repo_name,h.url('changelog_home',repo_name=c.repo_name))}
10 ${h.link_to(c.repo_name,h.url('changelog_home',repo_name=c.repo_name))}
11 &raquo;
11 &raquo;
12 ${_('New pull request')}
12 ${_('New pull request')}
13 </%def>
13 </%def>
14
14
15 <%def name="main()">
15 <%def name="main()">
16
16
17 <div class="box">
17 <div class="box">
18 <!-- box / title -->
18 <!-- box / title -->
19 <div class="title">
19 <div class="title">
20 ${self.breadcrumbs()}
20 ${self.breadcrumbs()}
21 </div>
21 </div>
22 ${h.form(url('pullrequest', repo_name=c.repo_name), method='post', id='pull_request_form')}
22 ${h.form(url('pullrequest', repo_name=c.repo_name), method='post', id='pull_request_form')}
23 <div style="float:left;padding:0px 30px 30px 30px">
23 <div style="float:left;padding:0px 30px 30px 30px">
24 <div style="padding:0px 5px 5px 5px">
24 <div style="padding:0px 5px 5px 5px">
25 <span>
25 <span>
26 <a id="refresh" href="#">
26 <a id="refresh" href="#">
27 <img class="icon" title="${_('Refresh')}" alt="${_('Refresh')}" src="${h.url('/images/icons/arrow_refresh.png')}"/>
27 <img class="icon" title="${_('Refresh')}" alt="${_('Refresh')}" src="${h.url('/images/icons/arrow_refresh.png')}"/>
28 ${_('refresh overview')}
28 ${_('refresh overview')}
29 </a>
29 </a>
30 </span>
30 </span>
31 </div>
31 </div>
32 ##ORG
32 ##ORG
33 <div style="float:left">
33 <div style="float:left">
34 <div class="fork_user">
34 <div class="fork_user">
35 <div class="gravatar">
35 <div class="gravatar">
36 <img alt="gravatar" src="${h.gravatar_url(c.rhodecode_db_repo.user.email,24)}"/>
36 <img alt="gravatar" src="${h.gravatar_url(c.rhodecode_db_repo.user.email,24)}"/>
37 </div>
37 </div>
38 <span style="font-size: 20px">
38 <span style="font-size: 20px">
39 ${h.select('org_repo','',c.org_repos,class_='refs')}:${h.select('org_ref','',c.org_refs,class_='refs')}
39 ${h.select('org_repo','',c.org_repos,class_='refs')}:${h.select('org_ref','',c.org_refs,class_='refs')}
40 </span>
40 </span>
41 <div style="padding:5px 3px 3px 42px;">${c.rhodecode_db_repo.description}</div>
41 <div style="padding:5px 3px 3px 42px;">${c.rhodecode_db_repo.description}</div>
42 </div>
42 </div>
43 <div style="clear:both;padding-top: 10px"></div>
43 <div style="clear:both;padding-top: 10px"></div>
44 </div>
44 </div>
45 <div style="float:left;font-size:24px;padding:0px 20px">
45 <div style="float:left;font-size:24px;padding:0px 20px">
46 <img height=32 width=32 src="${h.url('/images/arrow_right_64.png')}"/>
46 <img height=32 width=32 src="${h.url('/images/arrow_right_64.png')}"/>
47 </div>
47 </div>
48
48
49 ##OTHER, most Probably the PARENT OF THIS FORK
49 ##OTHER, most Probably the PARENT OF THIS FORK
50 <div style="float:left">
50 <div style="float:left">
51 <div class="fork_user">
51 <div class="fork_user">
52 <div class="gravatar">
52 <div class="gravatar">
53 <img id="other_repo_gravatar" alt="gravatar" src=""/>
53 <img id="other_repo_gravatar" alt="gravatar" src=""/>
54 </div>
54 </div>
55 <span style="font-size: 20px">
55 <span style="font-size: 20px">
56 ${h.select('other_repo',c.default_pull_request ,c.other_repos,class_='refs')}:${h.select('other_ref','',c.default_revs,class_='refs')}
56 ${h.select('other_repo',c.default_pull_request ,c.other_repos,class_='refs')}:${h.select('other_ref','',c.default_revs,class_='refs')}
57 </span>
57 </span>
58 <div id="other_repo_desc" style="padding:5px 3px 3px 42px;"></div>
58 <div id="other_repo_desc" style="padding:5px 3px 3px 42px;"></div>
59 </div>
59 </div>
60 <div style="clear:both;padding-top: 10px"></div>
60 <div style="clear:both;padding-top: 10px"></div>
61 </div>
61 </div>
62 <div style="clear:both;padding-top: 10px"></div>
62 <div style="clear:both;padding-top: 10px"></div>
63 ## overview pulled by ajax
63 ## overview pulled by ajax
64 <div style="float:left" id="pull_request_overview"></div>
64 <div style="float:left" id="pull_request_overview"></div>
65 <div style="float:left;clear:both;padding:10px 10px 10px 0px;display:none">
65 <div style="float:left;clear:both;padding:10px 10px 10px 0px;display:none">
66 <a id="pull_request_overview_url" href="#">${_('Detailed compare view')}</a>
66 <a id="pull_request_overview_url" href="#">${_('Detailed compare view')}</a>
67 </div>
67 </div>
68 </div>
68 </div>
69 <div style="float:left; border-left:1px dashed #eee">
69 <div style="float:left; border-left:1px dashed #eee">
70 <h4>${_('Pull request reviewers')}</h4>
70 <h4>${_('Pull request reviewers')}</h4>
71 <div id="reviewers" style="padding:0px 0px 0px 15px">
71 <div id="reviewers" style="padding:0px 0px 0px 15px">
72 ## members goes here !
72 ## members goes here !
73 <div class="group_members_wrap">
73 <div class="group_members_wrap">
74 <ul id="review_members" class="group_members">
74 <ul id="review_members" class="group_members">
75 %for member in c.review_members:
75 %for member in c.review_members:
76 <li id="reviewer_${member.user_id}">
76 <li id="reviewer_${member.user_id}">
77 <div class="reviewers_member">
77 <div class="reviewers_member">
78 <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(member.email,14)}"/> </div>
78 <div class="gravatar"><img alt="gravatar" src="${h.gravatar_url(member.email,14)}"/> </div>
79 <div style="float:left">${member.full_name} (${_('owner')})</div>
79 <div style="float:left">${member.full_name} (${_('owner')})</div>
80 <input type="hidden" value="${member.user_id}" name="review_members" />
80 <input type="hidden" value="${member.user_id}" name="review_members" />
81 <span class="delete_icon action_button" onclick="removeReviewer(${member.user_id})"></span>
81 <span class="delete_icon action_button" onclick="removeReviewer(${member.user_id})"></span>
82 </div>
82 </div>
83 </li>
83 </li>
84 %endfor
84 %endfor
85 </ul>
85 </ul>
86 </div>
86 </div>
87
87
88 <div class='ac'>
88 <div class='ac'>
89 <div class="reviewer_ac">
89 <div class="reviewer_ac">
90 ${h.text('user', class_='yui-ac-input')}
90 ${h.text('user', class_='yui-ac-input')}
91 <span class="help-block">${_('Add reviewer to this pull request.')}</span>
91 <span class="help-block">${_('Add reviewer to this pull request.')}</span>
92 <div id="reviewers_container"></div>
92 <div id="reviewers_container"></div>
93 </div>
93 </div>
94 </div>
94 </div>
95 </div>
95 </div>
96 </div>
96 </div>
97 <h3>${_('Create new pull request')}</h3>
97 <h3>${_('Create new pull request')}</h3>
98
98
99 <div class="form">
99 <div class="form">
100 <!-- fields -->
100 <!-- fields -->
101
101
102 <div class="fields">
102 <div class="fields">
103
103
104 <div class="field">
104 <div class="field">
105 <div class="label">
105 <div class="label">
106 <label for="pullrequest_title">${_('Title')}:</label>
106 <label for="pullrequest_title">${_('Title')}:</label>
107 </div>
107 </div>
108 <div class="input">
108 <div class="input">
109 ${h.text('pullrequest_title',size=30)}
109 ${h.text('pullrequest_title',size=30)}
110 </div>
110 </div>
111 </div>
111 </div>
112
112
113 <div class="field">
113 <div class="field">
114 <div class="label label-textarea">
114 <div class="label label-textarea">
115 <label for="pullrequest_desc">${_('description')}:</label>
115 <label for="pullrequest_desc">${_('description')}:</label>
116 </div>
116 </div>
117 <div class="textarea text-area editor">
117 <div class="textarea text-area editor">
118 ${h.textarea('pullrequest_desc',size=30)}
118 ${h.textarea('pullrequest_desc',size=30)}
119 </div>
119 </div>
120 </div>
120 </div>
121
121
122 <div class="buttons">
122 <div class="buttons">
123 ${h.submit('save',_('Send pull request'),class_="ui-btn large")}
123 ${h.submit('save',_('Send pull request'),class_="ui-btn large")}
124 ${h.reset('reset',_('Reset'),class_="ui-btn large")}
124 ${h.reset('reset',_('Reset'),class_="ui-btn large")}
125 </div>
125 </div>
126 </div>
126 </div>
127 </div>
127 </div>
128 ${h.end_form()}
128 ${h.end_form()}
129
129
130 </div>
130 </div>
131
131
132 <script type="text/javascript">
132 <script type="text/javascript">
133 var _USERS_AC_DATA = ${c.users_array|n};
133 var _USERS_AC_DATA = ${c.users_array|n};
134 var _GROUPS_AC_DATA = ${c.users_groups_array|n};
134 var _GROUPS_AC_DATA = ${c.users_groups_array|n};
135 PullRequestAutoComplete('user', 'reviewers_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
135 PullRequestAutoComplete('user', 'reviewers_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
136
136
137 var other_repos_info = ${c.other_repos_info|n};
137 var other_repos_info = ${c.other_repos_info|n};
138
138 var loadPreview = function(){
139 var loadPreview = function(){
139 YUD.setStyle(YUD.get('pull_request_overview_url').parentElement,'display','none');
140 YUD.setStyle(YUD.get('pull_request_overview_url').parentElement,'display','none');
140 var url = "${h.url('compare_url',
141 var url = "${h.url('compare_url',
141 repo_name='org_repo',
142 repo_name='org_repo',
142 org_ref_type='org_ref_type', org_ref='org_ref',
143 org_ref_type='org_ref_type', org_ref='org_ref',
143 other_ref_type='other_ref_type', other_ref='other_ref',
144 other_ref_type='other_ref_type', other_ref='other_ref',
144 repo='other_repo',
145 repo='other_repo',
145 as_form=True)}";
146 as_form=True)}";
146
147
147 var select_refs = YUQ('#pull_request_form select.refs')
148 var select_refs = YUQ('#pull_request_form select.refs')
148
149
149 for(var i=0;i<select_refs.length;i++){
150 for(var i=0;i<select_refs.length;i++){
150 var select_ref = select_refs[i];
151 var select_ref = select_refs[i];
151 var select_ref_data = select_ref.value.split(':');
152 var select_ref_data = select_ref.value.split(':');
152 var key = null;
153 var key = null;
153 var val = null;
154 var val = null;
154 if(select_ref_data.length>1){
155 if(select_ref_data.length>1){
155 key = select_ref.name+"_type";
156 key = select_ref.name+"_type";
156 val = select_ref_data[0];
157 val = select_ref_data[0];
157 url = url.replace(key,val);
158 url = url.replace(key,val);
158
159
159 key = select_ref.name;
160 key = select_ref.name;
160 val = select_ref_data[1];
161 val = select_ref_data[1];
161 url = url.replace(key,val);
162 url = url.replace(key,val);
162
163
163 }else{
164 }else{
164 key = select_ref.name;
165 key = select_ref.name;
165 val = select_ref.value;
166 val = select_ref.value;
166 url = url.replace(key,val);
167 url = url.replace(key,val);
167 }
168 }
168 }
169 }
169
170
171 YUE.on('other_repo', 'change', function(e){
172 var repo_name = e.currentTarget.value;
173 // replace the <select> of changed repo
174 YUD.get('other_ref').innerHTML = other_repos_info[repo_name]['revs'];
175 });
176
170 ypjax(url,'pull_request_overview', function(data){
177 ypjax(url,'pull_request_overview', function(data){
171 var sel_box = YUQ('#pull_request_form #other_repo')[0];
178 var sel_box = YUQ('#pull_request_form #other_repo')[0];
172 var repo_name = sel_box.options[sel_box.selectedIndex].value;
179 var repo_name = sel_box.options[sel_box.selectedIndex].value;
173 YUD.get('pull_request_overview_url').href = url;
180 YUD.get('pull_request_overview_url').href = url;
174 YUD.setStyle(YUD.get('pull_request_overview_url').parentElement,'display','');
181 YUD.setStyle(YUD.get('pull_request_overview_url').parentElement,'display','');
175 YUD.get('other_repo_gravatar').src = other_repos_info[repo_name]['gravatar'];
182 YUD.get('other_repo_gravatar').src = other_repos_info[repo_name]['gravatar'];
176 YUD.get('other_repo_desc').innerHTML = other_repos_info[repo_name]['description'];
183 YUD.get('other_repo_desc').innerHTML = other_repos_info[repo_name]['description'];
177 YUD.get('other_ref').innerHTML = other_repos_info[repo_name]['revs'];
184 YUD.get('other_ref').innerHTML = other_repos_info[repo_name]['revs'];
178 })
185 })
179 }
186 }
180 YUE.on('refresh','click',function(e){
187 YUE.on('refresh','click',function(e){
181 loadPreview()
188 loadPreview()
182 })
189 })
183
190
184 //lazy load overview after 0.5s
191 //lazy load overview after 0.5s
185 setTimeout(loadPreview, 500)
192 setTimeout(loadPreview, 500)
186
193
187 </script>
194 </script>
188
195
189 </%def>
196 </%def>
General Comments 0
You need to be logged in to leave comments. Login now