Module: MergeRequestsHelper

Includes:
Gitlab::Utils::StrongMemoize
Included in:
MergeRequestDiffEntity
Defined in:
app/helpers/merge_requests_helper.rb

Instance Method Summary collapse

Methods included from Gitlab::Utils::StrongMemoize

#clear_memoization, #strong_memoize, #strong_memoized?

Instance Method Details

#allow_collaboration_unavailable_reason(merge_request) ⇒ Object


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

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

#ci_build_details_path(merge_request) ⇒ Object


42
43
44
45
46
47
48
49
50
51
52
53
# File 'app/helpers/merge_requests_helper.rb', line 42

def ci_build_details_path(merge_request)
  build_url = merge_request.source_project.ci_service.build_page(merge_request.diff_head_sha, merge_request.source_branch)
  return unless build_url

  parsed_url = URI.parse(build_url)

  unless parsed_url.userinfo.blank?
    parsed_url.userinfo = ''
  end

  parsed_url.to_s
end

#different_base?(version1, version2) ⇒ Boolean

Returns:

  • (Boolean)

112
113
114
# File 'app/helpers/merge_requests_helper.rb', line 112

def different_base?(version1, version2)
  version1 && version2 && version1.base_commit_sha != version2.base_commit_sha
end

#format_mr_branch_names(merge_request) ⇒ Object


76
77
78
79
80
81
82
83
84
85
86
87
# File 'app/helpers/merge_requests_helper.rb', line 76

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

#merge_params(merge_request) ⇒ Object


116
117
118
119
120
121
122
123
# File 'app/helpers/merge_requests_helper.rb', line 116

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, separator) ⇒ Object


55
56
57
58
59
60
61
# File 'app/helpers/merge_requests_helper.rb', line 55

def merge_path_description(merge_request, separator)
  if merge_request.for_fork?
    "Project:Branches: #{@merge_request.source_project_path}:#{@merge_request.source_branch} #{separator} #{@merge_request.target_project.full_path}:#{@merge_request.target_branch}"
  else
    "Branches: #{@merge_request.source_branch} #{separator} #{@merge_request.target_branch}"
  end
end

#merge_request_button_hidden?(merge_request, closed) ⇒ Boolean

Returns:

  • (Boolean)

98
99
100
# File 'app/helpers/merge_requests_helper.rb', line 98

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

#merge_request_button_visibility(merge_request, closed) ⇒ Object


94
95
96
# File 'app/helpers/merge_requests_helper.rb', line 94

def merge_request_button_visibility(merge_request, closed)
  return 'hidden' if merge_request_button_hidden?(merge_request, closed)
end

#merge_request_source_project_for_project(project = @project) ⇒ Object


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

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


102
103
104
# File 'app/helpers/merge_requests_helper.rb', line 102

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

#mr_change_branches_path(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 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_css_classes(mr) ⇒ Object


25
26
27
28
29
30
# File 'app/helpers/merge_requests_helper.rb', line 25

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

#new_mr_from_push_event(event, target_project) ⇒ Object


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

def new_mr_from_push_event(event, target_project)
  {
    merge_request: {
      source_project_id: event.project.id,
      target_project_id: target_project.id,
      source_branch: event.branch_name,
      target_branch: target_project.repository.root_ref
    }
  }
end

#new_mr_path_from_push_event(event) ⇒ Object


6
7
8
9
10
11
12
# File 'app/helpers/merge_requests_helper.rb', line 6

def new_mr_path_from_push_event(event)
  target_project = event.project.default_merge_request_target
  project_new_merge_request_path(
    event.project,
    new_mr_from_push_event(event, target_project)
  )
end

#state_name_with_icon(merge_request) ⇒ Object


32
33
34
35
36
37
38
39
40
# File 'app/helpers/merge_requests_helper.rb', line 32

def state_name_with_icon(merge_request)
  if merge_request.merged?
    [_("Merged"), "git-merge"]
  elsif merge_request.closed?
    [_("Closed"), "close"]
  else
    [_("Open"), "issue-open-m"]
  end
end

125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'app/helpers/merge_requests_helper.rb', line 125

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


89
90
91
92
# File 'app/helpers/merge_requests_helper.rb', line 89

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

#version_index(merge_request_diff) ⇒ Object


106
107
108
109
110
# File 'app/helpers/merge_requests_helper.rb', line 106

def version_index(merge_request_diff)
  return if @merge_request_diffs.empty?

  @merge_request_diffs.size - @merge_request_diffs.index(merge_request_diff)
end