Module: MergeRequestsHelper

Includes:
CompareHelper, Gitlab::Utils::StrongMemoize
Included in:
MergeRequestDiffEntity, Profile::EventEntity, Sidebars::YourWork::Menus::MergeRequestsMenu, SidebarsHelper
Defined in:
app/helpers/merge_requests_helper.rb

Instance Method Summary collapse

Methods included from CompareHelper

#create_mr_button?, #create_mr_path, #project_compare_selector_data

Instance Method Details

#allow_collaboration_unavailable_reason(merge_request) ⇒ Object



122
123
124
125
126
127
128
129
130
131
132
133
# File 'app/helpers/merge_requests_helper.rb', line 122

def allow_collaboration_unavailable_reason(merge_request)
  return if merge_request.can_allow_collaboration?(current_user)

  minimum_visibility = [merge_request.target_project.visibility_level,
                        merge_request.source_project.visibility_level].min

  if minimum_visibility < Gitlab::VisibilityLevel::INTERNAL
    _('Not available for private projects')
  elsif ProtectedBranch.protected?(merge_request.source_project, merge_request.source_branch)
    _('Not available for protected branches')
  end
end

#award_emoji_merge_request_api_path(merge_request) ⇒ Object



202
203
204
# File 'app/helpers/merge_requests_helper.rb', line 202

def award_emoji_merge_request_api_path(merge_request)
  api_v4_projects_merge_requests_award_emoji_path(id: merge_request.project.id, merge_request_iid: merge_request.iid)
end

#create_mr_button_from_event?(event) ⇒ Boolean

Returns:

  • (Boolean)


7
8
9
# File 'app/helpers/merge_requests_helper.rb', line 7

def create_mr_button_from_event?(event)
  create_mr_button?(from: event.branch_name, source_project: event.project)
end

#create_mr_path_from_push_event(event) ⇒ Object



11
12
13
# File 'app/helpers/merge_requests_helper.rb', line 11

def create_mr_path_from_push_event(event)
  create_mr_path(from: event.branch_name, source_project: event.project)
end

#diffs_tab_pane_data(project, merge_request, params) ⇒ Object



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'app/helpers/merge_requests_helper.rb', line 176

def diffs_tab_pane_data(project, merge_request, params)
  {
    "is-locked": merge_request.discussion_locked?,
    endpoint: diffs_project_merge_request_path(project, merge_request, 'json', params),
    endpoint_metadata: @endpoint_metadata_url,
    endpoint_batch: diffs_batch_project_json_merge_request_path(project, merge_request, 'json', params),
    endpoint_coverage: @coverage_path,
    endpoint_diff_for_path: diff_for_path_namespace_project_merge_request_path(format: 'json', id: merge_request.iid, namespace_id: project.namespace.to_param, project_id: project.path),
    help_page_path: help_page_path('user/project/merge_requests/reviews/suggestions.md'),
    current_user_data: @current_user_data,
    update_current_user_path: @update_current_user_path,
    project_path: project_path(merge_request.project),
    changes_empty_state_illustration: image_path('illustrations/merge_request_changes_empty.svg'),
    is_fluid_layout: fluid_layout.to_s,
    dismiss_endpoint: callouts_path,
    show_suggest_popover: show_suggest_popover?.to_s,
    show_whitespace_default: @show_whitespace_default.to_s,
    file_by_file_default: @file_by_file_default.to_s,
    default_suggestion_commit_message: default_suggestion_commit_message(project),
    source_project_default_url: merge_request.source_project && default_url_to_repo(merge_request.source_project),
    source_project_full_path: merge_request.source_project&.full_path,
    is_forked: project.forked?.to_s,
    new_comment_template_path: profile_comment_templates_path
  }
end

#format_mr_branch_names(merge_request) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
# File 'app/helpers/merge_requests_helper.rb', line 63

def format_mr_branch_names(merge_request)
  source_path = merge_request.source_project_path
  target_path = merge_request.target_project_path
  source_branch = merge_request.source_branch
  target_branch = merge_request.target_branch

  if source_path == target_path
    [source_branch, target_branch]
  else
    ["#{source_path}:#{source_branch}", "#{target_path}:#{target_branch}"]
  end
end

#how_merge_modal_data(merge_request) ⇒ Object



206
207
208
209
210
211
212
213
214
215
216
217
# File 'app/helpers/merge_requests_helper.rb', line 206

def how_merge_modal_data(merge_request)
  {
    is_fork: merge_request.for_fork?.to_s,
    can_merge: merge_request.can_be_merged_by?(current_user).to_s,
    source_branch: merge_request.source_branch,
    source_project_path: merge_request.source_project&.path,
    source_project_full_path: merge_request.source_project&.full_path,
    source_project_default_url: merge_request.source_project && default_url_to_repo(merge_request.source_project),
    target_branch: merge_request.target_branch,
    reviewing_docs_path: help_page_path('user/project/merge_requests/reviews/index.md', anchor: "checkout-merge-requests-locally-through-the-head-ref")
  }
end

#merge_params(merge_request) ⇒ Object



89
90
91
92
93
94
95
96
# File 'app/helpers/merge_requests_helper.rb', line 89

def merge_params(merge_request)
  {
    auto_merge_strategy: AutoMergeService::STRATEGY_MERGE_WHEN_PIPELINE_SUCCEEDS,
    should_remove_source_branch: true,
    sha: merge_request.diff_head_sha,
    squash: merge_request.squash_on_merge?
  }
end

#merge_path_description(merge_request, with_arrow: false) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'app/helpers/merge_requests_helper.rb', line 22

