BigW Consortium Gitlab

merge_request_entity.rb 5.17 KB
Newer Older
1
class MergeRequestEntity < IssuableEntity
2 3
  include RequestAwareEntity

4 5 6 7 8 9
  expose :in_progress_merge_commit_sha
  expose :merge_commit_sha
  expose :merge_error
  expose :merge_params
  expose :merge_status
  expose :merge_user_id
10
  expose :merge_when_pipeline_succeeds
11 12 13 14
  expose :source_branch
  expose :source_project_id
  expose :target_branch
  expose :target_project_id
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

  # Events
  expose :merge_event, using: EventEntity
  expose :closed_event, using: EventEntity

  # User entities
  expose :author, using: UserEntity
  expose :merge_user, using: UserEntity

  # Diff sha's
  expose :diff_head_sha do |merge_request|
    merge_request.diff_head_sha if merge_request.diff_head_commit
  end

  expose :merge_commit_sha
  expose :merge_commit_message
Z.J. van de Weg committed
31
  expose :head_pipeline, with: PipelineDetailsEntity, as: :pipeline
32 33

  # Booleans
34
  expose :merge_ongoing?, as: :merge_ongoing
35 36 37 38 39 40 41
  expose :work_in_progress?, as: :work_in_progress
  expose :source_branch_exists?, as: :source_branch_exists
  expose :mergeable_discussions_state?, as: :mergeable_discussions_state
  expose :branch_missing?, as: :branch_missing
  expose :commits_count
  expose :cannot_be_merged?, as: :has_conflicts
  expose :can_be_merged?, as: :can_be_merged
42
  expose :remove_source_branch?, as: :remove_source_branch
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

  expose :project_archived do |merge_request|
    merge_request.project.archived?
  end

  expose :only_allow_merge_if_pipeline_succeeds do |merge_request|
    merge_request.project.only_allow_merge_if_pipeline_succeeds?
  end

  # CI related
  expose :has_ci?, as: :has_ci
  expose :ci_status do |merge_request|
    presenter(merge_request).ci_status
  end

  expose :issues_links do
    expose :assign_to_closing do |merge_request|
      presenter(merge_request).assign_to_closing_issues_link
    end

    expose :closing do |merge_request|
      presenter(merge_request).closing_issues_links
    end

    expose :mentioned_but_not_closing do |merge_request|
      presenter(merge_request).mentioned_issues_links
    end
  end

  expose :source_branch_with_namespace_link do |merge_request|
    presenter(merge_request).source_branch_with_namespace_link
  end

  expose :source_branch_path do |merge_request|
    presenter(merge_request).source_branch_path
  end

  expose :current_user do
    expose :can_remove_source_branch do |merge_request|
      merge_request.source_branch_exists? && merge_request.can_remove_source_branch?(current_user)
    end

    expose :can_revert_on_current_merge_request do |merge_request|
      presenter(merge_request).can_revert_on_current_merge_request?
    end

    expose :can_cherry_pick_on_current_merge_request do |merge_request|
      presenter(merge_request).can_cherry_pick_on_current_merge_request?
    end
  end

  # Paths
  #
96 97 98 99
  expose :target_branch_commits_path do |merge_request|
    presenter(merge_request).target_branch_commits_path
  end

100 101
  expose :target_branch_tree_path do |merge_request|
    presenter(merge_request).target_branch_tree_path
102 103
  end

104
  expose :new_blob_path do |merge_request|
105
    if can?(current_user, :push_code, merge_request.project)
106
      project_new_blob_path(merge_request.project, merge_request.source_branch)
107
    end
108 109
  end

110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
  expose :conflict_resolution_path do |merge_request|
    presenter(merge_request).conflict_resolution_path
  end

  expose :remove_wip_path do |merge_request|
    presenter(merge_request).remove_wip_path
  end

  expose :cancel_merge_when_pipeline_succeeds_path do |merge_request|
    presenter(merge_request).cancel_merge_when_pipeline_succeeds_path
  end

  expose :create_issue_to_resolve_discussions_path do |merge_request|
    presenter(merge_request).create_issue_to_resolve_discussions_path
  end

  expose :merge_path do |merge_request|
    presenter(merge_request).merge_path
  end

  expose :cherry_pick_in_fork_path do |merge_request|
    presenter(merge_request).cherry_pick_in_fork_path
  end

  expose :revert_in_fork_path do |merge_request|
    presenter(merge_request).revert_in_fork_path
  end

  expose :email_patches_path do |merge_request|
139
    project_merge_request_path(merge_request.project, merge_request, format: :patch)
140 141 142
  end

  expose :plain_diff_path do |merge_request|
143
    project_merge_request_path(merge_request.project, merge_request, format: :diff)
144 145 146
  end

  expose :status_path do |merge_request|
147
    project_merge_request_path(merge_request.target_project, merge_request, format: :json)
148 149 150
  end

  expose :ci_environments_status_path do |merge_request|
151
    ci_environments_status_project_merge_request_path(merge_request.project, merge_request)
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
  end

  expose :merge_commit_message_with_description do |merge_request|
    merge_request.merge_commit_message(include_description: true)
  end

  expose :diverged_commits_count do |merge_request|
    if merge_request.open? && merge_request.diverged_from_target_branch?
      merge_request.diverged_commits_count
    else
      0
    end
  end

  expose :commit_change_content_path do |merge_request|
167
    commit_change_content_project_merge_request_path(merge_request.project, merge_request)
168 169 170 171 172 173 174 175 176 177
  end

  private

  delegate :current_user, to: :request

  def presenter(merge_request)
    @presenters ||= {}
    @presenters[merge_request] ||= MergeRequestPresenter.new(merge_request, current_user: current_user)
  end
178
end