2012-09-07 12:57:13 -04:00
module ProjectsHelper
2014-09-25 18:07:40 -04:00
def link_to_project ( project )
2016-03-11 15:53:27 -05:00
link_to [ project . namespace . becomes ( Namespace ) , project ] , title : h ( project . name ) do
2014-04-11 18:00:58 -04:00
title = content_tag ( :span , project . name , class : 'project-name' )
2012-12-09 03:56:15 -05:00
if project . namespace
2013-10-10 03:53:49 -04:00
namespace = content_tag ( :span , " #{ project . namespace . human_name } / " , class : 'namespace-name' )
2012-12-09 03:56:15 -05:00
title = namespace + title
end
title
end
2012-10-01 09:39:19 -04:00
end
2012-10-29 17:45:11 -04:00
2016-01-28 20:36:48 -05:00
def link_to_member_avatar ( author , opts = { } )
default_opts = { avatar : true , name : true , size : 16 , author_class : 'author' , title : " :name " }
opts = default_opts . merge ( opts )
2016-06-29 09:16:04 -04:00
image_tag ( avatar_icon ( author , opts [ :size ] ) , width : opts [ :size ] , class : " avatar avatar-inline #{ " s #{ opts [ :size ] } " if opts [ :size ] } " , alt : '' ) if opts [ :avatar ]
2016-01-28 20:36:48 -05:00
end
2016-03-04 12:37:07 -05:00
def link_to_member ( project , author , opts = { } , & block )
2016-07-12 10:46:28 -04:00
default_opts = { avatar : true , name : true , size : 16 , author_class : 'author' , title : " :name " , tooltip : false }
2013-01-17 15:35:45 -05:00
opts = default_opts . merge ( opts )
2012-12-12 22:14:05 -05:00
return " (deleted) " unless author
2017-04-17 09:57:09 -04:00
author_html = " "
2013-01-17 15:35:45 -05:00
2012-12-12 22:14:05 -05:00
# Build avatar image tag
2016-09-05 13:57:00 -04:00
author_html << image_tag ( avatar_icon ( author , opts [ :size ] ) , width : opts [ :size ] , class : " avatar avatar-inline #{ " s #{ opts [ :size ] } " if opts [ :size ] } #{ opts [ :avatar_class ] if opts [ :avatar_class ] } " , alt : '' ) if opts [ :avatar ]
2012-12-12 22:14:05 -05:00
2013-01-11 14:16:37 -05:00
# Build name span tag
2016-02-29 15:43:57 -05:00
if opts [ :by_username ]
author_html << content_tag ( :span , sanitize ( " @ #{ author . username } " ) , class : opts [ :author_class ] ) if opts [ :name ]
else
2016-07-12 10:46:28 -04:00
tooltip_data = { placement : 'top' }
2016-07-13 06:58:58 -04:00
author_html << content_tag ( :span , sanitize ( author . name ) , class : [ opts [ :author_class ] , ( 'has-tooltip' if opts [ :tooltip ] ) ] , title : ( author . to_reference if opts [ :tooltip ] ) , data : ( tooltip_data if opts [ :tooltip ] ) ) if opts [ :name ]
2016-02-29 15:43:57 -05:00
end
2012-12-12 22:14:05 -05:00
2016-03-04 12:37:07 -05:00
author_html << capture ( & block ) if block
2013-01-17 15:35:45 -05:00
author_html = author_html . html_safe
2012-12-12 22:14:05 -05:00
2013-07-24 17:09:56 -04:00
if opts [ :name ]
2016-06-02 06:03:33 -04:00
link_to ( author_html , user_path ( author ) , class : " author_link #{ " #{ opts [ :extra_class ] } " if opts [ :extra_class ] } #{ " #{ opts [ :mobile_classes ] } " if opts [ :mobile_classes ] } " ) . html_safe
2013-07-24 17:09:56 -04:00
else
2015-12-02 08:18:46 -05:00
title = opts [ :title ] . sub ( " :name " , sanitize ( author . name ) )
2017-04-17 09:57:09 -04:00
link_to ( author_html , user_path ( author ) , class : " author_link has-tooltip " , title : title , data : { container : 'body' } ) . html_safe
2013-07-24 17:09:56 -04:00
end
2012-10-29 17:45:11 -04:00
end
2012-12-12 05:02:29 -05:00
2016-09-01 17:00:43 -04:00
def project_title ( project )
2015-09-14 13:46:58 -04:00
namespace_link =
if project . group
2016-12-08 11:28:49 -05:00
group_title ( project . group )
2015-09-14 13:46:58 -04:00
else
owner = project . namespace . owner
link_to ( simple_sanitize ( owner . name ) , user_path ( owner ) )
2013-11-04 08:18:55 -05:00
end
2015-09-14 13:46:58 -04:00
2017-06-30 12:52:11 -04:00
project_link = link_to project_path ( project ) , { class : " project-item-select-holder " } do
output =
if show_new_nav?
project_icon ( project , alt : project . name , class : 'avatar-tile' , width : 16 , height : 16 )
else
" "
end
output << simple_sanitize ( project . name )
output . html_safe
end
2015-09-14 13:46:58 -04:00
2016-04-07 10:20:22 -04:00
if current_user
2016-12-14 15:32:01 -05:00
project_link << button_tag ( type : 'button' , class : 'dropdown-toggle-caret js-projects-dropdown-toggle' , aria : { label : 'Toggle switch project dropdown' } , data : { target : '.js-dropdown-menu-projects' , toggle : 'dropdown' , order_by : 'last_activity_at' } ) do
2016-08-31 21:58:58 -04:00
icon ( " chevron-down " )
end
2016-04-07 10:20:22 -04:00
end
2016-09-01 17:00:43 -04:00
" #{ namespace_link } / #{ project_link } " . html_safe
2012-12-12 05:02:29 -05:00
end
2013-05-20 07:22:18 -04:00
def remove_project_message ( project )
2017-06-07 16:13:44 -04:00
_ ( " You are going to remove %{project_name_with_namespace}. \n Removed project CANNOT be restored! \n Are you ABSOLUTELY sure? " ) %
{ project_name_with_namespace : project . name_with_namespace }
2013-05-20 07:22:18 -04:00
end
2013-06-13 15:58:27 -04:00
2014-10-08 06:57:54 -04:00
def transfer_project_message ( project )
2017-06-07 16:13:44 -04:00
_ ( " You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure? " ) %
{ project_name_with_namespace : project . name_with_namespace }
2014-10-08 06:57:54 -04:00
end
2015-10-13 06:24:44 -04:00
def remove_fork_project_message ( project )
2017-06-12 20:39:14 -04:00
_ ( " You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure? " ) %
2017-06-07 16:13:44 -04:00
{ forked_from_project : @project . forked_from_project . name_with_namespace }
2015-10-13 06:24:44 -04:00
end
2013-06-13 15:58:27 -04:00
def project_nav_tabs
@nav_tabs || = get_project_nav_tabs ( @project , current_user )
end
2017-05-29 09:52:02 -04:00
def project_search_tabs? ( tab )
abilities = Array ( search_tab_ability_map [ tab ] )
abilities . any? { | ability | can? ( current_user , ability , @project ) }
end
2013-06-13 15:58:27 -04:00
def project_nav_tab? ( name )
project_nav_tabs . include? name
end
2015-04-03 06:22:44 -04:00
def project_for_deploy_key ( deploy_key )
2016-11-16 07:31:08 -05:00
if deploy_key . has_access_to? ( @project )
2015-04-03 06:22:44 -04:00
@project
else
2016-11-17 14:56:35 -05:00
deploy_key . projects . find do | project |
can? ( current_user , :read_project , project )
end
2015-04-03 06:22:44 -04:00
end
end
2015-07-06 08:38:43 -04:00
def can_change_visibility_level? ( project , current_user )
return false unless can? ( current_user , :change_visibility_level , project )
if project . forked?
project . forked_from_project . visibility_level > Gitlab :: VisibilityLevel :: PRIVATE
else
true
end
end
2016-04-22 09:03:54 -04:00
def license_short_name ( project )
2017-05-08 19:50:23 -04:00
license = project . repository . license
license & . nickname || license & . name || 'LICENSE'
2016-04-22 09:03:54 -04:00
end
2016-08-24 07:13:26 -04:00
def last_push_event
return unless current_user
2017-05-20 15:27:35 -04:00
return current_user . recent_push unless @project
2016-08-24 07:13:26 -04:00
project_ids = [ @project . id ]
if fork = current_user . fork_of ( @project )
project_ids << fork . id
end
current_user . recent_push ( project_ids )
end
2016-09-02 11:30:54 -04:00
def project_feature_access_select ( field )
# Don't show option "everyone with access" if project is private
options = project_feature_options
if @project . private?
2016-09-16 15:15:39 -04:00
level = @project . project_feature . send ( field )
2017-06-06 04:28:39 -04:00
disabled_option = ProjectFeature :: ENABLED
highest_available_option = ProjectFeature :: PRIVATE if level == disabled_option
2016-09-02 11:30:54 -04:00
end
2017-06-06 04:28:39 -04:00
options = options_for_select (
2017-06-07 16:13:44 -04:00
options . invert ,
2017-06-06 04:28:39 -04:00
selected : highest_available_option || @project . project_feature . public_send ( field ) ,
disabled : disabled_option
)
2016-09-16 15:15:39 -04:00
2017-06-19 09:50:30 -04:00
content_tag :div , class : " select-wrapper " do
concat (
content_tag (
:select ,
options ,
name : " project[project_feature_attributes][ #{ field } ] " ,
id : " project_project_feature_attributes_ #{ field } " ,
class : " pull-right form-control select-control #{ repo_children_classes ( field ) } " ,
data : { field : field }
)
)
concat (
icon ( 'chevron-down' )
)
end . html_safe
2016-09-02 11:30:54 -04:00
end
2017-02-06 11:59:54 -05:00
def link_to_autodeploy_doc
2017-06-07 16:13:44 -04:00
link_to _ ( 'About auto deploy' ) , help_page_path ( 'ci/autodeploy/index' ) , target : '_blank'
2017-02-06 11:59:54 -05:00
end
2017-02-07 10:59:38 -05:00
def autodeploy_flash_notice ( branch_name )
2017-06-07 16:13:44 -04:00
translation = _ ( " Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc} " ) %
{ branch_name : truncate ( sanitize ( branch_name ) ) , link_to_autodeploy_doc : link_to_autodeploy_doc }
translation . html_safe
2017-02-07 10:59:38 -05:00
end
2017-03-16 05:53:48 -04:00
def project_list_cache_key ( project )
2017-05-12 06:33:26 -04:00
key = [
2017-05-12 11:26:01 -04:00
project . route . cache_key ,
2017-05-12 06:33:26 -04:00
project . cache_key ,
controller . controller_name ,
controller . action_name ,
current_application_settings . cache_key ,
2017-07-17 10:37:40 -04:00
'v2.5'
2017-05-12 06:33:26 -04:00
]
2017-03-16 05:53:48 -04:00
key << pipeline_status_cache_key ( project . pipeline_status ) if project . pipeline_status . has_status?
key
end
2017-04-26 08:04:22 -04:00
def load_pipeline_status ( projects )
2017-06-21 09:48:12 -04:00
Gitlab :: Cache :: Ci :: ProjectPipelineStatus
. load_in_batch_for_projects ( projects )
2017-04-26 08:04:22 -04:00
end
2017-06-12 12:13:22 -04:00
def show_no_ssh_key_message?
cookies [ :hide_no_ssh_message ] . blank? && ! current_user . hide_no_ssh_key && current_user . require_ssh_key?
end
def show_no_password_message?
cookies [ :hide_no_password_message ] . blank? && ! current_user . hide_no_password &&
2017-06-27 14:02:09 -04:00
( current_user . require_password_creation? || current_user . require_personal_access_token_creation_for_git_auth? )
2017-06-12 12:13:22 -04:00
end
def link_to_set_password
2017-06-27 14:02:09 -04:00
if current_user . require_password_creation?
2017-06-12 12:13:22 -04:00
link_to s_ ( 'SetPasswordToCloneLink|set a password' ) , edit_profile_password_path
else
link_to s_ ( 'CreateTokenToCloneLink|create a personal access token' ) , profile_personal_access_tokens_path
end
end
2017-08-04 09:40:33 -04:00
# Returns true if any projects are present.
#
# If the relation has a LIMIT applied we'll cast the relation to an Array
# since repeated any? checks would otherwise result in multiple COUNT queries
# being executed.
#
# If no limit is applied we'll just issue a COUNT since the result set could
# be too large to load into memory.
def any_projects? ( projects )
if projects . limit_value
projects . to_a . any?
else
projects . except ( :offset ) . any?
end
end
def has_projects_or_name? ( projects , params )
! ! ( params [ :name ] || any_projects? ( projects ) )
end
2013-06-13 15:58:27 -04:00
private
2016-09-16 15:15:39 -04:00
def repo_children_classes ( field )
needs_repo_check = [ :merge_requests_access_level , :builds_access_level ]
return unless needs_repo_check . include? ( field )
classes = " project-repo-select js-repo-select "
classes << " disabled " unless @project . feature_available? ( :repository , current_user )
classes
end
2013-06-13 15:58:27 -04:00
def get_project_nav_tabs ( project , current_user )
2016-05-03 08:58:50 -04:00
nav_tabs = [ :home ]
2013-06-13 15:58:27 -04:00
2013-06-23 14:39:46 -04:00
if ! project . empty_repo? && can? ( current_user , :download_code , project )
2016-05-03 08:58:50 -04:00
nav_tabs << [ :files , :commits , :network , :graphs , :forks ]
2013-06-13 15:58:27 -04:00
end
2015-05-25 10:42:41 -04:00
if project . repo_exists? && can? ( current_user , :read_merge_request , project )
2013-06-13 15:58:27 -04:00
nav_tabs << :merge_requests
end
2016-05-18 13:28:48 -04:00
if Gitlab . config . registry . enabled && can? ( current_user , :read_container_image , project )
2016-05-09 15:34:10 -04:00
nav_tabs << :container_registry
2016-04-18 08:14:40 -04:00
end
2017-05-05 14:16:54 -04:00
if project . builds_enabled? && can? ( current_user , :read_pipeline , project )
nav_tabs << :pipelines
end
2017-05-29 09:52:02 -04:00
tab_ability_map . each do | tab , ability |
if can? ( current_user , ability , project )
nav_tabs << tab
end
end
nav_tabs . flatten
end
def tab_ability_map
{
2017-07-07 10:40:41 -04:00
environments : :read_environment ,
milestones : :read_milestone ,
snippets : :read_project_snippet ,
settings : :admin_project ,
builds : :read_build ,
labels : :read_label ,
issues : :read_issue ,
project_members : :read_project_member ,
wiki : :read_wiki
2016-12-21 13:36:24 -05:00
}
2017-05-29 09:52:02 -04:00
end
2016-12-21 13:36:24 -05:00
2017-05-29 09:52:02 -04:00
def search_tab_ability_map
@search_tab_ability_map || = tab_ability_map . merge (
blobs : :download_code ,
commits : :download_code ,
merge_requests : :read_merge_request ,
notes : [ :read_merge_request , :download_code , :read_issue , :read_project_snippet ]
)
2013-06-13 15:58:27 -04:00
end
2013-09-24 15:14:28 -04:00
2016-08-24 18:08:23 -04:00
def project_lfs_status ( project )
if project . lfs_enabled?
2016-08-30 18:17:45 -04:00
content_tag ( :span , class : 'lfs-enabled' ) do
2017-06-07 16:13:44 -04:00
s_ ( 'LFSStatus|Enabled' )
2016-08-24 18:08:23 -04:00
end
else
2016-08-30 18:17:45 -04:00
content_tag ( :span , class : 'lfs-disabled' ) do
2017-06-07 16:13:44 -04:00
s_ ( 'LFSStatus|Disabled' )
2016-08-24 18:08:23 -04:00
end
end
end
2013-09-24 15:14:28 -04:00
def git_user_name
if current_user
current_user . name
else
2017-06-07 16:13:44 -04:00
_ ( " Your name " )
2013-09-24 15:14:28 -04:00
end
end
def git_user_email
if current_user
current_user . email
else
" your@email.com "
end
end
2013-10-10 04:05:49 -04:00
2015-11-24 19:32:06 -05:00
def default_url_to_repo ( project = @project )
2016-05-04 17:05:16 -04:00
case default_clone_protocol
when 'ssh'
2015-12-06 14:48:04 -05:00
project . ssh_url_to_repo
else
2017-05-30 08:11:58 -04:00
project . http_url_to_repo
2015-12-06 14:48:04 -05:00
end
2013-12-03 21:13:19 -05:00
end
2013-12-27 05:13:30 -05:00
2013-12-03 21:13:19 -05:00
def default_clone_protocol
2016-06-15 18:30:55 -04:00
if allowed_protocols_present?
enabled_protocol
2015-12-06 14:48:04 -05:00
else
2016-06-15 18:30:55 -04:00
if ! current_user || current_user . require_ssh_key?
gitlab_config . protocol
else
'ssh'
end
2015-12-06 14:48:04 -05:00
end
2013-12-03 21:13:19 -05:00
end
2013-12-29 06:55:45 -05:00
def project_last_activity ( project )
if project . last_activity_at
2015-06-17 14:04:14 -04:00
time_ago_with_tooltip ( project . last_activity_at , placement : 'bottom' , html_class : 'last_activity_time_ago' )
2013-12-29 06:55:45 -05:00
else
2017-06-07 16:13:44 -04:00
s_ ( " ProjectLastActivity|Never " )
2013-12-29 06:55:45 -05:00
end
end
2014-07-15 08:34:06 -04:00
2017-04-19 20:37:44 -04:00
def add_special_file_path ( project , file_name : , commit_message : nil , branch_name : nil , context : nil )
2017-06-07 16:13:44 -04:00
commit_message || = s_ ( " CommitMessage|Add %{file_name} " ) % { file_name : file_name . downcase }
2017-06-29 13:06:35 -04:00
project_new_blob_path (
2016-04-11 09:49:25 -04:00
project ,
project . default_branch || 'master' ,
file_name : file_name ,
2017-06-07 16:13:44 -04:00
commit_message : commit_message ,
2017-04-19 20:37:44 -04:00
branch_name : branch_name ,
2016-12-21 10:21:55 -05:00
context : context
2016-04-11 09:49:25 -04:00
)
2015-07-30 09:12:57 -04:00
end
2016-07-25 23:59:39 -04:00
def add_koding_stack_path ( project )
2017-06-29 13:06:35 -04:00
project_new_blob_path (
2016-07-25 23:59:39 -04:00
project ,
project . default_branch || 'master' ,
file_name : '.koding.yml' ,
commit_message : " Add Koding stack script " ,
content : <<-CONTENT.strip_heredoc
provider :
aws :
access_key : '${var.aws_access_key}'
secret_key : '${var.aws_secret_key}'
resource :
aws_instance :
#{project.path}-vm:
instance_type : t2 . nano
user_data : | -
# Created by GitLab UI for :>
echo _KD_NOTIFY_ @Installing Base packages ... @
apt - get update - y
apt - get install git - y
echo _KD_NOTIFY_ @Cloning #{project.name}...@
export KODING_USER = $ { var . koding_user_username }
export REPO_URL = #{root_url}${var.koding_queryString_repo}.git
export BRANCH = $ { var . koding_queryString_branch }
sudo - i - u $KODING_USER git clone $REPO_URL - b $BRANCH
echo _KD_NOTIFY_ @ #{project.name} cloned.@
CONTENT
)
end
def koding_project_url ( project = nil , branch = nil , sha = nil )
if project
import_path = " /Home/Stacks/import "
2017-07-20 05:34:09 -04:00
repo = project . full_path
2016-07-25 23:59:39 -04:00
branch || = project . default_branch
sha || = project . commit . short_id
path = " #{ import_path } ?repo= #{ repo } &branch= #{ branch } &sha= #{ sha } "
return URI . join ( current_application_settings . koding_url , path ) . to_s
end
current_application_settings . koding_url
end
2015-07-30 09:12:57 -04:00
def contribution_guide_path ( project )
2015-03-17 13:37:50 -04:00
if project && contribution_guide = project . repository . contribution_guide
2017-06-29 13:06:35 -04:00
project_blob_path (
2015-01-24 13:02:58 -05:00
project ,
tree_join ( project . default_branch ,
2015-03-17 13:37:50 -04:00
contribution_guide . name )
)
end
end
2015-07-21 21:30:27 -04:00
def readme_path ( project )
filename_path ( project , :readme )
end
2015-07-30 09:12:57 -04:00
def changelog_path ( project )
2015-07-21 21:30:27 -04:00
filename_path ( project , :changelog )
2015-03-17 13:37:50 -04:00
end
2015-07-30 09:12:57 -04:00
def license_path ( project )
2016-04-11 09:49:25 -04:00
filename_path ( project , :license_blob )
2015-03-17 13:37:50 -04:00
end
2015-07-30 09:12:57 -04:00
def version_path ( project )
2015-07-21 21:30:27 -04:00
filename_path ( project , :version )
2014-07-15 08:34:06 -04:00
end
2014-08-26 03:11:11 -04:00
2016-07-28 13:06:15 -04:00
def ci_configuration_path ( project )
filename_path ( project , :gitlab_ci_yml )
end
2015-01-06 03:50:37 -05:00
def project_wiki_path_with_version ( proj , page , version , is_newest )
url_params = is_newest ? { } : { version_id : version }
2017-06-29 13:06:35 -04:00
project_wiki_path ( proj , page , url_params )
2015-01-06 03:50:37 -05:00
end
2015-01-13 13:35:16 -05:00
2014-12-31 08:07:48 -05:00
def project_status_css_class ( status )
case status
when " started "
" active "
when " failed "
" danger "
when " finished "
" success "
end
end
2016-12-08 11:28:49 -05:00
2015-07-09 08:47:28 -04:00
def readme_cache_key
2015-07-24 02:52:21 -04:00
sha = @project . commit . try ( :sha ) || 'nil'
2017-07-20 05:34:09 -04:00
[ @project . full_path , sha , " readme " ] . join ( '-' )
2015-07-09 08:47:28 -04:00
end
2015-07-17 09:22:56 -04:00
2015-09-14 14:23:01 -04:00
def current_ref
@ref || @repository . try ( :root_ref )
end
2015-09-14 13:46:58 -04:00
2015-07-21 21:30:27 -04:00
def filename_path ( project , filename )
if project && blob = project . repository . send ( filename )
2017-06-29 13:06:35 -04:00
project_blob_path (
2015-12-14 21:53:52 -05:00
project ,
tree_join ( project . default_branch , blob . name )
2015-07-21 21:30:27 -04:00
)
end
end
2016-05-04 00:32:49 -04:00
2016-06-22 17:04:51 -04:00
def sanitize_repo_path ( project , message )
2016-05-04 00:32:49 -04:00
return '' unless message . present?
2017-04-05 17:55:19 -04:00
exports_path = File . join ( Settings . shared [ 'path' ] , 'tmp/project_exports' )
filtered_message = message . strip . gsub ( exports_path , " [REPO EXPORT PATH] " )
filtered_message . gsub ( project . repository_storage_path . chomp ( '/' ) , " [REPOS PATH] " )
2016-05-04 00:32:49 -04:00
end
2016-08-01 18:31:21 -04:00
def project_feature_options
{
2017-06-07 16:13:44 -04:00
ProjectFeature :: DISABLED = > s_ ( 'ProjectFeature|Disabled' ) ,
ProjectFeature :: PRIVATE = > s_ ( 'ProjectFeature|Only team members' ) ,
ProjectFeature :: ENABLED = > s_ ( 'ProjectFeature|Everyone with access' )
2016-08-01 18:31:21 -04:00
}
end
2016-09-16 15:15:39 -04:00
def project_child_container_class ( view_path )
view_path == " projects/issues/issues " ? " prepend-top-default " : " project-show- #{ view_path } "
end
2016-11-05 13:28:29 -04:00
def project_issues ( project )
IssuesFinder . new ( current_user , project_id : project . id ) . execute
end
2016-11-22 12:16:30 -05:00
def visibility_select_options ( project , selected_level )
2017-04-17 09:57:09 -04:00
level_options = Gitlab :: VisibilityLevel . values . each_with_object ( [ ] ) do | level , level_options |
next if restricted_levels . include? ( level )
level_options << [
2016-11-22 12:16:30 -05:00
visibility_level_label ( level ) ,
{ data : { description : visibility_level_description ( level , project ) } } ,
level
]
end
2017-04-17 09:57:09 -04:00
options_for_select ( level_options , selected_level )
end
def restricted_levels
return [ ] if current_user . admin?
current_application_settings . restricted_visibility_levels || [ ]
2016-11-22 12:16:30 -05:00
end
2017-07-13 10:23:55 -04:00
def find_file_path
return unless @project && ! @project . empty_repo?
ref = @ref || @project . repository . root_ref
project_find_file_path ( @project , ref )
end
2012-09-07 12:57:13 -04:00
end