安裝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 > 0codepath_show = Array.newreviewpath_show = Array.newreviewid_show = Array.newfor review in @reviewsif (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]endcodepath_show << codepathreviewpath_show << review.pathreviewid_show << review.id endendi = 0progress = Array.newprogress<<'<table>'while i<changeset.review_count doprogress<<'<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 += 1endprogress<<'</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 %>
最後顯示效果如所示: