From 86676476e6a8a23786ccbc927ad24140a47e96af Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 6 Apr 2012 01:00:15 +0300 Subject: [PATCH] Handling big commits & big diff --- app/assets/javascripts/application.js | 5 +++ app/assets/stylesheets/common.scss | 8 +++- app/controllers/commits_controller.rb | 4 ++ app/views/commits/_diffs.html.haml | 60 ++++++++++++++++---------- app/views/commits/_text_file.html.haml | 6 ++- app/views/commits/show.html.haml | 2 - db/schema.rb | 53 ++++++++++++----------- 7 files changed, 85 insertions(+), 53 deletions(-) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 042bca91..f5ce84df 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -74,3 +74,8 @@ function resetMenu() { function slugify(text) { return text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase(); } + +function showDiff(link) { + $(link).next('table').show(); + $(link).remove(); +} diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index b44e6c79..208a8b94 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -17,9 +17,15 @@ a { &.lined { text-decoration:underlined; } + &.supp_diff_link { + text-align:center; + padding:20px 0; + background:#f1f1f1; + width:100%; + float:left; + } } - .btn { background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f1f1), color-stop(25%, #f1f1f1), to(#e6e6e6)); background-image: -webkit-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); diff --git a/app/controllers/commits_controller.rb b/app/controllers/commits_controller.rb index 486e1988..9063fbf8 100644 --- a/app/controllers/commits_controller.rb +++ b/app/controllers/commits_controller.rb @@ -34,6 +34,10 @@ class CommitsController < ApplicationController @line_notes = project.commit_line_notes(@commit) @notes_count = @line_notes.count + project.commit_notes(@commit).count + + if @commit.diffs.size > 200 && !params[:force_show_diff] + @suppress_diff = true + end end def compare diff --git a/app/views/commits/_diffs.html.haml b/app/views/commits/_diffs.html.haml index 29eae1c4..96aed24c 100644 --- a/app/views/commits/_diffs.html.haml +++ b/app/views/commits/_diffs.html.haml @@ -1,26 +1,40 @@ +- if @suppress_diff + .alert-message.block-message + %p + %strong Warning! Large commit with more then 200 files changed. + %p To prevent performance issue we rejected diff information. + %p + But if you still want to see diff + = link_to "click this link", project_commit_path(@project, @commit.id, :force_show_diff => true), :class => "dark" + + +%p.cgray + Showing #{pluralize(diffs.count, "changed file")} .file_stats = render "commits/diff_head", :diffs => diffs - -- diffs.each_with_index do |diff, i| - - next if diff.diff.empty? - - file = (@commit.tree / diff.b_path) - - file = (@commit.prev_commit.tree / diff.a_path) unless file - - next unless file - .diff_file - .diff_file_header - - if diff.deleted_file - %strong{:id => "#{diff.a_path}"}= diff.a_path - - else - = link_to tree_file_project_ref_path(@project, @commit.id, diff.b_path) do - %strong{:id => "#{diff.b_path}"}= diff.b_path - %br/ - .diff_file_content - - if file.text? - = render "commits/text_file", :diff => diff, :index => i - - elsif file.image? - .diff_file_content_image - %img{:src => "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"} - - else - %p - %center No preview for this file type + + +- unless @suppress_diff + - diffs.each_with_index do |diff, i| + - next if diff.diff.empty? + - file = (@commit.tree / diff.b_path) + - file = (@commit.prev_commit.tree / diff.a_path) unless file + - next unless file + .diff_file + .diff_file_header + - if diff.deleted_file + %strong{:id => "#{diff.a_path}"}= diff.a_path + - else + = link_to tree_file_project_ref_path(@project, @commit.id, diff.b_path) do + %strong{:id => "#{diff.b_path}"}= diff.b_path + %br/ + .diff_file_content + - if file.text? + = render "commits/text_file", :diff => diff, :index => i + - elsif file.image? + .diff_file_content_image + %img{:src => "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"} + - else + %p + %center No preview for this file type diff --git a/app/views/commits/_text_file.html.haml b/app/views/commits/_text_file.html.haml index 441bdf2c..ec5e712c 100644 --- a/app/views/commits/_text_file.html.haml +++ b/app/views/commits/_text_file.html.haml @@ -1,4 +1,8 @@ -%table +- too_big = max_lines = diff.diff.lines.count > 1000 +- if too_big + = link_to_function "Diff suppressed. Click to show", "showDiff(this)", :class => "supp_diff_link" + +%table{:class => "#{'hide' if too_big}"} - each_diff_line(diff.diff.lines.to_a, index) do |line, type, line_code, line_new, line_old| %tr.line_holder - if type == "match" diff --git a/app/views/commits/show.html.haml b/app/views/commits/show.html.haml index fabdb700..dc63e0e8 100644 --- a/app/views/commits/show.html.haml +++ b/app/views/commits/show.html.haml @@ -21,8 +21,6 @@ %pre.commit_message = commit_msg_with_link_to_issues(@project, @commit.safe_message) %br -%p.cgray - Showing #{pluralize(@commit.diffs.count, "changed file")} = render "commits/diffs", :diffs => @commit.diffs = render "notes/notes", :tid => @commit.id, :tt => "commit" = render "notes/per_line_form" diff --git a/db/schema.rb b/db/schema.rb index 98993a9a..40482275 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120323221339) do +ActiveRecord::Schema.define(:version => 20120405211750) do create_table "events", :force => true do |t| t.string "target_type" @@ -30,8 +30,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do t.integer "assignee_id" t.integer "author_id" t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.boolean "closed", :default => false, :null => false t.integer "position", :default => 0 t.boolean "critical", :default => false, :null => false @@ -43,8 +43,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do create_table "keys", :force => true do |t| t.integer "user_id" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.text "key" t.string "title" t.string "identifier" @@ -52,18 +52,19 @@ ActiveRecord::Schema.define(:version => 20120323221339) do end create_table "merge_requests", :force => true do |t| - t.string "target_branch", :null => false - t.string "source_branch", :null => false - t.integer "project_id", :null => false + t.string "target_branch", :null => false + t.string "source_branch", :null => false + t.integer "project_id", :null => false t.integer "author_id" t.integer "assignee_id" t.string "title" - t.boolean "closed", :default => false, :null => false - t.datetime "created_at" - t.datetime "updated_at" - t.text "st_commits" - t.text "st_diffs" - t.boolean "merged", :default => false, :null => false + t.boolean "closed", :default => false, :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.text "st_commits", :limit => 2147483647 + t.text "st_diffs", :limit => 2147483647 + t.boolean "merged", :default => false, :null => false + t.boolean "auto_merge", :default => true, :null => false end add_index "merge_requests", ["project_id"], :name => "index_merge_requests_on_project_id" @@ -73,8 +74,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do t.string "noteable_id" t.string "noteable_type" t.integer "author_id" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.integer "project_id" t.string "attachment" t.string "line_code" @@ -87,8 +88,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do t.string "name" t.string "path" t.text "description" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.boolean "private_flag", :default => true, :null => false t.string "code" t.integer "owner_id" @@ -111,8 +112,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do t.text "content" t.integer "author_id", :null => false t.integer "project_id", :null => false - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.string "file_name" t.datetime "expires_at" end @@ -145,8 +146,8 @@ ActiveRecord::Schema.define(:version => 20120323221339) do t.datetime "last_sign_in_at" t.string "current_sign_in_ip" t.string "last_sign_in_ip" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.string "name" t.boolean "admin", :default => false, :null => false t.integer "projects_limit", :default => 10 @@ -165,16 +166,16 @@ ActiveRecord::Schema.define(:version => 20120323221339) do create_table "users_projects", :force => true do |t| t.integer "user_id", :null => false t.integer "project_id", :null => false - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.integer "project_access", :default => 0, :null => false end create_table "web_hooks", :force => true do |t| t.string "url" t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false end create_table "wikis", :force => true do |t|