Commit 48f741eed9f3676a8d0d089d7336fcffd31ebaa7
1 parent
d1d13856
Exists in
spb-stable
and in
3 other branches
MergeRequests services
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Showing
6 changed files
with
90 additions
and
31 deletions
Show diff stats
app/models/merge_request.rb
| ... | ... | @@ -50,17 +50,26 @@ class MergeRequest < ActiveRecord::Base |
| 50 | 50 | end |
| 51 | 51 | |
| 52 | 52 | event :merge do |
| 53 | - transition [:reopened, :opened] => :merged | |
| 53 | + transition [:reopened, :opened, :locked] => :merged | |
| 54 | 54 | end |
| 55 | 55 | |
| 56 | 56 | event :reopen do |
| 57 | 57 | transition closed: :reopened |
| 58 | 58 | end |
| 59 | 59 | |
| 60 | + event :lock do | |
| 61 | + transition [:reopened, :opened] => :locked | |
| 62 | + end | |
| 63 | + | |
| 64 | + event :unlock do | |
| 65 | + transition locked: :reopened | |
| 66 | + end | |
| 67 | + | |
| 60 | 68 | state :opened |
| 61 | 69 | state :reopened |
| 62 | 70 | state :closed |
| 63 | 71 | state :merged |
| 72 | + state :locked | |
| 64 | 73 | end |
| 65 | 74 | |
| 66 | 75 | state_machine :merge_status, initial: :unchecked do |
| ... | ... | @@ -136,19 +145,8 @@ class MergeRequest < ActiveRecord::Base |
| 136 | 145 | self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last |
| 137 | 146 | end |
| 138 | 147 | |
| 139 | - def merge!(user_id) | |
| 140 | - self.author_id_of_changes = user_id | |
| 141 | - self.merge | |
| 142 | - end | |
| 143 | - | |
| 144 | 148 | def automerge!(current_user, commit_message = nil) |
| 145 | - if Gitlab::Satellite::MergeAction.new(current_user, self).merge!(commit_message) | |
| 146 | - self.merge!(current_user.id) | |
| 147 | - true | |
| 148 | - end | |
| 149 | - rescue | |
| 150 | - mark_as_unmergeable | |
| 151 | - false | |
| 149 | + MergeRequests::AutoMergeService.new.execute(self, current_user, commit_message) | |
| 152 | 150 | end |
| 153 | 151 | |
| 154 | 152 | def mr_and_commit_notes | ... | ... |
app/models/project.rb
| ... | ... | @@ -350,7 +350,7 @@ class Project < ActiveRecord::Base |
| 350 | 350 | # Close merge requests |
| 351 | 351 | mrs = self.merge_requests.opened.where(target_branch: branch_name).to_a |
| 352 | 352 | mrs = mrs.select(&:last_commit).select { |mr| c_ids.include?(mr.last_commit.id) } |
| 353 | - mrs.each { |merge_request| merge_request.merge!(user.id) } | |
| 353 | + mrs.each { |merge_request| MergeRequests::MergeService.new.execute(merge_request, user, nil) } | |
| 354 | 354 | |
| 355 | 355 | true |
| 356 | 356 | end | ... | ... |
app/observers/merge_request_observer.rb
| ... | ... | @@ -18,23 +18,6 @@ class MergeRequestObserver < ActivityObserver |
| 18 | 18 | execute_hooks(merge_request) |
| 19 | 19 | end |
| 20 | 20 | |
| 21 | - def after_merge(merge_request, transition) | |
| 22 | - notification.merge_mr(merge_request) | |
| 23 | - # Since MR can be merged via sidekiq | |
| 24 | - # to prevent event duplication do this check | |
| 25 | - return true if merge_request.merge_event | |
| 26 | - | |
| 27 | - Event.create( | |
| 28 | - project: merge_request.target_project, | |
| 29 | - target_id: merge_request.id, | |
| 30 | - target_type: merge_request.class.name, | |
| 31 | - action: Event::MERGED, | |
| 32 | - author_id: merge_request.author_id_of_changes | |
| 33 | - ) | |
| 34 | - | |
| 35 | - execute_hooks(merge_request) | |
| 36 | - end | |
| 37 | - | |
| 38 | 21 | def after_reopen(merge_request, transition) |
| 39 | 22 | create_event(merge_request, Event::REOPENED) |
| 40 | 23 | create_note(merge_request) | ... | ... |
| ... | ... | @@ -0,0 +1,30 @@ |
| 1 | +module MergeRequests | |
| 2 | + # AutoMergeService class | |
| 3 | + # | |
| 4 | + # Do git merge in satellite and in case of success | |
| 5 | + # mark merge request as merged and execute all hooks and notifications | |
| 6 | + # Called when you do merge via GitLab UI | |
| 7 | + class AutoMergeService < BaseMergeService | |
| 8 | + def execute(merge_request, current_user, commit_message) | |
| 9 | + merge_request.lock | |
| 10 | + | |
| 11 | + if Gitlab::Satellite::MergeAction.new(current_user, merge_request).merge!(commit_message) | |
| 12 | + merge_request.author_id_of_changes = current_user.id | |
| 13 | + merge_request.merge | |
| 14 | + | |
| 15 | + notification.merge_mr(merge_request) | |
| 16 | + create_merge_event(merge_request) | |
| 17 | + execute_project_hooks(merge_request) | |
| 18 | + | |
| 19 | + true | |
| 20 | + else | |
| 21 | + merge_request.unlock | |
| 22 | + false | |
| 23 | + end | |
| 24 | + rescue | |
| 25 | + merge_request.unlock if merge_request.locked? | |
| 26 | + merge_request.mark_as_unmergeable | |
| 27 | + false | |
| 28 | + end | |
| 29 | + end | |
| 30 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,26 @@ |
| 1 | +module MergeRequests | |
| 2 | + class BaseMergeService | |
| 3 | + | |
| 4 | + private | |
| 5 | + | |
| 6 | + def notification | |
| 7 | + NotificationService.new | |
| 8 | + end | |
| 9 | + | |
| 10 | + def create_merge_event(merge_request) | |
| 11 | + Event.create( | |
| 12 | + project: merge_request.target_project, | |
| 13 | + target_id: merge_request.id, | |
| 14 | + target_type: merge_request.class.name, | |
| 15 | + action: Event::MERGED, | |
| 16 | + author_id: merge_request.author_id_of_changes | |
| 17 | + ) | |
| 18 | + end | |
| 19 | + | |
| 20 | + def execute_project_hooks(merge_request) | |
| 21 | + if merge_request.project | |
| 22 | + merge_request.project.execute_hooks(merge_request.to_hook_data, :merge_request_hooks) | |
| 23 | + end | |
| 24 | + end | |
| 25 | + end | |
| 26 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,22 @@ |
| 1 | +module MergeRequests | |
| 2 | + # MergeService class | |
| 3 | + # | |
| 4 | + # Mark existing merge request as merged | |
| 5 | + # and execute all hooks and notifications | |
| 6 | + # Called when you do merge via command line and push code | |
| 7 | + # to target branch | |
| 8 | + class MergeService < BaseMergeService | |
| 9 | + def execute(merge_request, current_user, commit_message) | |
| 10 | + merge_request.author_id_of_changes = current_user.id | |
| 11 | + merge_request.merge | |
| 12 | + | |
| 13 | + notification.merge_mr(merge_request) | |
| 14 | + create_merge_event(merge_request) | |
| 15 | + execute_project_hooks(merge_request) | |
| 16 | + | |
| 17 | + true | |
| 18 | + rescue | |
| 19 | + false | |
| 20 | + end | |
| 21 | + end | |
| 22 | +end | ... | ... |