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 %>
最后显示效果如下图所示: