Commit 87837e54b4e465b58e03d9b207ef222949b66837

Authored by Dmitriy Zaporozhets
1 parent 33381463

Feature: reopen closed merge request

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>

Conflicts:
	app/views/projects/merge_requests/_show.html.haml
	app/views/projects/merge_requests/show/_mr_title.html.haml
app/assets/stylesheets/sections/merge_requests.scss
@@ -91,6 +91,7 @@ @@ -91,6 +91,7 @@
91 } 91 }
92 92
93 // hide mr close link for inline diff comment form 93 // hide mr close link for inline diff comment form
94 -.diff-file .close-mr-link {  
95 - display: none; 94 +.diff-file .close-mr-link,
  95 +.diff-file .reopen-mr-link {
  96 + display: none;
96 } 97 }
app/controllers/projects/merge_requests_controller.rb
@@ -131,7 +131,7 @@ class Projects::MergeRequestsController &lt; Projects::ApplicationController @@ -131,7 +131,7 @@ class Projects::MergeRequestsController &lt; Projects::ApplicationController
131 def automerge 131 def automerge
132 return access_denied! unless allowed_to_merge? 132 return access_denied! unless allowed_to_merge?
133 133
134 - if @merge_request.opened? && @merge_request.can_be_merged? 134 + if @merge_request.open? && @merge_request.can_be_merged?
135 @merge_request.should_remove_source_branch = params[:should_remove_source_branch] 135 @merge_request.should_remove_source_branch = params[:should_remove_source_branch]
136 @merge_request.automerge!(current_user, params[:merge_commit_message]) 136 @merge_request.automerge!(current_user, params[:merge_commit_message])
137 @status = true 137 @status = true
@@ -226,7 +226,7 @@ class Projects::MergeRequestsController &lt; Projects::ApplicationController @@ -226,7 +226,7 @@ class Projects::MergeRequestsController &lt; Projects::ApplicationController
226 226
227 @merge_request_diff = @merge_request.merge_request_diff 227 @merge_request_diff = @merge_request.merge_request_diff
228 @allowed_to_merge = allowed_to_merge? 228 @allowed_to_merge = allowed_to_merge?
229 - @show_merge_controls = @merge_request.opened? && @commits.any? && @allowed_to_merge 229 + @show_merge_controls = @merge_request.open? && @commits.any? && @allowed_to_merge
230 end 230 end
231 231
232 def allowed_to_merge? 232 def allowed_to_merge?
app/models/concerns/issuable.rb
@@ -23,7 +23,8 @@ module Issuable @@ -23,7 +23,8 @@ module Issuable
23 scope :assigned, -> { where("assignee_id IS NOT NULL") } 23 scope :assigned, -> { where("assignee_id IS NOT NULL") }
24 scope :unassigned, -> { where("assignee_id IS NULL") } 24 scope :unassigned, -> { where("assignee_id IS NULL") }
25 scope :of_projects, ->(ids) { where(project_id: ids) } 25 scope :of_projects, ->(ids) { where(project_id: ids) }
26 - 26 + scope :opened, -> { with_state(:opened, :reopened) }
  27 + scope :closed, -> { with_state(:closed) }
