2011-10-08 17:36:38 -04:00
module CommitsHelper
2013-03-31 16:46:54 -04:00
# 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
def commit_author_link ( commit , options = { } )
commit_person_link ( commit , options . merge ( source : :author ) )
end
# Just like #author_link but for the committer.
def commit_committer_link ( commit , options = { } )
commit_person_link ( commit , options . merge ( source : :committer ) )
end
2012-05-30 14:02:30 -04:00
def image_diff_class ( diff )
if diff . deleted_file
2012-12-01 07:49:21 -05:00
" deleted "
2012-05-30 14:02:30 -04:00
elsif diff . new_file
2012-12-01 07:49:21 -05:00
" added "
2012-05-30 14:02:30 -04:00
else
nil
end
end
2012-07-02 16:08:07 -04:00
2016-10-21 04:22:43 -04:00
def commit_to_html ( commit , ref , project )
render 'projects/commits/commit' ,
commit : commit ,
ref : ref ,
project : project
2012-10-31 08:29:42 -04:00
end
2012-12-24 22:14:05 -05:00
2013-03-31 16:46:54 -04:00
# Breadcrumb links for a Project and, if applicable, a tree path
def commits_breadcrumbs
return unless @project && @ref
# Add the root project link and the arrow icon
crumbs = content_tag ( :li ) do
2015-01-24 13:02:58 -05:00
link_to (
@project . path ,
namespace_project_commits_path ( @project . namespace , @project , @ref )
)
2013-03-31 16:46:54 -04:00
end
if @path
parts = @path . split ( '/' )
parts . each_with_index do | part , i |
2014-10-09 03:47:47 -04:00
crumbs << content_tag ( :li ) do
2013-03-31 16:46:54 -04:00
# The text is just the individual part, but the link needs all the parts before it
2015-01-24 13:02:58 -05:00
link_to (
part ,
namespace_project_commits_path (
@project . namespace ,
@project ,
tree_join ( @ref , parts [ 0 .. i ] . join ( '/' ) )
)
)
2013-03-31 16:46:54 -04:00
end
end
end
crumbs . html_safe
end
2013-10-15 08:59:48 -04:00
# Return Project default branch, if it present in array
# Else - first branch in array (mb last actual branch)
def commit_default_branch ( project , branches )
branches . include? ( project . default_branch ) ? branches . delete ( project . default_branch ) : branches . pop
end
# Returns the sorted alphabetically links to branches, separated by a comma
def commit_branches_links ( project , branches )
2015-01-22 14:15:21 -05:00
branches . sort . map do | branch |
2015-01-24 13:02:58 -05:00
link_to (
namespace_project_tree_path ( project . namespace , project , branch )
) do
2015-01-22 14:15:21 -05:00
content_tag :span , class : 'label label-gray' do
2015-01-28 03:32:48 -05:00
icon ( 'code-fork' ) + ' ' + branch
2015-01-22 14:15:21 -05:00
end
end
end . join ( " " ) . html_safe
2013-10-15 08:59:48 -04:00
end
2015-01-17 08:12:49 -05:00
# Returns the sorted links to tags, separated by a comma
def commit_tags_links ( project , tags )
sorted = VersionSorter . rsort ( tags )
2015-01-22 14:15:21 -05:00
sorted . map do | tag |
2015-01-24 13:02:58 -05:00
link_to (
namespace_project_commits_path ( project . namespace , project ,
project . repository . find_tag ( tag ) . name )
) do
2015-01-22 14:15:21 -05:00
content_tag :span , class : 'label label-gray' do
2015-01-28 03:32:48 -05:00
icon ( 'tag' ) + ' ' + tag
2015-01-22 14:15:21 -05:00
end
end
end . join ( " " ) . html_safe
2015-01-17 08:12:49 -05:00
end
2014-07-08 11:28:02 -04:00
def link_to_browse_code ( project , commit )
2016-08-17 11:02:17 -04:00
if @path . blank?
return link_to (
" Browse Files " ,
namespace_project_tree_path ( project . namespace , project , commit ) ,
class : " btn btn-default "
)
end
return unless current_controller? ( :projects , :commits )
if @repo . blob_at ( commit . id , @path )
return link_to (
" Browse File " ,
namespace_project_blob_path ( project . namespace , project ,
tree_join ( commit . id , @path ) ) ,
class : " btn btn-default "
)
elsif @path . present?
return link_to (
" Browse Directory " ,
namespace_project_tree_path ( project . namespace , project ,
tree_join ( commit . id , @path ) ) ,
class : " btn btn-default "
)
2014-07-08 11:28:02 -04:00
end
end
2016-05-26 06:19:11 -04:00
def revert_commit_link ( commit , continue_to_path , btn_class : nil , has_tooltip : true )
2016-12-14 01:30:38 -05:00
commit_action_link ( 'revert' , commit , continue_to_path , btn_class : btn_class , has_tooltip : has_tooltip )
2016-02-15 14:58:30 -05:00
end
2016-05-26 06:19:11 -04:00
def cherry_pick_commit_link ( commit , continue_to_path , btn_class : nil , has_tooltip : true )
2016-12-14 01:30:38 -05:00
commit_action_link ( 'cherry-pick' , commit , continue_to_path , btn_class : btn_class , has_tooltip : has_tooltip )
2016-02-03 16:11:59 -05:00
end
2013-03-31 16:46:54 -04:00
protected
# Private: Returns a link to a person. If the person 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 person email as specified in the commit.
#
# options:
# source: one of :author or :committer
# avatar: true will prepend the avatar image
# size: size of the avatar image in px
def commit_person_link ( commit , options = { } )
2015-03-27 07:16:34 -04:00
user = commit . send ( options [ :source ] )
2015-09-23 06:18:16 -04:00
2014-11-14 05:08:58 -05:00
source_name = clean ( commit . send " #{ options [ :source ] } _name " . to_sym )
source_email = clean ( commit . send " #{ options [ :source ] } _email " . to_sym )
2014-06-14 12:02:16 -04:00
2015-03-27 07:16:34 -04:00
person_name = user . try ( :name ) || source_name
2014-06-14 12:02:16 -04:00
2015-02-03 00:38:50 -05:00
text =
if options [ :avatar ]
2016-05-24 03:28:18 -04:00
%Q{ <span class="commit- #{ options [ :source ] } -name"> #{ person_name } </span> }
2015-02-03 00:38:50 -05:00
else
person_name
end
2013-03-31 16:46:54 -04:00
2013-07-27 03:40:38 -04:00
options = {
2016-03-20 15:01:46 -04:00
class : " commit- #{ options [ :source ] } -link has-tooltip " ,
2016-04-17 17:48:51 -04:00
title : source_email
2013-07-27 03:40:38 -04:00
}
2013-03-31 16:46:54 -04:00
if user . nil?
2013-07-27 03:40:38 -04:00
mail_to ( source_email , text . html_safe , options )
2013-03-31 16:46:54 -04:00
else
2013-07-27 03:40:38 -04:00
link_to ( text . html_safe , user_path ( user ) , options )
2013-03-31 16:46:54 -04:00
end
end
2014-06-14 15:54:56 -04:00
2016-12-14 01:30:38 -05:00
def commit_action_link ( action , commit , continue_to_path , btn_class : nil , has_tooltip : true )
return unless current_user
tooltip = " #{ action . capitalize } this #{ commit . change_type_title ( current_user ) } in a new merge request " if has_tooltip
btn_class = " btn btn- #{ btn_class } " unless btn_class . nil?
if can_collaborate_with_project?
link_to action . capitalize , " # modal- #{ action } -commit " , 'data-toggle' = > 'modal' , 'data-container' = > 'body' , title : ( tooltip if has_tooltip ) , class : " #{ btn_class } #{ 'has-tooltip' if has_tooltip } "
elsif can? ( current_user , :fork_project , @project )
continue_params = {
to : continue_to_path ,
notice : " #{ edit_in_new_fork_notice } Try to #{ action } this commit again. " ,
notice_now : edit_in_new_fork_notice_now
}
fork_path = namespace_project_forks_path ( @project . namespace , @project ,
namespace_key : current_user . namespace . id ,
continue : continue_params )
link_to action . capitalize , fork_path , class : btn_class , method : :post , 'data-toggle' = > 'tooltip' , 'data-container' = > 'body' , title : ( tooltip if has_tooltip )
end
end
2017-02-06 19:06:46 -05:00
def view_file_button ( commit_sha , diff_new_path , project )
2015-01-24 13:02:58 -05:00
link_to (
namespace_project_blob_path ( project . namespace , project ,
2016-07-20 12:25:36 -04:00
tree_join ( commit_sha , diff_new_path ) ) ,
2017-01-30 05:58:30 -05:00
class : 'btn view-file js-view-file'
2015-01-24 13:02:58 -05:00
) do
2014-08-02 11:12:01 -04:00
raw ( 'View file @' ) + content_tag ( :span , commit_sha [ 0 .. 6 ] ,
class : 'commit-short-id' )
end
end
2014-10-10 08:39:48 -04:00
2017-02-06 19:06:46 -05:00
def view_on_environment_button ( commit_sha , diff_new_path , environment )
2017-01-29 14:38:00 -05:00
return unless environment && commit_sha
external_url = environment . external_url_for ( diff_new_path , commit_sha )
return unless external_url
link_to ( external_url , class : 'btn btn-file-option has-tooltip' , target : '_blank' , title : " View on #{ environment . formatted_external_url } " , data : { container : 'body' } ) do
icon ( 'external-link' )
end
end
2014-10-10 08:39:48 -04:00
def truncate_sha ( sha )
Commit . truncate_sha ( sha )
end
2014-11-14 05:08:58 -05:00
def clean ( string )
Sanitize . clean ( string , remove_contents : true )
end
2016-03-04 09:45:58 -05:00
def limited_commits ( commits )
if commits . size > MergeRequestDiff :: COMMITS_SAFE_SIZE
[
commits . first ( MergeRequestDiff :: COMMITS_SAFE_SIZE ) ,
commits . size - MergeRequestDiff :: COMMITS_SAFE_SIZE
]
else
[ commits , 0 ]
end
end
2011-10-08 17:36:38 -04:00
end