Commit 2def1c7217556388763dfb860f76e16f9af58571

Authored by randx
1 parent b110c6bc

Merge Request -> show. Refactored. f5 support for diff

Gemfile
... ... @@ -39,6 +39,7 @@ gem "charlock_holmes"
39 39 gem "foreman"
40 40 gem "colored"
41 41 gem 'resque_mailer'
  42 +gem 'tabs_on_rails'
42 43  
43 44 group :assets do
44 45 gem "sass-rails", "3.2.5"
... ...
Gemfile.lock
... ... @@ -331,6 +331,7 @@ GEM
331 331 tilt (~> 1.1, != 1.3.0)
332 332 sqlite3 (1.3.6)
333 333 stamp (0.1.6)
  334 + tabs_on_rails (2.1.1)
334 335 therubyracer (0.10.1)
335 336 libv8 (~> 3.3.10)
336 337 thin (1.3.1)
... ... @@ -420,6 +421,7 @@ DEPENDENCIES
420 421 six
421 422 sqlite3
422 423 stamp
  424 + tabs_on_rails
423 425 therubyracer
424 426 thin
425 427 turn
... ...
app/assets/javascripts/merge_requests.js
... ... @@ -8,36 +8,77 @@ var MergeRequest = {
8 8 var self = this;
9 9 self.opts = opts;
10 10  
  11 + self.initTabs();
  12 + self.initMergeWidget();
  13 +
  14 + $(".mr_show_all_commits").bind("click", function() {
  15 + self.showAllCommits();
  16 + });
  17 +
  18 + $(".line_note_link, .line_note_reply_link").live("click", function(e) {
  19 + var form = $(".per_line_form");
  20 + $(this).parent().parent().after(form);
  21 + form.find("#note_line_code").val($(this).attr("line_code"));
  22 + form.show();
  23 + return false;
  24 + });
  25 + },
  26 +
  27 + initMergeWidget:
  28 + function() {
  29 + var self = this;
11 30 self.showState(self.opts.current_state);
  31 +
12 32 if($(".automerge_widget").length && self.opts.check_enable){
13 33 $.get(opts.url_to_automerge_check, function(data){
14 34 self.showState(data.state);
15 35 }, "json");
16 36 }
  37 + },
