update_service.rb 3.8 KB
Newer Older
1 2 3
module MergeRequests
  class UpdateService < MergeRequests::BaseService
    def execute(merge_request)
4
      # We don't allow change of source/target projects and source branch
5
      # after merge request was created
6 7
      params.except!(:source_project_id)
      params.except!(:target_project_id)
8
      params.except!(:source_branch)
9

10
      merge_from_quick_action(merge_request) if params[:merge]
11

12 13 14 15
      if merge_request.closed_without_fork?
        params.except!(:target_branch, :force_remove_source_branch)
      end

16 17 18 19
      if params[:force_remove_source_branch].present?
        merge_request.merge_params['force_remove_source_branch'] = params.delete(:force_remove_source_branch)
      end

T
Thomas Balthazar 已提交
20
      handle_wip_event(merge_request)
21
      update(merge_request)
22
    end
23

24 25 26 27
    def handle_changes(merge_request, options)
      old_labels = options[:old_labels] || []
      old_mentioned_users = options[:old_mentioned_users] || []

28
      if has_changes?(merge_request, old_labels: old_labels)
29
        todo_service.mark_pending_todos_as_done(merge_request, current_user)
30 31 32
      end

      if merge_request.previous_changes.include?('title') ||
33
          merge_request.previous_changes.include?('description')
34
        todo_service.update_merge_request(merge_request, current_user, old_mentioned_users)
35 36
      end

37 38 39 40 41
      if merge_request.previous_changes.include?('target_branch')
        create_branch_change_note(merge_request, 'target',
                                  merge_request.previous_changes['target_branch'].first,
                                  merge_request.target_branch)
      end
42

43 44 45
      if merge_request.previous_changes.include?('milestone_id')
        create_milestone_note(merge_request)
      end
46

47 48 49
      if merge_request.previous_changes.include?('assignee_id')
        create_assignee_note(merge_request)
        notification_service.reassigned_merge_request(merge_request, current_user)
50
        todo_service.reassigned_merge_request(merge_request, current_user)
51
      end
52

53 54 55 56
      if merge_request.previous_changes.include?('target_branch') ||
          merge_request.previous_changes.include?('source_branch')
        merge_request.mark_as_unchecked
      end
57

58 59 60 61 62 63 64
      added_labels = merge_request.labels - old_labels
      if added_labels.present?
        notification_service.relabeled_merge_request(
          merge_request,
          added_labels,
          current_user
        )
65
      end
66

67 68 69 70 71 72 73 74
      added_mentions = merge_request.mentioned_users - old_mentioned_users
      if added_mentions.present?
        notification_service.new_mentions_in_merge_request(
          merge_request,
          added_mentions,
          current_user
        )
      end
75
    end
76

77
    def merge_from_quick_action(merge_request)
78
      last_diff_sha = params.delete(:merge)
79
      return unless merge_request.mergeable_with_quick_action?(current_user, last_diff_sha: last_diff_sha)
80 81 82 83 84 85

      merge_request.update(merge_error: nil)

      if merge_request.head_pipeline && merge_request.head_pipeline.active?
        MergeRequests::MergeWhenPipelineSucceedsService.new(project, current_user).execute(merge_request)
      else
86
        merge_request.async_merge(current_user.id, {})
87 88 89
      end
    end

90 91 92 93 94 95 96
    def reopen_service
      MergeRequests::ReopenService
    end

    def close_service
      MergeRequests::CloseService
    end
97 98 99 100

    def after_update(issuable)
      issuable.cache_merge_request_closes_issues!(current_user)
    end
T
Thomas Balthazar 已提交
101 102 103 104 105 106 107 108 109 110 111 112 113

    private

    def handle_wip_event(merge_request)
      if wip_event = params.delete(:wip_event)
        # We update the title that is provided in the params or we use the mr title
        title = params[:title] || merge_request.title
        params[:title] = case wip_event
                         when 'wip' then MergeRequest.wip_title(title)
                         when 'unwip' then MergeRequest.wipless_title(title)
                         end
      end
    end
114 115
  end
end