Commit 0a6b64e6a9c5858801a7af2c408416b1c98de471
1 parent
d40b9ce2
Exists in
master
and in
4 other branches
MR: Handle broken diff ex. in case its too huge
Showing
3 changed files
with
38 additions
and
19 deletions
Show diff stats
app/models/merge_request.rb
| ... | ... | @@ -3,6 +3,8 @@ require File.join(Rails.root, "app/models/commit") |
| 3 | 3 | class MergeRequest < ActiveRecord::Base |
| 4 | 4 | include Upvote |
| 5 | 5 | |
| 6 | + BROKEN_DIFF = "--broken-diff" | |
| 7 | + | |
| 6 | 8 | UNCHECKED = 1 |
| 7 | 9 | CAN_BE_MERGED = 2 |
| 8 | 10 | CANNOT_BE_MERGED = 3 |
| ... | ... | @@ -108,14 +110,25 @@ class MergeRequest < ActiveRecord::Base |
| 108 | 110 | def reloaded_diffs |
| 109 | 111 | if open? && unmerged_diffs.any? |
| 110 | 112 | self.st_diffs = unmerged_diffs |
| 111 | - save | |
| 113 | + self.save | |
| 112 | 114 | end |
| 113 | - diffs | |
| 115 | + | |
| 116 | + rescue Grit::Git::GitTimeout | |
| 117 | + self.st_diffs = [BROKEN_DIFF] | |
| 118 | + self.save | |
| 119 | + end | |
| 120 | + | |
| 121 | + def broken_diffs? | |
| 122 | + diffs == [BROKEN_DIFF] | |
| 123 | + end | |
| 124 | + | |
| 125 | + def valid_diffs? | |
| 126 | + !broken_diffs? | |
| 114 | 127 | end |
| 115 | 128 | |
| 116 | 129 | def unmerged_diffs |
| 117 | 130 | commits = project.repo.commits_between(target_branch, source_branch).map {|c| Commit.new(c)} |
| 118 | - diffs = project.repo.diff(commits.first.prev_commit.id, commits.last.id) rescue [] | |
| 131 | + diffs = project.repo.diff(commits.first.prev_commit.id, commits.last.id) | |
| 119 | 132 | end |
| 120 | 133 | |
| 121 | 134 | def last_commit | ... | ... |
app/views/layouts/_project_menu.html.haml
| ... | ... | @@ -13,24 +13,25 @@ |
| 13 | 13 | %li{:class => tab_class(:network)} |
| 14 | 14 | = link_to "Network", graph_project_path(@project) |
| 15 | 15 | |
| 16 | - - if @project.issues_enabled | |
| 17 | - %li{:class => tab_class(:issues)} | |
| 18 | - = link_to project_issues_filter_path(@project) do | |
| 19 | - Issues | |
| 20 | - %span.count= @project.issues.opened.count | |
| 16 | + - if @project.issues_enabled | |
| 17 | + %li{:class => tab_class(:issues)} | |
| 18 | + = link_to project_issues_filter_path(@project) do | |
| 19 | + Issues | |
| 20 | + %span.count= @project.issues.opened.count | |
| 21 | 21 | |
| 22 | + - if @project.repo_exists? | |
| 22 | 23 | - if @project.merge_requests_enabled |
| 23 | 24 | %li{:class => tab_class(:merge_requests)} |
| 24 | 25 | = link_to project_merge_requests_path(@project) do |
| 25 | 26 | Merge Requests |
| 26 | 27 | %span.count= @project.merge_requests.opened.count |
| 27 | 28 | |
| 28 | - - if @project.wall_enabled | |
| 29 | - %li{:class => tab_class(:wall)} | |
| 30 | - = link_to wall_project_path(@project) do | |
| 31 | - Wall | |
| 29 | + - if @project.wall_enabled | |
| 30 | + %li{:class => tab_class(:wall)} | |
| 31 | + = link_to wall_project_path(@project) do | |
| 32 | + Wall | |
| 32 | 33 | |
| 33 | - - if @project.wiki_enabled | |
| 34 | - %li{:class => tab_class(:wiki)} | |
| 35 | - = link_to project_wiki_path(@project, :index) do | |
| 36 | - Wiki | |
| 34 | + - if @project.wiki_enabled | |
| 35 | + %li{:class => tab_class(:wiki)} | |
| 36 | + = link_to project_wiki_path(@project, :index) do | |
| 37 | + Wiki | ... | ... |
app/views/merge_requests/show/_diffs.html.haml
| 1 | -= render "commits/diffs", :diffs => @diffs | |
| 2 | -- if @diffs.empty? | |
| 3 | - %p.cgray Nothing to merge | |
| 1 | +- if @merge_request.valid_diffs? | |
| 2 | + = render "commits/diffs", :diffs => @diffs | |
| 3 | +- elsif @merge_request.broken_diffs? | |
| 4 | + %h4.nothing_here_message | |
| 5 | + Can't load diff. | |
| 6 | + You can #{link_to "download MR patch", raw_project_merge_request_path(@project, @merge_request), :class => "vlink"} instead. | |
| 7 | +- else | |
| 8 | + %h4.nothing_here_message Nothing to merge | ... | ... |