17 38  
18   - $(".nav-tabs a").live("click", function() {
19   - $(".nav-tabs a").parent().removeClass("active");
  39 + initTabs:
  40 + function() {
  41 + $(".mr_nav_tabs a").live("click", function() {
  42 + $(".mr_nav_tabs a").parent().removeClass("active");
20 43 $(this).parent().addClass("active");
21 44 });
22 45  
23   - $(".nav-tabs a.merge-notes-tab").live("click", function(e) {
  46 + var current_tab;
  47 + if(this.opts.action == "diffs") {
  48 + current_tab = $(".mr_nav_tabs .merge-diffs-tab");
  49 + } else {
  50 + current_tab = $(".mr_nav_tabs .merge-notes-tab");
  51 + }
  52 + current_tab.parent().addClass("active");
  53 +
  54 + this.initNotesTab();
  55 + this.initDiffTab();
  56 + },
  57 +
  58 + initNotesTab:
  59 + function() {
  60 + $(".mr_nav_tabs a.merge-notes-tab").live("click", function(e) {
24 61 $(".merge-request-diffs").hide();
25 62 $(".merge_request_notes").show();
  63 + var mr_path = $(".merge-notes-tab").attr("data-url");
  64 + history.pushState({ path: mr_path }, '', mr_path);
26 65 e.preventDefault();
27 66 });
  67 + },
28 68  
29   - $(".nav-tabs a.merge-diffs-tab").live("click", function(e) {
  69 + initDiffTab:
  70 + function() {
  71 + $(".mr_nav_tabs a.merge-diffs-tab").live("click", function(e) {
30 72 if(!MergeRequest.diffs_loaded) {
31 73 MergeRequest.loadDiff();
32 74 }
33 75 $(".merge_request_notes").hide();
34 76 $(".merge-request-diffs").show();
  77 + var mr_diff_path = $(".merge-diffs-tab").attr("data-url");
  78 + history.pushState({ path: mr_diff_path }, '', mr_diff_path);
35 79 e.preventDefault();
36 80 });
37 81  
38   - $(".mr_show_all_commits").bind("click", function() {
39   - MergeRequest.showAllCommits();
40   - })
41 82 },
42 83  
43 84 showState:
... ...
app/assets/stylesheets/sections/merge_requests.scss
... ... @@ -72,3 +72,13 @@
72 72 @extend .primary;
73 73 }
74 74 }
  75 +
  76 +.mr_nav_tabs {
  77 + li {
  78 + a {
  79 + font-weight:bold;
  80 + padding:8px 20px;
  81 + text-align:center;
  82 + }
  83 + }
  84 +}
... ...
app/controllers/merge_requests_controller.rb
... ... @@ -3,6 +3,8 @@ class MergeRequestsController < ApplicationController
3 3 before_filter :project
4 4 before_filter :module_enabled
5 5 before_filter :merge_request, :only => [:edit, :update, :destroy, :show, :commits, :diffs, :automerge, :automerge_check]
  6 + before_filter :validates_merge_request, :only => [:show, :diffs]
  7 + before_filter :define_show_vars, :only => [:show, :diffs]
6 8 layout "project"
7 9  
8 10 # Authorize
... ... @@ -20,6 +22,7 @@ class MergeRequestsController < ApplicationController
20 22 # Allow destroy merge_request
21 23 before_filter :authorize_admin_merge_request!, :only => [:destroy]
22 24  
  25 +
23 26 def index
24 27 @merge_requests = @project.merge_requests
25 28  
... ... @@ -34,20 +37,6 @@ class MergeRequestsController < ApplicationController
34 37 end
35 38  
36 39 def show
37   - # Show git not found page if target branch doesnt exist
38   - return git_not_found! unless @project.repo.heads.map(&:name).include?(@merge_request.target_branch)
39   -
40   - # Show git not found page if source branch doesnt exist
41   - # and there is no saved commits between source & target branch
42   - return git_not_found! if !@project.repo.heads.map(&:name).include?(@merge_request.source_branch) && @merge_request.commits.blank?
43   -
44   - # Build a note object for comment form
45   - @note = @project.notes.new(:noteable => @merge_request)
46   -
47   - # Get commits from repository
48   - # or from cache if already merged
49   - @commits = @merge_request.commits
50   -
51 40 respond_to do |format|
52 41 format.html
53 42 format.js
... ... @@ -142,4 +131,22 @@ class MergeRequestsController < ApplicationController
142 131 def module_enabled
143 132 return render_404 unless @project.merge_requests_enabled
144 133 end
  134 +
  135 + def validates_merge_request
  136 + # Show git not found page if target branch doesnt exist
  137 + return git_not_found! unless @project.repo.heads.map(&:name).include?(@merge_request.target_branch)
  138 +
  139 + # Show git not found page if source branch doesnt exist
  140 + # and there is no saved commits between source & target branch
  141 + return git_not_found! if !@project.repo.heads.map(&:name).include?(@merge_request.source_branch) && @merge_request.commits.blank?
  142 + end
  143 +
  144 + def define_show_vars
  145 + # Build a note object for comment form
  146 + @note = @project.notes.new(:noteable => @merge_request)
  147 +
  148 + # Get commits from repository
  149 + # or from cache if already merged
  150 + @commits = @merge_request.commits
  151 + end
145 152 end
... ...
app/views/commits/_diffs.html.haml
... ... @@ -35,5 +35,4 @@
35 35 .diff_file_content_image{:class => image_diff_class(diff)}
36 36 %img{:src => "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"}
37 37 - else
38   - %p
39   - %center No preview for this file type
  38 + %p.nothing_here_message No preview for this file type
... ...
app/views/merge_requests/_commits.html.haml
... ... @@ -1,28 +0,0 @@
1   -- if @commits.present?
2   - .ui-box
3   - %h5 Commits (#{@commits.count})
4   - .merge-request-commits
5   - - if @commits.count > 8
6   - %ul.first_mr_commits.unstyled
7   - - @commits.first(8).each do |commit|
8   - = render "commits/commit", :commit => commit
9   - %li.bottom
10   - 8 of #{@commits.count} commits displayed.
11   - %strong
12   - %a.mr_show_all_commits Click here to show all
13   - %ul.all_mr_commits.hide.unstyled
14   - - @commits.each do |commit|
15   - = render "commits/commit", :commit => commit
16   -
17   - - else
18   - %ul.unstyled
19   - - @commits.each do |commit|
20   - = render "commits/commit", :commit => commit
21   -
22   -- else
23   - %h5
24   - Nothing to merge from
25   - %span.label #{@merge_request.source_branch}
26   - to
27   - %span.label #{@merge_request.target_branch}
28   - %br
app/views/merge_requests/_diffs.html.haml
... ... @@ -1,3 +0,0 @@
1   -= render "commits/diffs", :diffs => @diffs
2   -- if @diffs.empty?
3   - %p.cgray Nothing to merge
app/views/merge_requests/_how_to_merge.html.haml
... ... @@ -1,25 +0,0 @@
1   -%div#modal_merge_info.modal.hide
2   - .modal-header
3   - %a.close{:href => "#"} ×
4   - %h3 How To Merge
5   - .modal-body
6   - %pre
7   - = preserve do
8   - :erb
9   - git checkout <%= @merge_request.target_branch %>
10   - git fetch origin
11   - git merge origin/<%= @merge_request.source_branch %>
12   - git push origin <%= @merge_request.target_branch %>
13   -
14   -
15   -:javascript
16   - $(function(){
17   - var modal = $('#modal_merge_info').modal({modal: true, show:false});
18   - $('.how_to_merge_link').bind("click", function(){
19   - modal.show();
20   - });
21   - $('.modal-header .close').bind("click", function(){
22   - modal.hide();
23   - })
24   - })
25   -
app/views/merge_requests/_show.html.haml 0 → 100644
... ... @@ -0,0 +1,39 @@
  1 += render "merge_requests/show/mr_title"
  2 += render "merge_requests/show/how_to_merge"
  3 += render "merge_requests/show/mr_box"
  4 += render "merge_requests/show/mr_accept"
  5 += render "merge_requests/show/commits"
  6 +
  7 +- if @commits.present?
  8 + %ul.nav.nav-tabs.mr_nav_tabs
  9 + %li
  10 + = link_to "#notes", "data-url" => project_merge_request_path(@project, @merge_request), :class => "merge-notes-tab tab" do
  11 + %i.icon-comment
  12 + Comments
  13 + %li
  14 + = link_to "#diffs", "data-url" => diffs_project_merge_request_path(@project, @merge_request), :class => "merge-diffs-tab tab" do
  15 + %i.icon-list-alt
  16 + Diff
  17 +
  18 +.merge_request_notes#notes{ :class => (controller.action_name == 'show') ? "" : "hide" }
  19 + = render("notes/notes", :tid => @merge_request.id, :tt => "merge_request")
  20 +.merge-request-diffs
  21 + = render "merge_requests/show/diffs" if @diffs
  22 +.status
  23 +
  24 += render "notes/per_line_form"
  25 +
  26 +:javascript
  27 + $(function(){
  28 + MergeRequest.init({
  29 + url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}",
  30 + check_enable: #{@merge_request.state == MergeRequest::UNCHECKED ? "true" : "false"},
  31 + current_state: "#{@merge_request.human_state}",
  32 + action: "#{controller.action_name}"
  33 + });
  34 +
  35 + $(".edit_merge_request").live("ajax:beforeSend", function() {
  36 + $(this).replaceWith('#{image_tag "ajax_loader.gif"}');
  37 + })
  38 + })
  39 +
... ...
app/views/merge_requests/diffs.html.haml 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 += render "show"
  2 +
... ...
app/views/merge_requests/diffs.js.haml
1 1 :plain
2   - $(".merge-request-diffs").html("#{escape_javascript(render(:partial => "diffs"))}");
  2 + $(".merge-request-diffs").html("#{escape_javascript(render(:partial => "merge_requests/show/diffs"))}");
3 3  
4 4  
... ...
app/views/merge_requests/show.html.haml
1   -%h3
2   - = "Merge Request ##{@merge_request.id}:"
3   - &nbsp;
4   - %span.pretty_label.branch= @merge_request.source_branch
5   - &rarr;
6   - %span.pretty_label.branch= @merge_request.target_branch
7   -
8   - %span.right
9   - - if @merge_request.merged?
10   - %span.btn.small.disabled.padded
11   - %strong
12   - %i.icon-ok
13   - = "MERGED"
14   - - if can?(current_user, :modify_merge_request, @merge_request)
15   - - if @merge_request.open?
16   - = link_to 'Close', project_merge_request_path(@project, @merge_request, :merge_request => {:closed => true }, :status_only => true), :method => :put, :class => "btn small padded danger", :title => "Close merge request"
17   - = link_to edit_project_merge_request_path(@project, @merge_request), :class => "btn small padded" do
18   - %i.icon-edit
19   - Edit
20   -
21   - %br
22   - - if @merge_request.upvotes > 0
23   - .upvotes#upvotes= "+#{pluralize @merge_request.upvotes, 'upvote'}"
24   -
25   -= render "merge_requests/how_to_merge"
26   -.back_link
27   - = link_to project_merge_requests_path(@project) do
28   - &larr; To merge requests
29   -
30   -.main_box
31   - .top_box_content
32   - %h4
33   - - if @merge_request.closed
34   - .alert-message.error.status_info Closed
35   - - else
36   - .alert-message.success.status_info Open
37   - = @merge_request.title
38   -
39   - .middle_box_content
40   - %div
41   - %cite.cgray Created at #{@merge_request.created_at.stamp("Aug 21, 2011")} by
42   - = image_tag gravatar_icon(@merge_request.author_email), :width => 16, :class => "lil_av"
43   - %strong.author= link_to_merge_request_author(@merge_request)
44   -
45   - %cite.cgray and currently assigned to
46   - = image_tag gravatar_icon(@merge_request.assignee_email), :width => 16, :class => "lil_av"
47   - %strong.author= link_to_merge_request_assignee(@merge_request)
48   -
49   -
50   - - if @merge_request.closed
51   - .bottom_box_content
52   - - if @merge_request.merged?
53   - %span
54   - Merged by #{@merge_request.merge_event.author_name}
55   - %small #{time_ago_in_words(@merge_request.merge_event.created_at)} ago.
56   - - elsif @merge_request.closed_event
57   - %span
58   - Closed by #{@merge_request.closed_event.author_name}
59   - %small #{time_ago_in_words(@merge_request.closed_event.created_at)} ago.
60   -
61   -- unless can?(current_user, :accept_mr, @project)
62   - .alert-message
63   - %strong Only masters can accept MR
64   -
65   -
66   -- if @merge_request.open? && @commits.any? && can?(current_user, :accept_mr, @project)
67   - .automerge_widget.can_be_merged{:style => "display:none"}
68   - .alert.alert-success
69   - %span
70   - = form_for [:automerge, @project, @merge_request], :remote => true, :method => :get do |f|
71   - %p
72   - You can accept this request automatically.
73   - If you still want to do it manually -
74   - %strong= link_to "click here", "#", :class => "how_to_merge_link vlink", :title => "How To Merge"
75   - for instructions
76   - .accept_group
77   - = f.submit "Accept Merge Request", :class => "btn small success accept_merge_request"
78   - - unless @project.root_ref? @merge_request.source_branch
79   - .remove_branch_holder
80   - = label_tag :should_remove_source_branch, :class => "checkbox" do
81   - = check_box_tag :should_remove_source_branch
82   - Remove source-branch
83   - .clearfix
84   -
85   -
86   - .automerge_widget.cannot_be_merged{:style => "display:none"}
87   - .alert.alert-info
88   - %span
89   - = link_to "Show how to merge", "#", :class => "how_to_merge_link btn small padded", :title => "How To Merge"
90   - &nbsp;
91   - %strong This request cant be merged with GitLab. You should do it manually
92   -
93   - .automerge_widget.unchecked
94   - .alert-message
95   - %strong
96   - %i.icon-refresh
97   - Checking for ability to automatically merge…
98   -
99   - .automerge_widget.already_cannot_be_merged{:style => "display:none"}
100   - .alert.alert-info
101   - %strong This merge request already can not be merged. Try to reload page.
102   -
103   -= render "merge_requests/commits"
104   -
105   -- unless @commits.empty?
106   - .nav.nav-tabs
107   - %li.active
108   - = link_to "#notes", :class => "merge-notes-tab tab" do
109   - Notes
110   - %li
111   - = link_to "#diffs", "data-url" => diffs_project_merge_request_path(@project, @merge_request), :class => "merge-diffs-tab tab" do
112   - Diff
113   -
114   -
115   -.merge_request_notes#notes= render "notes/notes", :tid => @merge_request.id, :tt => "merge_request"
116   -
117   -.merge-request-diffs
118   -.status
119   -
120   -:javascript
121   - $(function(){
122   - MergeRequest.init({
123   - url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}",
124   - check_enable: #{@merge_request.state == MergeRequest::UNCHECKED ? "true" : "false"},
125   - current_state: "#{@merge_request.human_state}"
126   - });
127   -
128   - $(".edit_merge_request").live("ajax:beforeSend", function() {
129   - $(this).replaceWith('#{image_tag "ajax_loader.gif"}');
130   - })
131   - })
132   -
133   -= render "notes/per_line_form"
134   -
135   -:javascript
136   - $(document).ready(function(){
137   - $(".line_note_link, .line_note_reply_link").live("click", function(e) {
138   - var form = $(".per_line_form");
139   - $(this).parent().parent().after(form);
140   - form.find("#note_line_code").val($(this).attr("line_code"));
141   - form.show();
142   - return false;
143   - });
144   - });
  1 += render "show"
... ...
app/views/merge_requests/show.js.haml 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +:plain
  2 + $(".merge-request-notes").html("#{escape_javascript(render("notes/notes", :tid => @merge_request.id, :tt => "merge_request"))}");
... ...
app/views/merge_requests/show/_commits.html.haml 0 → 100644
... ... @@ -0,0 +1,28 @@
  1 +- if @commits.present?
  2 + .ui-box
  3 + %h5 Commits (#{@commits.count})
  4 + .merge-request-commits
  5 + - if @commits.count > 8
  6 + %ul.first_mr_commits.unstyled
  7 + - @commits.first(8).each do |commit|
  8 + = render "commits/commit", :commit => commit
  9 + %li.bottom
  10 + 8 of #{@commits.count} commits displayed.
  11 + %strong
  12 + %a.mr_show_all_commits Click here to show all
  13 + %ul.all_mr_commits.hide.unstyled
  14 + - @commits.each do |commit|
  15 + = render "commits/commit", :commit => commit
  16 +
  17 + - else
  18 + %ul.unstyled
  19 + - @commits.each do |commit|
  20 + = render "commits/commit", :commit => commit
  21 +
  22 +- else
  23 + %h5
  24 + Nothing to merge from
  25 + %span.label #{@merge_request.source_branch}
  26 + to
  27 + %span.label #{@merge_request.target_branch}
  28 + %br
... ...
app/views/merge_requests/show/_diffs.html.haml 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 += render "commits/diffs", :diffs => @diffs
  2 +- if @diffs.empty?
  3 + %p.cgray Nothing to merge
... ...
app/views/merge_requests/show/_how_to_merge.html.haml 0 → 100644
... ... @@ -0,0 +1,25 @@
  1 +%div#modal_merge_info.modal.hide
  2 + .modal-header
  3 + %a.close{:href => "#"} ×
  4 + %h3 How To Merge
  5 + .modal-body
  6 + %pre
  7 + = preserve do
  8 + :erb
  9 + git checkout <%= @merge_request.target_branch %>
  10 + git fetch origin
  11 + git merge origin/<%= @merge_request.source_branch %>
  12 + git push origin <%= @merge_request.target_branch %>
  13 +
  14 +
  15 +:javascript
  16 + $(function(){
  17 + var modal = $('#modal_merge_info').modal({modal: true, show:false});
  18 + $('.how_to_merge_link').bind("click", function(){
  19 + modal.show();
  20 + });
  21 + $('.modal-header .close').bind("click", function(){
  22 + modal.hide();
  23 + })
  24 + })
  25 +
... ...
app/views/merge_requests/show/_mr_accept.html.haml 0 → 100644
... ... @@ -0,0 +1,42 @@
  1 +- unless can?(current_user, :accept_mr, @project)
  2 + .alert-message
  3 + %strong Only masters can accept MR
  4 +
  5 +
  6 +- if @merge_request.open? && @commits.any? && can?(current_user, :accept_mr, @project)
  7 + .automerge_widget.can_be_merged{:style => "display:none"}
  8 + .alert.alert-success
  9 + %span
  10 + = form_for [:automerge, @project, @merge_request], :remote => true, :method => :get do |f|
  11 + %p
  12 + You can accept this request automatically.
  13 + If you still want to do it manually -
  14 + %strong= link_to "click here", "#", :class => "how_to_merge_link vlink", :title => "How To Merge"
  15 + for instructions
  16 + .accept_group
  17 + = f.submit "Accept Merge Request", :class => "btn small success accept_merge_request"
  18 + - unless @project.root_ref? @merge_request.source_branch
  19 + .remove_branch_holder
  20 + = label_tag :should_remove_source_branch, :class => "checkbox" do
  21 + = check_box_tag :should_remove_source_branch
  22 + Remove source-branch
  23 + .clearfix
  24 +
  25 +
  26 + .automerge_widget.cannot_be_merged{:style => "display:none"}
  27 + .alert.alert-info
  28 + %span
  29 + = link_to "Show how to merge", "#", :class => "how_to_merge_link btn small padded", :title => "How To Merge"
  30 + &nbsp;
  31 + %strong This request cant be merged with GitLab. You should do it manually
  32 +
  33 + .automerge_widget.unchecked
  34 + .alert-message
  35 + %strong
  36 + %i.icon-refresh
  37 + Checking for ability to automatically merge…
  38 +
  39 + .automerge_widget.already_cannot_be_merged{:style => "display:none"}
  40 + .alert.alert-info
  41 + %strong This merge request already can not be merged. Try to reload page.
  42 +
... ...
app/views/merge_requests/show/_mr_box.html.haml 0 → 100644
... ... @@ -0,0 +1,31 @@
  1 +.main_box
  2 + .top_box_content
  3 + %h4
  4 + - if @merge_request.closed
  5 + .alert-message.error.status_info Closed
  6 + - else
  7 + .alert-message.success.status_info Open
  8 + = @merge_request.title
  9 +
  10 + .middle_box_content
  11 + %div
  12 + %cite.cgray Created at #{@merge_request.created_at.stamp("Aug 21, 2011")} by
  13 + = image_tag gravatar_icon(@merge_request.author_email), :width => 16, :class => "lil_av"
  14 + %strong.author= link_to_merge_request_author(@merge_request)
  15 +
  16 + %cite.cgray and currently assigned to
  17 + = image_tag gravatar_icon(@merge_request.assignee_email), :width => 16, :class => "lil_av"
  18 + %strong.author= link_to_merge_request_assignee(@merge_request)
  19 +
  20 +
  21 + - if @merge_request.closed
  22 + .bottom_box_content
  23 + - if @merge_request.merged?
  24 + %span
  25 + Merged by #{@merge_request.merge_event.author_name}
  26 + %small #{time_ago_in_words(@merge_request.merge_event.created_at)} ago.
  27 + - elsif @merge_request.closed_event
  28 + %span
  29 + Closed by #{@merge_request.closed_event.author_name}
  30 + %small #{time_ago_in_words(@merge_request.closed_event.created_at)} ago.
  31 +
... ...
app/views/merge_requests/show/_mr_title.html.haml 0 → 100644
... ... @@ -0,0 +1,28 @@
  1 +%h3
  2 + = "Merge Request ##{@merge_request.id}:"
  3 + &nbsp;
  4 + %span.pretty_label.branch= @merge_request.source_branch
  5 + &rarr;
  6 + %span.pretty_label.branch= @merge_request.target_branch
  7 +
  8 + %span.right
  9 + - if @merge_request.merged?
  10 + %span.btn.small.disabled.padded
  11 + %strong
  12 + %i.icon-ok
  13 + = "MERGED"
  14 + - if can?(current_user, :modify_merge_request, @merge_request)
  15 + - if @merge_request.open?
  16 + = link_to 'Close', project_merge_request_path(@project, @merge_request, :merge_request => {:closed => true }, :status_only => true), :method => :put, :class => "btn small padded danger", :title => "Close merge request"
  17 + = link_to edit_project_merge_request_path(@project, @merge_request), :class => "btn small padded" do
  18 + %i.icon-edit
  19 + Edit
  20 +
  21 + %br
  22 + - if @merge_request.upvotes > 0
  23 + .upvotes#upvotes= "+#{pluralize @merge_request.upvotes, 'upvote'}"
  24 +
  25 +
  26 +.back_link
  27 + = link_to project_merge_requests_path(@project) do
  28 + &larr; To merge requests
... ...
db/schema.rb
... ... @@ -61,8 +61,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120627145613) do
61 61 t.boolean "closed", :default => false, :null => false
62 62 t.datetime "created_at", :null => false
63 63 t.datetime "updated_at", :null => false
64   - t.text "st_commits", :limit => 4294967295
65   - t.text "st_diffs", :limit => 4294967295
  64 + t.text "st_commits", :limit => 2147483647
  65 + t.text "st_diffs", :limit => 2147483647
66 66 t.boolean "merged", :default => false, :null => false
67 67 t.integer "state", :default => 1, :null => false
68 68 end
... ...