Redmine”版本库“页面显示评审链接
安装Code Review插件后,在Redmine的“版本库”页面中,已经评审过的代码会有一个标记,显示有几条评审。但是这只能知道评审的数量,而不能快速跳转的已经评审过的页面。因此,我需要更改Code Review插件的源代码,在页面上显示这个链接。没有链接的“版本库”页面如下图所示:

很快就发现更改“版本库”页面的代码位于/vendor/plugins/redmine_code_review/apps/views/_update_revisions.html.erb。其中,显示已评审信息的代码如下:
<script type="text/javascript">
<% @changesets.each do |changeset| %>
<%
if changeset.review_count > 0
progress = '<span style="white-space: nowrap">' + progress_bar([changeset.closed_review_pourcent, changeset.completed_review_pourcent],
:width => '60px',
:legend => "#{sprintf("%0.1f", changeset.completed_review_pourcent)}%") + '</span>' +
'<p class="progress-info">' + "#{changeset.closed_review_count} #{l(:label_closed_issues)}" +
" #{changeset.open_review_count} #{l(:label_open_issues)}" + '</p>'
elsif changeset.assignment_count > 0
if (changeset.open_assignment_count > 0)
progress = '<p class="progress-info">' + l(:code_review_assigned) + '</p>'
else
progress = '<p class="progress-info">' + l(:code_review_reviewed) + '</p>'
end
else
progress = '<p class="progress-info">' + l(:lable_no_code_reviews) + '</p>'
end
%>
var count = new ReviewCount(<%= changeset.review_count %>, <%= changeset.open_review_count %>, '<%= progress %>');
review_counts['revision_<%=changeset.identifier %>'] = count;
<% end %>
从代码中可以看出,当 changeset.review_count > 0 时,即有这段代码有评审时,需要显示下面的信息,而 changeset.review_count 也就是评审的数量。如果没有评审,就显示 :label_no_code_reviews。对应代码为:
else
progress = '<p class="progress-info">' + l(:lable_no_code_reviews) + '</p>'
end
我们需要关注的有评审时的情况,也就是:
progress = '<span style="white-space: nowrap">' + progress_bar([changeset.closed_review_pourcent, changeset.completed_review_pourcent],
:width => '60px',
:legend => "#{sprintf("%0.1f", changeset.completed_review_pourcent)}%") + '</span>' +
'<p class="progress-info">' + "#{changeset.closed_review_count} #{l(:label_closed_issues)}" +
" #{changeset.open_review_count} #{l(:label_open_issues)}" + '</p>'
progress是一个string类型,记录了需要显示的html代码,用于最终显示到页面上。我们这里要把它改成一个链接,通过查看其它地方的代码,可以发现生成链接的Ruby代码是这样的:
link_to(codepath, {:controller => 'code_review', :action => 'show', :id => @project, :review_id => review.id}, :title => review.path)
其中 codepath 是显示出来的链接地址,为了照顾页面的长度,把过长的链接字段进行了缩短,review.id 和 review.path 是评审的编号和对应代码路径,经过转化之后,这段代码会生成一个HTML形式的链接,当点这个链接的时候,会调用 code_review 的 show 方法,跳转到对应的路径,以下就一段路径的例子:
<a href="/code_review/show/gg?review_id=12" title="/trunk/tmstable/tmstable-console/src/main/webapp/consoes/screen/process.vm">/trunk/tmstable...console/templates/screen/process.vm</a>
显示一条链接的路径很容易,但是要显示多条路径就比较麻烦了,涉及到信息的存储和table显示。试了好多种方法,最后,终于用如下的代码搞定:
<script type="text/javascript">
<% @changesets.each do |changeset| %>
<%
if changeset.review_count > 0
codepath_show = Array.new
reviewpath_show = Array.new
reviewid_show = Array.new
for review in @reviews
if (changeset.id == review.changeset.id)
puts "review id:"+review.changeset.id.to_s
codepath = review.path
if (review.path.length > 55)
codepath = review.path[0, 15] + '...' + review.path[review.path.length - 35, 35]
end
codepath_show << codepath
reviewpath_show << review.path
reviewid_show << review.id
end
end
i = 0
progress = Array.new
progress<<'<table>'
while i<changeset.review_count do
progress<<'<tr><td>'
progress<<link_to(codepath_show[i], {:controller => 'code_review', :action => 'show', :id => @project, :review_id => reviewid_show[i]}, :title => reviewpath_show[i])
progress<<'</td></tr>'
i += 1
end
progress<<'</table>'
elsif changeset.assignment_count > 0
if (changeset.open_assignment_count > 0)
progress = '<p class="progress-info">' + l(:code_review_assigned) + '</p>'
else
progress = '<p class="progress-info">' + l(:code_review_reviewed) + '</p>'
end
else
progress = '<p class="progress-info">' + l(:lable_no_code_reviews) + '</p>'
end
%>
var count = new ReviewCount(<%= changeset.review_count %>, <%= changeset.open_review_count %>, '<%= progress %>');
review_counts['revision_<%=changeset.identifier %>'] = count;
<% end %>
最后显示效果如下图所示:


浙公网安备 33010602011771号