Commit 86676476e6a8a23786ccbc927ad24140a47e96af

Authored by Dmitriy Zaporozhets
1 parent 17a88bb6

Handling big commits & big diff

app/assets/javascripts/application.js
@@ -74,3 +74,8 @@ function resetMenu() { @@ -74,3 +74,8 @@ function resetMenu() {
74 function slugify(text) { 74 function slugify(text) {
75 return text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase(); 75 return text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase();
76 } 76 }
  77 +
  78 +function showDiff(link) {
  79 + $(link).next('table').show();
  80 + $(link).remove();
  81 +}
app/assets/stylesheets/common.scss
@@ -17,9 +17,15 @@ a { @@ -17,9 +17,15 @@ a {
17 &.lined { 17 &.lined {
18 text-decoration:underlined; 18 text-decoration:underlined;
19 } 19 }
  20 + &.supp_diff_link {
  21 + text-align:center;
  22 + padding:20px 0;
  23 + background:#f1f1f1;
  24 + width:100%;
  25 + float:left;
  26 + }
20 } 27 }
21 28
22 -  
23 .btn { 29 .btn {
24 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f1f1), color-stop(25%, #f1f1f1), to(#e6e6e6)); 30 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f1f1), color-stop(25%, #f1f1f1), to(#e6e6e6));
25 background-image: -webkit-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); 31 background-image: -webkit-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6);
app/controllers/commits_controller.rb
@@ -34,6 +34,10 @@ class CommitsController < ApplicationController @@ -34,6 +34,10 @@ class CommitsController < ApplicationController
34 @line_notes = project.commit_line_notes(@commit) 34 @line_notes = project.commit_line_notes(@commit)
35 35
36 @notes_count = @line_notes.count + project.commit_notes(@commit).count 36 @notes_count = @line_notes.count + project.commit_notes(@commit).count
  37 +
  38 + if @commit.diffs.size > 200 && !params[:force_show_diff]
  39 + @suppress_diff = true
  40 + end
37 end 41 end
38 42
39 def compare 43 def compare
app/views/commits/_diffs.html.haml
  1 +- if @suppress_diff
  2 + .alert-message.block-message
  3 + %p
  4 + %strong Warning! Large commit with more then 200 files changed.
  5 + %p To prevent performance issue we rejected diff information.
  6 + %p
  7 + But if you still want to see diff
  8 + = link_to "click this link", project_commit_path(@project, @commit.id, :force_show_diff => true), :class => "dark"
  9 +
  10 +
  11 +%p.cgray
  12 + Showing #{pluralize(diffs.count, "changed file")}
1 .file_stats 13 .file_stats
2 = render "commits/diff_head", :diffs => diffs 14 = render "commits/diff_head", :diffs => diffs
3 -  
4 -- diffs.each_with_index do |diff, i|  
5 - - next if diff.diff.empty?  
6 - - file = (@commit.tree / diff.b_path)  
7 - - file = (@commit.prev_commit.tree / diff.a_path) unless file  
8 - - next unless file  
9 - .diff_file  
10 - .diff_file_header  
11 - - if diff.deleted_file  
12 - %strong{:id => "#{diff.a_path}"}= diff.a_path  
13 - - else  
14 - = link_to tree_file_project_ref_path(@project, @commit.id, diff.b_path) do  
15 - %strong{:id => "#{diff.b_path}"}= diff.b_path  
16 - %br/  
17 - .diff_file_content  
18 - - if file.text?  
19 - = render "commits/text_file", :diff => diff, :index => i  
20 - - elsif file.image?  
21 - .diff_file_content_image  
22 - %img{:src => "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"}  
23 - - else  
24 - %p  
25 - %center No preview for this file type 15 +
  16 +
  17 +- unless @suppress_diff
  18 + - diffs.each_with_index do |diff, i|
  19 + - next if diff.diff.empty?
  20 + - file = (@commit.tree / diff.b_path)
  21 + - file = (@commit.prev_commit.tree / diff.a_path) unless file
  22 + - next unless file
  23 + .diff_file
  24 + .diff_file_header
  25 + - if diff.deleted_file
  26 + %strong{:id => "#{diff.a_path}"}= diff.a_path
  27 + - else
  28 + = link_to tree_file_project_ref_path(@project, @commit.id, diff.b_path) do
  29 + %strong{:id => "#{diff.b_path}"}= diff.b_path
  30 + %br/
  31 + .diff_file_content
  32 + - if file.text?
  33 + = render "commits/text_file", :diff => diff, :index => i
  34 + - elsif file.image?
  35 + .diff_file_content_image
  36 + %img{:src => "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"}
  37 + - else
  38 + %p
  39 + %center No preview for this file type
26 40
app/views/commits/_text_file.html.haml
1 -%table 1 +- too_big = max_lines = diff.diff.lines.count > 1000
  2 +- if too_big
  3 + = link_to_function "Diff suppressed. Click to show", "showDiff(this)", :class => "supp_diff_link"
  4 +
  5 +%table{:class => "#{'hide' if too_big}"}
2 - each_diff_line(diff.diff.lines.to_a, index) do |line, type, line_code, line_new, line_old| 6 - each_diff_line(diff.diff.lines.to_a, index) do |line, type, line_code, line_new, line_old|
3 %tr.line_holder 7 %tr.line_holder
4 - if type == "match" 8 - if type == "match"
app/views/commits/show.html.haml
@@ -21,8 +21,6 @@ @@ -21,8 +21,6 @@
21 %pre.commit_message 21 %pre.commit_message
22 = commit_msg_with_link_to_issues(@project, @commit.safe_message) 22 = commit_msg_with_link_to_issues(@project, @commit.safe_message)
23 %br 23 %br
24 -%p.cgray  
25 - Showing #{pluralize(@commit.diffs.count, "changed file")}  
26 = render "commits/diffs", :diffs => @commit.diffs 24 = render "commits/diffs", :diffs => @commit.diffs
27 = render "notes/notes", :tid => @commit.id, :tt => "commit" 25 = render "notes/notes", :tid => @commit.id, :tt => "commit"
28 = render "notes/per_line_form" 26 = render "notes/per_line_form"
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 # 11 #
12 # It's strongly recommended to check this file into your version control system. 12 # It's strongly recommended to check this file into your version control system.
13 13
14 -ActiveRecord::Schema.define(:version => 20120323221339) do 14 +ActiveRecord::Schema.define(:version => 20120405211750) do
15 15
16 create_table "events", :force => true do |t| 16 create_table "events", :force => true do |t|
17 t.string "target_type" 17 t.string "target_type"
@@ -30,8 +30,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do @@ -30,8 +30,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do
30 t.integer "assignee_id" 30 t.integer "assignee_id"
31 t.integer "author_id" 31 t.integer "author_id"
32 t.integer "project_id" 32 t.integer "project_id"
33 - t.datetime "created_at"  
34 - t.datetime "updated_at" 33 + t.datetime "created_at", :null => false
  34 + t.datetime "updated_at", :null => false
35 t.boolean "closed", :default => false, :null => false 35 t.boolean "closed", :default => false, :null => false
36 t.integer "position", :default => 0 36 t.integer "position", :default => 0
37 t.boolean "critical", :default => false, :null => false 37 t.boolean "critical", :default => false, :null => false
@@ -43,8 +43,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do @@ -43,8 +43,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do
43 43
44 create_table "keys", :force => true do |t| 44 create_table "keys", :force => true do |t|
45 t.integer "user_id" 45 t.integer "user_id"
46 - t.datetime "created_at"  
47 - t.datetime "updated_at" 46 + t.datetime "created_at", :null => false
  47 + t.datetime "updated_at", :null => false
48 t.text "key" 48 t.text "key"
49 t.string "title" 49 t.string "title"
50 t.string "identifier" 50 t.string "identifier"
@@ -52,18 +52,19 @@ ActiveRecord::Schema.define(:version => 20120323221339) do @@ -52,18 +52,19 @@ ActiveRecord::Schema.define(:version => 20120323221339) do
52 end 52 end
53 53
54 create_table "merge_requests", :force => true do |t| 54 create_table "merge_requests", :force => true do |t|
55 - t.string "target_branch", :null => false  
56 - t.string "source_branch", :null => false  
57 - t.integer "project_id", :null => false 55 + t.string "target_branch", :null => false
  56 + t.string "source_branch", :null => false
  57 + t.integer "project_id", :null => false
58 t.integer "author_id" 58 t.integer "author_id"
59 t.integer "assignee_id" 59 t.integer "assignee_id"
60 t.string "title" 60 t.string "title"
61 - t.boolean "closed", :default => false, :null => false  
62 - t.datetime "created_at"  
63 - t.datetime "updated_at"  
64 - t.text "st_commits"  
65 - t.text "st_diffs"  
66 - t.boolean "merged", :default => false, :null => false 61 + t.boolean "closed", :default => false, :null => false
  62 + t.datetime "created_at", :null => false
  63 + t.datetime "updated_at", :null => false
  64 + t.text "st_commits", :limit => 2147483647
  65 + t.text "st_diffs", :limit => 2147483647
  66 + t.boolean "merged", :default => false, :null => false
  67 + t.boolean "auto_merge", :default => true, :null => false
67 end 68 end
68 69
69 add_index "merge_requests", ["project_id"], :name => "index_merge_requests_on_project_id" 70 add_index "merge_requests", ["project_id"], :name => "index_merge_requests_on_project_id"
@@ -73,8 +74,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do @@ -73,8 +74,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do
73 t.string "noteable_id" 74 t.string "noteable_id"
74 t.string "noteable_type" 75 t.string "noteable_type"
75 t.integer "author_id" 76 t.integer "author_id"
76 - t.datetime "created_at"  
77 - t.datetime "updated_at" 77 + t.datetime "created_at", :null => false
  78 + t.datetime "updated_at", :null => false
78 t.integer "project_id" 79 t.integer "project_id"
79 t.string "attachment" 80 t.string "attachment"
80 t.string "line_code" 81 t.string "line_code"
@@ -87,8 +88,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do @@ -87,8 +88,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do
87 t.string "name" 88 t.string "name"
88 t.string "path" 89 t.string "path"
89 t.text "description" 90 t.text "description"
90 - t.datetime "created_at"  
91 - t.datetime "updated_at" 91 + t.datetime "created_at", :null => false
  92 + t.datetime "updated_at", :null => false
92 t.boolean "private_flag", :default => true, :null => false 93 t.boolean "private_flag", :default => true, :null => false
93 t.string "code" 94 t.string "code"
94 t.integer "owner_id" 95 t.integer "owner_id"
@@ -111,8 +112,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do @@ -111,8 +112,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do
111 t.text "content" 112 t.text "content"
112 t.integer "author_id", :null => false 113 t.integer "author_id", :null => false
113 t.integer "project_id", :null => false 114 t.integer "project_id", :null => false
114 - t.datetime "created_at"  
115 - t.datetime "updated_at" 115 + t.datetime "created_at", :null => false
  116 + t.datetime "updated_at", :null => false
116 t.string "file_name" 117 t.string "file_name"
117 t.datetime "expires_at" 118 t.datetime "expires_at"
118 end 119 end
@@ -145,8 +146,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do @@ -145,8 +146,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do
145 t.datetime "last_sign_in_at" 146 t.datetime "last_sign_in_at"
146 t.string "current_sign_in_ip" 147 t.string "current_sign_in_ip"
147 t.string "last_sign_in_ip" 148 t.string "last_sign_in_ip"
148 - t.datetime "created_at"  
149 - t.datetime "updated_at" 149 + t.datetime "created_at", :null => false
  150 + t.datetime "updated_at", :null => false
150 t.string "name" 151 t.string "name"
151 t.boolean "admin", :default => false, :null => false 152 t.boolean "admin", :default => false, :null => false
152 t.integer "projects_limit", :default => 10 153 t.integer "projects_limit", :default => 10
@@ -165,16 +166,16 @@ ActiveRecord::Schema.define(:version => 20120323221339) do @@ -165,16 +166,16 @@ ActiveRecord::Schema.define(:version => 20120323221339) do
165 create_table "users_projects", :force => true do |t| 166 create_table "users_projects", :force => true do |t|
166 t.integer "user_id", :null => false 167 t.integer "user_id", :null => false
167 t.integer "project_id", :null => false 168 t.integer "project_id", :null => false
168 - t.datetime "created_at"  
169 - t.datetime "updated_at" 169 + t.datetime "created_at", :null => false
  170 + t.datetime "updated_at", :null => false
170 t.integer "project_access", :default => 0, :null => false 171 t.integer "project_access", :default => 0, :null => false
171 end 172 end
172 173
173 create_table "web_hooks", :force => true do |t| 174 create_table "web_hooks", :force => true do |t|
174 t.string "url" 175 t.string "url"
175 t.integer "project_id" 176 t.integer "project_id"
176 - t.datetime "created_at"  
177 - t.datetime "updated_at" 177 + t.datetime "created_at", :null => false
  178 + t.datetime "updated_at", :null => false
178 end 179 end
179 180
180 create_table "wikis", :force => true do |t| 181 create_table "wikis", :force => true do |t|