27 28
28 delegate :name, 29 delegate :name,
29 :email, 30 :email,
app/models/issue.rb
@@ -28,8 +28,6 @@ class Issue &lt; ActiveRecord::Base @@ -28,8 +28,6 @@ class Issue &lt; ActiveRecord::Base
28 28
29 scope :of_group, ->(group) { where(project_id: group.project_ids) } 29 scope :of_group, ->(group) { where(project_id: group.project_ids) }
30 scope :of_user_team, ->(team) { where(project_id: team.project_ids, assignee_id: team.member_ids) } 30 scope :of_user_team, ->(team) { where(project_id: team.project_ids, assignee_id: team.member_ids) }
31 - scope :opened, -> { with_state(:opened, :reopened) }  
32 - scope :closed, -> { with_state(:closed) }  
33 31
34 attr_accessible :title, :assignee_id, :position, :description, 32 attr_accessible :title, :assignee_id, :position, :description,
35 :milestone_id, :label_list, :author_id_of_changes, 33 :milestone_id, :label_list, :author_id_of_changes,
@@ -50,9 +48,7 @@ class Issue &lt; ActiveRecord::Base @@ -50,9 +48,7 @@ class Issue &lt; ActiveRecord::Base
50 end 48 end
51 49
52 state :opened 50 state :opened
53 -  
54 state :reopened 51 state :reopened
55 -  
56 state :closed 52 state :closed
57 end 53 end
58 54
app/models/merge_request.rb
@@ -100,8 +100,6 @@ class MergeRequest &lt; ActiveRecord::Base @@ -100,8 +100,6 @@ class MergeRequest &lt; ActiveRecord::Base
100 100
101 scope :of_group, ->(group) { where("source_project_id in (:group_project_ids) OR target_project_id in (:group_project_ids)", group_project_ids: group.project_ids) } 101 scope :of_group, ->(group) { where("source_project_id in (:group_project_ids) OR target_project_id in (:group_project_ids)", group_project_ids: group.project_ids) }
102 scope :of_user_team, ->(team) { where("(source_project_id in (:team_project_ids) OR target_project_id in (:team_project_ids) AND assignee_id in (:team_member_ids))", team_project_ids: team.project_ids, team_member_ids: team.member_ids) } 102 scope :of_user_team, ->(team) { where("(source_project_id in (:team_project_ids) OR target_project_id in (:team_project_ids) AND assignee_id in (:team_member_ids))", team_project_ids: team.project_ids, team_member_ids: team.member_ids) }
103 - scope :opened, -> { with_state(:opened) }  
104 - scope :closed, -> { with_state(:closed) }  
105 scope :merged, -> { with_state(:merged) } 103 scope :merged, -> { with_state(:merged) }
106 scope :by_branch, ->(branch_name) { where("(source_branch LIKE :branch) OR (target_branch LIKE :branch)", branch: branch_name) } 104 scope :by_branch, ->(branch_name) { where("(source_branch LIKE :branch) OR (target_branch LIKE :branch)", branch: branch_name) }
107 scope :cared, ->(user) { where('assignee_id = :user OR author_id = :user', user: user.id) } 105 scope :cared, ->(user) { where('assignee_id = :user OR author_id = :user', user: user.id) }
@@ -160,6 +158,10 @@ class MergeRequest &lt; ActiveRecord::Base @@ -160,6 +158,10 @@ class MergeRequest &lt; ActiveRecord::Base
160 MergeRequests::AutoMergeService.new.execute(self, current_user, commit_message) 158 MergeRequests::AutoMergeService.new.execute(self, current_user, commit_message)
161 end 159 end
162 160
  161 + def open?
  162 + opened? || reopened?
  163 + end
  164 +
163 def mr_and_commit_notes 165 def mr_and_commit_notes
164 # Fetch comments only from last 100 commits 166 # Fetch comments only from last 100 commits
165 commits_for_notes_limit = 100 167 commits_for_notes_limit = 100
app/observers/merge_request_observer.rb
@@ -22,6 +22,8 @@ class MergeRequestObserver &lt; ActivityObserver @@ -22,6 +22,8 @@ class MergeRequestObserver &lt; ActivityObserver
22 create_event(merge_request, Event::REOPENED) 22 create_event(merge_request, Event::REOPENED)
23 create_note(merge_request) 23 create_note(merge_request)
24 execute_hooks(merge_request) 24 execute_hooks(merge_request)
  25 + merge_request.reload_code
  26 + merge_request.mark_as_unchecked
