PageRenderTime 90ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/app/helpers/projects_helper.rb

https://gitlab.com/jamesmills/gitlab-ce
Ruby | 351 lines | 277 code | 72 blank | 2 comment | 47 complexity | ec03cab9112012c4898ea0cb417b8ccb MD5 | raw file
  1. module ProjectsHelper
  2. def remove_from_project_team_message(project, member)
  3. if member.user
  4. "You are going to remove #{member.user.name} from #{project.name} project team. Are you sure?"
  5. else
  6. "You are going to revoke the invitation for #{member.invite_email} to join #{project.name} project team. Are you sure?"
  7. end
  8. end
  9. def link_to_project(project)
  10. link_to [project.namespace.becomes(Namespace), project], title: h(project.name) do
  11. title = content_tag(:span, project.name, class: 'project-name')
  12. if project.namespace
  13. namespace = content_tag(:span, "#{project.namespace.human_name} / ", class: 'namespace-name')
  14. title = namespace + title
  15. end
  16. title
  17. end
  18. end
  19. def link_to_member_avatar(author, opts = {})
  20. default_opts = { avatar: true, name: true, size: 16, author_class: 'author', title: ":name" }
  21. opts = default_opts.merge(opts)
  22. image_tag(avatar_icon(author, opts[:size]), width: opts[:size], class: "avatar avatar-inline #{"s#{opts[:size]}" if opts[:size]}", alt:'') if opts[:avatar]
  23. end
  24. def link_to_member(project, author, opts = {}, &block)
  25. default_opts = { avatar: true, name: true, size: 16, author_class: 'author', title: ":name" }
  26. opts = default_opts.merge(opts)
  27. return "(deleted)" unless author
  28. author_html = ""
  29. # Build avatar image tag
  30. author_html << image_tag(avatar_icon(author, opts[:size]), width: opts[:size], class: "avatar avatar-inline #{"s#{opts[:size]}" if opts[:size]}", alt:'') if opts[:avatar]
  31. # Build name span tag
  32. if opts[:by_username]
  33. author_html << content_tag(:span, sanitize("@#{author.username}"), class: opts[:author_class]) if opts[:name]
  34. else
  35. author_html << content_tag(:span, sanitize(author.name), class: opts[:author_class]) if opts[:name]
  36. end
  37. author_html << capture(&block) if block
  38. author_html = author_html.html_safe
  39. if opts[:name]
  40. link_to(author_html, user_path(author), class: "author_link #{"#{opts[:mobile_classes]}" if opts[:mobile_classes]}").html_safe
  41. else
  42. title = opts[:title].sub(":name", sanitize(author.name))
  43. link_to(author_html, user_path(author), class: "author_link has-tooltip", title: title, data: { container: 'body' } ).html_safe
  44. end
  45. end
  46. def project_title(project, name = nil, url = nil)
  47. namespace_link =
  48. if project.group
  49. link_to(simple_sanitize(project.group.name), group_path(project.group))
  50. else
  51. owner = project.namespace.owner
  52. link_to(simple_sanitize(owner.name), user_path(owner))
  53. end
  54. project_link = link_to simple_sanitize(project.name), project_path(project), { class: "project-item-select-holder" }
  55. if current_user
  56. project_link << icon("chevron-down", class: "dropdown-toggle-caret js-projects-dropdown-toggle", data: { target: ".js-dropdown-menu-projects", toggle: "dropdown" })
  57. end
  58. full_title = "#{namespace_link} / #{project_link}".html_safe
  59. full_title << ' &middot; '.html_safe << link_to(simple_sanitize(name), url) if name
  60. full_title
  61. end
  62. def remove_project_message(project)
  63. "You are going to remove #{project.name_with_namespace}.\n Removed project CANNOT be restored!\n Are you ABSOLUTELY sure?"
  64. end
  65. def transfer_project_message(project)
  66. "You are going to transfer #{project.name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
  67. end
  68. def remove_fork_project_message(project)
  69. "You are going to remove the fork relationship to source project #{@project.forked_from_project.name_with_namespace}. Are you ABSOLUTELY sure?"
  70. end
  71. def project_nav_tabs
  72. @nav_tabs ||= get_project_nav_tabs(@project, current_user)
  73. end
  74. def project_nav_tab?(name)
  75. project_nav_tabs.include? name
  76. end
  77. def project_for_deploy_key(deploy_key)
  78. if deploy_key.projects.include?(@project)
  79. @project
  80. else
  81. deploy_key.projects.find { |project| can?(current_user, :read_project, project) }
  82. end
  83. end
  84. def can_change_visibility_level?(project, current_user)
  85. return false unless can?(current_user, :change_visibility_level, project)
  86. if project.forked?
  87. project.forked_from_project.visibility_level > Gitlab::VisibilityLevel::PRIVATE
  88. else
  89. true
  90. end
  91. end
  92. def user_max_access_in_project(user_id, project)
  93. level = project.team.max_member_access(user_id)
  94. if level
  95. Gitlab::Access.options_with_owner.key(level)
  96. end
  97. end
  98. def license_short_name(project)
  99. return 'LICENSE' if project.repository.license_key.nil?
  100. license = Licensee::License.new(project.repository.license_key)
  101. license.nickname || license.name
  102. end
  103. private
  104. def get_project_nav_tabs(project, current_user)
  105. nav_tabs = [:home]
  106. if !project.empty_repo? && can?(current_user, :download_code, project)
  107. nav_tabs << [:files, :commits, :network, :graphs, :forks]
  108. end
  109. if project.repo_exists? && can?(current_user, :read_merge_request, project)
  110. nav_tabs << :merge_requests
  111. end
  112. if can?(current_user, :read_pipeline, project)
  113. nav_tabs << :pipelines
  114. end
  115. if can?(current_user, :read_build, project)
  116. nav_tabs << :builds
  117. end
  118. if Gitlab.config.registry.enabled && can?(current_user, :read_container_image, project)
  119. nav_tabs << :container_registry
  120. end
  121. if can?(current_user, :admin_project, project)
  122. nav_tabs << :settings
  123. end
  124. if can?(current_user, :read_project_member, project)
  125. nav_tabs << :team
  126. end
  127. if can?(current_user, :read_issue, project)
  128. nav_tabs << :issues
  129. end
  130. if can?(current_user, :read_wiki, project)
  131. nav_tabs << :wiki
  132. end
  133. if can?(current_user, :read_project_snippet, project)
  134. nav_tabs << :snippets
  135. end
  136. if can?(current_user, :read_label, project)
  137. nav_tabs << :labels
  138. end
  139. if can?(current_user, :read_milestone, project)
  140. nav_tabs << :milestones
  141. end
  142. nav_tabs.flatten
  143. end
  144. def git_user_name
  145. if current_user
  146. current_user.name
  147. else
  148. "Your name"
  149. end
  150. end
  151. def git_user_email
  152. if current_user
  153. current_user.email
  154. else
  155. "your@email.com"
  156. end
  157. end
  158. def repository_size(project = @project)
  159. size_in_bytes = project.repository_size * 1.megabyte
  160. number_to_human_size(size_in_bytes, delimiter: ',', precision: 2)
  161. end
  162. def default_url_to_repo(project = @project)
  163. case default_clone_protocol
  164. when 'ssh'
  165. project.ssh_url_to_repo
  166. else
  167. project.http_url_to_repo
  168. end
  169. end
  170. def default_clone_protocol
  171. if !current_user || current_user.require_ssh_key?
  172. gitlab_config.protocol
  173. else
  174. "ssh"
  175. end
  176. end
  177. def project_last_activity(project)
  178. if project.last_activity_at
  179. time_ago_with_tooltip(project.last_activity_at, placement: 'bottom', html_class: 'last_activity_time_ago')
  180. else
  181. "Never"
  182. end
  183. end
  184. def add_special_file_path(project, file_name:, commit_message: nil)
  185. namespace_project_new_blob_path(
  186. project.namespace,
  187. project,
  188. project.default_branch || 'master',
  189. file_name: file_name,
  190. commit_message: commit_message || "Add #{file_name.downcase}"
  191. )
  192. end
  193. def contribution_guide_path(project)
  194. if project && contribution_guide = project.repository.contribution_guide
  195. namespace_project_blob_path(
  196. project.namespace,
  197. project,
  198. tree_join(project.default_branch,
  199. contribution_guide.name)
  200. )
  201. end
  202. end
  203. def readme_path(project)
  204. filename_path(project, :readme)
  205. end
  206. def changelog_path(project)
  207. filename_path(project, :changelog)
  208. end
  209. def license_path(project)
  210. filename_path(project, :license_blob)
  211. end
  212. def version_path(project)
  213. filename_path(project, :version)
  214. end
  215. def project_wiki_path_with_version(proj, page, version, is_newest)
  216. url_params = is_newest ? {} : { version_id: version }
  217. namespace_project_wiki_path(proj.namespace, proj, page, url_params)
  218. end
  219. def project_status_css_class(status)
  220. case status
  221. when "started"
  222. "active"
  223. when "failed"
  224. "danger"
  225. when "finished"
  226. "success"
  227. end
  228. end
  229. def leave_project_message(project)
  230. "Are you sure you want to leave \"#{project.name}\" project?"
  231. end
  232. def new_readme_path
  233. ref = @repository.root_ref if @repository
  234. ref ||= 'master'
  235. namespace_project_new_blob_path(@project.namespace, @project, tree_join(ref), file_name: 'README.md')
  236. end
  237. def new_license_path
  238. ref = @repository.root_ref if @repository
  239. ref ||= 'master'
  240. namespace_project_new_blob_path(@project.namespace, @project, tree_join(ref), file_name: 'LICENSE')
  241. end
  242. def last_push_event
  243. if current_user
  244. current_user.recent_push(@project.id)
  245. end
  246. end
  247. def readme_cache_key
  248. sha = @project.commit.try(:sha) || 'nil'
  249. [@project.path_with_namespace, sha, "readme"].join('-')
  250. end
  251. def round_commit_count(project)
  252. count = project.commit_count
  253. if count > 10000
  254. '10000+'
  255. elsif count > 5000
  256. '5000+'
  257. elsif count > 1000
  258. '1000+'
  259. else
  260. count
  261. end
  262. end
  263. def current_ref
  264. @ref || @repository.try(:root_ref)
  265. end
  266. def filename_path(project, filename)
  267. if project && blob = project.repository.send(filename)
  268. namespace_project_blob_path(
  269. project.namespace,
  270. project,
  271. tree_join(project.default_branch, blob.name)
  272. )
  273. end
  274. end
  275. def sanitize_repo_path(message)
  276. return '' unless message.present?
  277. message.strip.gsub(Gitlab.config.gitlab_shell.repos_path.chomp('/'), "[REPOS PATH]")
  278. end
  279. end