Commit cb599a09be48ff7bcf73bbd4ea785c337c45b407

Authored by Dmitriy Zaporozhets
1 parent 432018f8

Allow close of broken MR

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
app/controllers/projects/merge_requests_controller.rb
... ... @@ -79,6 +79,21 @@ class Projects::MergeRequestsController &lt; Projects::ApplicationController
79 79 end
80 80  
81 81 def update
  82 + # If we close MergeRequest we want to ignore validation
  83 + # so we can close broken one (Ex. fork project removed)
  84 + if params[:merge_request] == {"state_event"=>"close"}
  85 + @merge_request.allow_broken = true
  86 +
  87 + if @merge_request.close
  88 + opts = { notice: 'Merge request was successfully closed.' }
  89 + else
  90 + opts = { alert: 'Failed to close merge request.' }
  91 + end
  92 +
  93 + redirect_to [@merge_request.target_project, @merge_request], opts
  94 + return
  95 + end
  96 +
82 97 if @merge_request.update_attributes(params[:merge_request].merge(author_id_of_changes: current_user.id))
83 98 @merge_request.reload_code
84 99 @merge_request.mark_as_unchecked
... ...
app/models/merge_request.rb
... ... @@ -35,6 +35,10 @@ class MergeRequest &lt; ActiveRecord::Base
35 35  
36 36 attr_accessor :should_remove_source_branch
37 37  
  38 + # When this attribute is true some MR validation is ignored
  39 + # It allows us to close or modify broken merge requests
  40 + attr_accessor :allow_broken
  41 +
38 42 state_machine :state, initial: :opened do
39 43 event :close do
40 44 transition [:reopened, :opened] => :closed
... ... @@ -80,7 +84,7 @@ class MergeRequest &lt; ActiveRecord::Base
80 84 serialize :st_commits
81 85 serialize :st_diffs
82 86  
83   - validates :source_project, presence: true
  87 + validates :source_project, presence: true, unless: :allow_broken
84 88 validates :source_branch, presence: true
85 89 validates :target_project, presence: true
86 90 validates :target_branch, presence: true
... ...
app/views/projects/merge_requests/show/_mr_title.html.haml
... ... @@ -24,7 +24,7 @@
24 24 %li= link_to "Email Patches", project_merge_request_path(@project, @merge_request, format: :patch)
25 25 %li= link_to "Plain Diff", project_merge_request_path(@project, @merge_request, format: :diff)
26 26  
27   - = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn grouped btn-close", title: "Close merge request"
  27 + = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: { state_event: :close }), method: :put, class: "btn grouped btn-close", title: "Close merge request"
28 28  
29 29 = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn grouped", id:"edit_merge_request" do
30 30 %i.icon-edit
... ...