25 end 27 end
26 28
27 def after_update(merge_request) 29 def after_update(merge_request)
app/views/projects/merge_requests/_show.html.haml
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 = render "projects/merge_requests/show/mr_title" 2 = render "projects/merge_requests/show/mr_title"
3 = render "projects/merge_requests/show/how_to_merge" 3 = render "projects/merge_requests/show/how_to_merge"
4 = render "projects/merge_requests/show/mr_box" 4 = render "projects/merge_requests/show/mr_box"
5 - - if @merge_request.opened? 5 + - if @merge_request.open?
6 - if @merge_request.source_branch_exists? && @merge_request.target_branch_exists? 6 - if @merge_request.source_branch_exists? && @merge_request.target_branch_exists?
7 = render "projects/merge_requests/show/mr_accept" 7 = render "projects/merge_requests/show/mr_accept"
8 - else 8 - else
@@ -26,7 +26,8 @@ @@ -26,7 +26,8 @@
26 - if can?(current_user, :modify_merge_request, @merge_request) 26 - if can?(current_user, :modify_merge_request, @merge_request)
27 - unless @merge_request.closed? || @merge_request.merged? 27 - unless @merge_request.closed? || @merge_request.merged?
28 = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn grouped btn-close close-mr-link", title: "Close merge request" 28 = link_to 'Close', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :close }), method: :put, class: "btn grouped btn-close close-mr-link", title: "Close merge request"
29 - 29 + - if @merge_request.closed?
  30 + = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn grouped btn-reopen reopen-mr-link", title: "Close merge request"
30 31
31 .notes.tab-content.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" } 32 .notes.tab-content.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" }
32 = render "projects/notes/notes_with_form" 33 = render "projects/notes/notes_with_form"
app/views/projects/merge_requests/show/_mr_box.html.haml
@@ -37,7 +37,7 @@ @@ -37,7 +37,7 @@
37 %i.icon-ok 37 %i.icon-ok
38 Merged by #{link_to_member(@project, @merge_request.merge_event.author)} 38 Merged by #{link_to_member(@project, @merge_request.merge_event.author)}
39 #{time_ago_with_tooltip(@merge_request.merge_event.created_at)}. 39 #{time_ago_with_tooltip(@merge_request.merge_event.created_at)}.
40 -- if !@closes_issues.empty? && @merge_request.opened? 40 +- if !@closes_issues.empty? && @merge_request.open?
41 .alert.alert-info.alert-info 41 .alert.alert-info.alert-info
42 %span 42 %span
43 %i.icon-ok 43 %i.icon-ok
app/views/projects/merge_requests/show/_mr_title.html.haml
@@ -3,8 +3,8 @@ @@ -3,8 +3,8 @@
3 3
4 %span.pull-right 4 %span.pull-right
5 - if can?(current_user, :modify_merge_request, @merge_request) 5 - if can?(current_user, :modify_merge_request, @merge_request)
6 - - if @merge_request.opened?  
7 - .left.btn-group 6 + - if @merge_request.open?
  7 + .btn-group.pull-left
8 %a.btn.grouped.dropdown-toggle{ data: {toggle: :dropdown} } 8 %a.btn.grouped.dropdown-toggle{ data: {toggle: :dropdown} }
9 %i.icon-download-alt 9 %i.icon-download-alt
10 Download as 10 Download as
@@ -18,6 +18,8 @@ @@ -18,6 +18,8 @@
18 = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn grouped", id:"edit_merge_request" do 18 = link_to edit_project_merge_request_path(@project, @merge_request), class: "btn grouped", id:"edit_merge_request" do
19 %i.icon-edit 19 %i.icon-edit
20 Edit 20 Edit
  21 + - if @merge_request.closed?
  22 + = link_to 'Reopen', project_merge_request_path(@project, @merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn grouped btn-reopen reopen-mr-link", title: "Close merge request"
21 23
22 .votes-holder.hidden-sm.hidden-xs 24 .votes-holder.hidden-sm.hidden-xs
23 #votes= render 'votes/votes_block', votable: @merge_request 25 #votes= render 'votes/votes_block', votable: @merge_request