end
def update
+ # If we close MergeRequest we want to ignore validation
+ # so we can close broken one (Ex. fork project removed)
+ if params[:merge_request] == {"state_event"=>"close"}
+ @merge_request.allow_broken = true
+
+ if @merge_request.close
+ opts = { notice: 'Merge request was successfully closed.' }
+ else
+ opts = { alert: 'Failed to close merge request.' }
+ end
+
+ redirect_to [@merge_request.target_project, @merge_request], opts
+ return
+ end
+
if @merge_request.update_attributes(params[:merge_request].merge(author_id_of_changes: current_user.id))
@merge_request.reload_code
@merge_request.mark_as_unchecked
attr_accessor :should_remove_source_branch
+ # When this attribute is true some MR validation is ignored
+ # It allows us to close or modify broken merge requests
+ attr_accessor :allow_broken
+
state_machine :state, initial: :opened do
event :close do
transition [:reopened, :opened] => :closed
serialize :st_commits
serialize :st_diffs
- validates :source_project, presence: true
+ validates :source_project, presence: true, unless: :allow_broken
validates :source_branch, presence: true
validates :target_project, presence: true
validates :target_branch, presence: true
%li= link_to "Email Patches", project_merge_request_path(@project, @merge_request, format: :patch)
%li= link_to "Plain Diff", project_merge_request_path(@project, @merge_request, format: :diff)
- = 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"
+ = 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"
= link_to edit_project_merge_request_path(@project, @merge_request), class: "btn grouped", id:"edit_merge_request" do
%i.icon-edit