Module: CommitsHelper
- Includes:
- Gitlab::Utils::StrongMemoize
- Included in:
- DiffFileEntity, Gitlab::BlamePresenter
- Defined in:
- app/helpers/commits_helper.rb
Constant Summary collapse
- DEFAULT_SHA =
'0000000'
Instance Method Summary collapse
- #cherry_pick_projects_data(project) ⇒ Object
-
#commit_author_link(commit, options = {}) ⇒ Object
Returns a link to the commit author.
- #commit_blob ⇒ Object
- #commit_committer_avatar(committer, options = {}) ⇒ Object
-
#commit_committer_link(commit, options = {}) ⇒ Object
Just like #author_link but for the committer.
- #commit_list_app_data ⇒ Object
- #commit_options_dropdown_data(project, commit) ⇒ Object
-
#commit_partial_cache_key(commit, ref:, merge_request:, request:) ⇒ Object
This is used to calculate a cache key for the app/views/projects/commits/_commit.html.haml partial.
-
#commit_path_template(project) ⇒ Object
Returns the template path for commit resources to be utilized by the client applications.
- #commit_to_html(commit, ref, project) ⇒ Object
-
#commits_breadcrumbs ⇒ Object
Breadcrumb links for a Project and, if applicable, a tree path.
- #conditionally_paginate_diff_files(diffs, paginate:, page:, per:) ⇒ Object
- #diff_mode_swap_button(mode, file_hash) ⇒ Object
- #link_to_browse_code(project, commit) ⇒ Object
- #local_committed_date(commit, user) ⇒ Object
- #path_to_browse_file_or_directory(project, ref, path) ⇒ Object
Instance Method Details
#cherry_pick_projects_data(project) ⇒ Object
165 166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'app/helpers/commits_helper.rb', line 165 def cherry_pick_projects_data(project) available_projects = [project, project.forked_from_project].compact.select do |project| can?(current_user, :push_code, project) end available_projects.map do |project| { id: project.id.to_s, name: project.full_path, refsUrl: refs_project_path(project) } end end |
#commit_author_link(commit, options = {}) ⇒ Object
Returns a link to the commit author. If the author has a matching user and is a member of the current @project it will link to the team member page. Otherwise it will link to the author email as specified in the commit.
options:
avatar: true will prepend the avatar image
size: size of the avatar image in px
13 14 15 |
# File 'app/helpers/commits_helper.rb', line 13 def (commit, = {}) commit_person_link(commit, .merge(source: :author)) end |
#commit_blob ⇒ Object
87 88 89 |
# File 'app/helpers/commits_helper.rb', line 87 def commit_blob @repo.blob_at(@ref, @path) end |
#commit_committer_avatar(committer, options = {}) ⇒ Object
22 23 24 25 26 27 28 29 |
# File 'app/helpers/commits_helper.rb', line 22 def commit_committer_avatar(committer, = {}) user_avatar(.merge({ user: committer, user_name: committer.name, user_email: committer.email, css_class: 'gl-hidden @sm/panel:gl-inline-block !gl-float-none !gl-mr-0 gl-align-text-bottom' })) end |
#commit_committer_link(commit, options = {}) ⇒ Object
Just like #author_link but for the committer.
18 19 20 |
# File 'app/helpers/commits_helper.rb', line 18 def commit_committer_link(commit, = {}) commit_person_link(commit, .merge(source: :committer)) end |
#commit_list_app_data ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'app/helpers/commits_helper.rb', line 39 def commit_list_app_data { 'project_full_path' => @project.full_path, 'project_root_path' => project_path(@project), 'project_path' => @project.path, 'project_id' => @project.id.to_s, 'escaped_ref' => ActionDispatch::Journey::Router::Utils.escape_path(@ref), 'ref_type' => @ref_type.to_s, 'root_ref' => @project.default_branch, 'browse_files_path' => path_to_browse_file_or_directory(@project, @ref, @path), 'commits_feed_path' => project_commits_path(@project, @id, ), 'base_path' => project_commits_root_path(@project) } end |
#commit_options_dropdown_data(project, commit) ⇒ Object
123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'app/helpers/commits_helper.rb', line 123 def (project, commit) can_collaborate = current_user && can_collaborate_with_project?(project) { new_project_tag_path: new_project_tag_path(project, ref: commit), email_patches_path: project_commit_path(project, commit, format: :patch), plain_diff_path: project_commit_path(project, commit, format: :diff), can_revert: (can_collaborate && !commit.has_been_reverted?(current_user)).to_s, can_cherry_pick: can_collaborate.to_s, can_tag: can?(current_user, :push_code, project).to_s, can_email_patches: (commit.parents.length < 2).to_s } end |
#commit_partial_cache_key(commit, ref:, merge_request:, request:) ⇒ Object
This is used to calculate a cache key for the app/views/projects/commits/_commit.html.haml partial. It takes some of the same parameters as used in the partial and will hash the current pipeline status.
This includes a keyed hash for values that can be nil, to prevent invalid cache entries being served if the order should change in future.
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'app/helpers/commits_helper.rb', line 185 def commit_partial_cache_key(commit, ref:, merge_request:, request:) [ commit, commit., ref, { merge_request: merge_request&.cache_key, pipeline_status: commit.detailed_status_for(ref)&.cache_key, xhr: request.xhr?, controller: controller.controller_path, path: @path, # referred to in #link_to_browse_code referenced_by: tag_checksum(commit.referenced_by) } ] end |
#commit_path_template(project) ⇒ Object
Returns the template path for commit resources to be utilized by the client applications.
205 206 207 |
# File 'app/helpers/commits_helper.rb', line 205 def commit_path_template(project) project_commit_path(project, DEFAULT_SHA).sub("/#{DEFAULT_SHA}", '/$COMMIT_SHA') end |
#commit_to_html(commit, ref, project) ⇒ Object
31 32 33 34 35 36 37 |
# File 'app/helpers/commits_helper.rb', line 31 def commit_to_html(commit, ref, project) render partial: 'projects/commits/commit', formats: :html, locals: { commit: commit, ref: ref, project: project } end |
#commits_breadcrumbs ⇒ Object
Breadcrumb links for a Project and, if applicable, a tree path
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 |
# File 'app/helpers/commits_helper.rb', line 55 def return unless @project && @ref # Add the root project link and the arrow icon crumbs = content_tag(:li, class: 'breadcrumb-item') do link_to( @project.path, project_commits_path(@project, @ref, ref_type: @ref_type) ) end if @path parts = @path.split('/') parts.each_with_index do |part, i| crumbs << content_tag(:li, class: 'breadcrumb-item') do # The text is just the individual part, but the link needs all the parts before it link_to( part, project_commits_path( @project, tree_join(@ref, parts[0..i].join('/')), ref_type: @ref_type ) ) end end end crumbs.html_safe end |
#conditionally_paginate_diff_files(diffs, paginate:, page:, per:) ⇒ Object
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'app/helpers/commits_helper.rb', line 137 def conditionally_paginate_diff_files(diffs, paginate:, page:, per:) if paginate diff_files = diffs.diff_files.to_a project = diffs.project repo = project.repository Gitlab::Utils::BatchLoader.clear_key([:repository_blobs, repo, Gitlab::Diff::FileCollection::MergeRequestDiffBase.max_blob_size(project)]) Gitlab::Utils::BatchLoader.clear_key([:repository_blobs, repo, Gitlab::Git::Blob::MAX_DATA_DISPLAY_SIZE]) Kaminari.paginate_array(diff_files).page(page).per(per).tap do |diff_files| diff_files.each(&:add_blobs_to_batch_loader) end else diffs.diff_files end end |
#diff_mode_swap_button(mode, file_hash) ⇒ Object
209 210 211 212 213 214 215 216 217 218 219 220 221 |
# File 'app/helpers/commits_helper.rb', line 209 def (mode, file_hash) icon = mode == 'raw' ? 'doc-code' : 'doc-text' entity = mode == 'raw' ? 'rawButton' : 'renderedButton' title = "Display #{mode} diff" render Pajamas::ButtonComponent.new( href: "##{mode}-diff-#{file_hash}", button_options: { title: title, class: "btn-file-option has-tooltip btn-show-#{mode}-diff", data: { file_hash: file_hash, diff_toggle_entity: entity } }) do sprite_icon(icon) end end |
#link_to_browse_code(project, commit) ⇒ Object
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'app/helpers/commits_helper.rb', line 92 def link_to_browse_code(project, commit) return unless current_controller?(:commits) if @path.blank? url = project_tree_path(project, commit) tooltip = _("Browse Files") elsif commit_blob.present? url = project_blob_path(project, tree_join(commit.id, @path)) tooltip = _("Browse File") elsif @path.present? url = project_tree_path(project, tree_join(commit.id, @path)) tooltip = _("Browse Directory") end render Pajamas::ButtonComponent.new(href: url, button_options: { title: tooltip, class: 'has-tooltip btn-icon', data: { container: 'body' } }) do sprite_icon('folder-open') end end |
#local_committed_date(commit, user) ⇒ Object
155 156 157 158 159 160 161 162 163 |
# File 'app/helpers/commits_helper.rb', line 155 def local_committed_date(commit, user) server_timezone = Time.zone user_timezone = user.timezone if user user_timezone = ActiveSupport::TimeZone.new(user_timezone) if user_timezone timezone = user_timezone || server_timezone commit.committed_date.in_time_zone(timezone).to_date end |
#path_to_browse_file_or_directory(project, ref, path) ⇒ Object
112 113 114 115 116 117 118 119 120 121 |
# File 'app/helpers/commits_helper.rb', line 112 def path_to_browse_file_or_directory(project, ref, path) return project_tree_path(project, ref) if path.blank? path_to_item = tree_join(ref, path) if commit_blob.present? project_blob_path(project, path_to_item) else project_tree_path(project, path_to_item) end end |