def merge_path_description(merge_request, with_arrow: false)
  if merge_request.for_fork?
    msg = if with_arrow
            _("Project:Branches: %{source_project_path}:%{source_branch} → %{target_project_path}:%{target_branch}")
          else
            _("Project:Branches: %{source_project_path}:%{source_branch} to %{target_project_path}:%{target_branch}")
          end

    msg % {
      source_project_path: merge_request.source_project_path,
      source_branch: merge_request.source_branch,
      target_project_path: merge_request.target_project.full_path,
      target_branch: merge_request.target_branch
    }
  else
    msg = if with_arrow
            _("Branches: %{source_branch} → %{target_branch}")
          else
            _("Branches: %{source_branch} to %{target_branch}")
          end

    msg % {
      source_branch: merge_request.source_branch,
      target_branch: merge_request.target_branch
    }
  end
end

#merge_request_button_hidden?(merge_request, closed) ⇒ Boolean

Returns:

  • (Boolean)


81
82
83
# File 'app/helpers/merge_requests_helper.rb', line 81

def merge_request_button_hidden?(merge_request, closed)
  merge_request.closed? == closed || (merge_request.merged? == closed && !merge_request.closed?) || merge_request.closed_or_merged_without_fork?
end

#merge_request_source_project_for_project(project = @project) ⇒ Object



135
136
137
138
139
140
141
142
143
144
145
# File 'app/helpers/merge_requests_helper.rb', line 135

def merge_request_source_project_for_project(project = @project)
  unless can?(current_user, :create_merge_request_in, project)
    return
  end

  if can?(current_user, :create_merge_request_from, project)
    project
  else
    current_user.fork_of(project)
  end
end

#merge_request_version_path(project, merge_request, merge_request_diff, start_sha = nil) ⇒ Object



85
86
87
# File 'app/helpers/merge_requests_helper.rb', line 85

def merge_request_version_path(project, merge_request, merge_request_diff, start_sha = nil)
  diffs_project_merge_request_path(project, merge_request, diff_id: merge_request_diff.id, start_sha: start_sha)
end

#moved_mr_sidebar_enabled?Boolean

Returns:

  • (Boolean)


172
173
174
# File 'app/helpers/merge_requests_helper.rb', line 172

def moved_mr_sidebar_enabled?
  Feature.enabled?(:moved_mr_sidebar, @project)
end

#mr_change_branches_path(merge_request) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
# File 'app/helpers/merge_requests_helper.rb', line 50

def mr_change_branches_path(merge_request)
  project_new_merge_request_path(
    @project,
    merge_request: {
      source_project_id: merge_request.source_project_id,
      target_project_id: merge_request.target_project_id,
      source_branch: merge_request.source_branch,
      target_branch: merge_request.target_branch
    },
    change_branches: true
  )
end

#mr_compare_form_data(_, merge_request) ⇒ Object



219
220
221
222
223
224
# File 'app/helpers/merge_requests_helper.rb', line 219

def mr_compare_form_data(_, merge_request)
  {
    source_branch_url: project_new_merge_request_branch_from_path(merge_request.source_project),
    target_branch_url: project_new_merge_request_branch_to_path(merge_request.source_project)
  }
end

#mr_css_classes(mr) ⇒ Object



15
16
17
18
19
20
# File 'app/helpers/merge_requests_helper.rb', line 15

def mr_css_classes(mr)
  classes = ["merge-request"]
  classes << "closed" if mr.closed?
  classes << "merged" if mr.merged?
  classes.join(' ')
end

#reviewers_label(merge_request, include_value: true) ⇒ Object



161
162
163
164
165
166
167
168
169
170
# File 'app/helpers/merge_requests_helper.rb', line 161

def reviewers_label(merge_request, include_value: true)
  reviewers = merge_request.reviewers

  if include_value
    sanitized_list = sanitize_name(reviewers.map(&:name).to_sentence)
    ns_('NotificationEmail|Reviewer: %{users}', 'NotificationEmail|Reviewers: %{users}', reviewers.count) % { users: sanitized_list }
  else
    ns_('NotificationEmail|Reviewer', 'NotificationEmail|Reviewers', reviewers.count)
  end
end


98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'app/helpers/merge_requests_helper.rb', line 98

def tab_link_for(merge_request, tab, options = {}, &block)
  data_attrs = {
    action: tab.to_s,
    target: "##{tab}",
    toggle: options.fetch(:force_link, false) ? '' : 'tabvue'
  }

  url = case tab
        when :show
          data_attrs[:target] = '#notes'
          method(:project_merge_request_path)
        when :commits
          method(:commits_project_merge_request_path)
        when :pipelines
          method(:pipelines_project_merge_request_path)
        when :diffs
          method(:diffs_project_merge_request_path)
        else
          raise "Cannot create tab #{tab}."
        end

  link_to(url[merge_request.project, merge_request], data: data_attrs, &block)
end

#target_projects(project) ⇒ Object



76
77
78
79
# File 'app/helpers/merge_requests_helper.rb', line 76

def target_projects(project)
  MergeRequestTargetProjectFinder.new(current_user: current_user, source_project: project)
    .execute(include_routes: true)
end

#user_merge_requests_countsObject



147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'app/helpers/merge_requests_helper.rb', line 147

def user_merge_requests_counts
  @user_merge_requests_counts ||= begin
    assigned_count = assigned_issuables_count(:merge_requests)
    review_requested_count = review_requested_merge_requests_count
    total_count = assigned_count + review_requested_count

    {
      assigned: assigned_count,
      review_requested: review_requested_count,
      total: total_count
    }
  end
end