Commit 3c867dfa8efec28155158e3b2b7dbb21ba3ce0a1
1 parent
65cd9829
Exists in
spb-stable
and in
3 other branches
MergeRequest services for create, update, close and reopen
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Showing
5 changed files
with
100 additions
and
0 deletions
Show diff stats
... | ... | @@ -0,0 +1,16 @@ |
1 | +module MergeRequests | |
2 | + class BaseService < ::BaseService | |
3 | + | |
4 | + private | |
5 | + | |
6 | + def create_note(merge_request) | |
7 | + Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state, nil) | |
8 | + end | |
9 | + | |
10 | + def execute_hooks(merge_request) | |
11 | + if merge_request.project | |
12 | + merge_request.project.execute_hooks(merge_request.to_hook_data, :merge_request_hooks) | |
13 | + end | |
14 | + end | |
15 | + end | |
16 | +end | ... | ... |
... | ... | @@ -0,0 +1,18 @@ |
1 | +module MergeRequests | |
2 | + class CloseService < MergeRequests::BaseService | |
3 | + def execute(merge_request, commit = nil) | |
4 | + # If we close MergeRequest we want to ignore validation | |
5 | + # so we can close broken one (Ex. fork project removed) | |
6 | + merge_request.allow_broken = true | |
7 | + | |
8 | + if merge_request.close | |
9 | + event_service.close_mr(merge_request, current_user) | |
10 | + notification_service.close_mr(merge_request, current_user) | |
11 | + create_note(merge_request) | |
12 | + execute_hooks(merge_request) | |
13 | + end | |
14 | + | |
15 | + merge_request | |
16 | + end | |
17 | + end | |
18 | +end | ... | ... |
... | ... | @@ -0,0 +1,18 @@ |
1 | +module MergeReques | |
2 | + class CreateService < MergeRequests::BaseService | |
3 | + def execute | |
4 | + merge_request = MergeRequest.new(params) | |
5 | + merge_request.source_project = project | |
6 | + merge_request.author = current_user | |
7 | + | |
8 | + if merge_request.save | |
9 | + event_service.open_mr(merge_request, current_user) | |
10 | + notification_service.new_merge_request(merge_request, current_user) | |
11 | + merge_request.create_cross_references!(merge_request.project, current_user) | |
12 | + execute_hooks(merge_request) | |
13 | + end | |
14 | + | |
15 | + merge_request | |
16 | + end | |
17 | + end | |
18 | +end | ... | ... |
... | ... | @@ -0,0 +1,15 @@ |
1 | +module MergeRequests | |
2 | + class ReopenService < MergeRequests::BaseService | |
3 | + def execute(merge_request) | |
4 | + if merge_request.reopen | |
5 | + event_service.reopen_mr(merge_request, current_user) | |
6 | + create_note(merge_request) | |
7 | + execute_hooks(merge_request) | |
8 | + merge_request.reload_code | |
9 | + merge_request.mark_as_unchecked | |
10 | + end | |
11 | + | |
12 | + merge_request | |
13 | + end | |
14 | + end | |
15 | +end | ... | ... |
... | ... | @@ -0,0 +1,33 @@ |
1 | +module MergeRequests | |
2 | + class UpdateService < MergeRequests::BaseService | |
3 | + def execute(merge_request) | |
4 | + # We dont allow change of source/target projects | |
5 | + # after merge request was created | |
6 | + params.delete(:source_project_id) | |
7 | + params.delete(:target_project_id) | |
8 | + | |
9 | + state = params.delete('state_event') | |
10 | + | |
11 | + case state | |
12 | + when 'reopen' | |
13 | + MergeRequests::ReopenService.new(project, current_user, {}).execute(merge_request) | |
14 | + when 'close' | |
15 | + MergeRequests::CloseService.new(project, current_user, {}).execute(merge_request) | |
16 | + end | |
17 | + | |
18 | + if params.present? && merge_request.update_attributes(params) | |
19 | + merge_request.reset_events_cache | |
20 | + | |
21 | + if merge_request.previous_changes.include?('assignee_id') | |
22 | + notification_service.reassigned_merge_request(merge_request, current_user) | |
23 | + create_assignee_note(merge_request) | |
24 | + end | |
25 | + | |
26 | + merge_request.notice_added_references(merge_request.project, current_user) | |
27 | + execute_hooks(merge_request) | |
28 | + end | |
29 | + | |
30 | + merge_request | |
31 | + end | |
32 | + end | |
33 | +end | ... | ... |