projects_helper.rb 8.9 KB
Newer Older
R
randx 已提交
1
module ProjectsHelper
2 3 4 5
  def remove_from_project_team_message(project, member)
    if member.user
      "You are going to remove #{member.user.name} from #{project.name} project team. Are you sure?"
    else
6
      "You are going to revoke the invitation for #{member.invite_email} to join #{project.name} project team. Are you sure?"
7
    end
D
Dmitriy Zaporozhets 已提交
8
  end
9

10
  def link_to_project(project)
V
Vinnie Okada 已提交
11
    link_to [project.namespace.becomes(Namespace), project] do
12
      title = content_tag(:span, project.name, class: 'project-name')
13 14

      if project.namespace
D
Dmitriy Zaporozhets 已提交
15
        namespace = content_tag(:span, "#{project.namespace.human_name} / ", class: 'namespace-name')
16 17 18 19 20
        title = namespace + title
      end

      title
    end
21
  end
R
randx 已提交
22

23
  def link_to_member(project, author, opts = {})
24
    default_opts = { avatar: true, name: true, size: 16, author_class: 'author', title: ":name" }
25 26
    opts = default_opts.merge(opts)

27 28
    return "(deleted)" unless author

29 30
    author_html =  ""

31
    # Build avatar image tag
32
    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]
33

34
    # Build name span tag
35
    author_html << content_tag(:span, sanitize(author.name), class: opts[:author_class]) if opts[:name]
36

37
    author_html = author_html.html_safe
38

39 40 41
    if opts[:name]
      link_to(author_html, user_path(author), class: "author_link").html_safe
    else
42
      title = opts[:title].sub(":name", sanitize(author.name))
43
      link_to(author_html, user_path(author), class: "author_link has_tooltip", data: { 'original-title'.to_sym => title, container: 'body' } ).html_safe
44
    end
R
randx 已提交
45
  end
46

47 48 49 50 51 52 53
  def project_title(project, name = nil, url = nil)
    namespace_link =
      if project.group
        link_to(simple_sanitize(project.group.name), group_path(project.group))
      else
        owner = project.namespace.owner
        link_to(simple_sanitize(owner.name), user_path(owner))
54
      end
55

P
Phil Hughes 已提交
56
    project_link = link_to project_path(project), { class: "project-item-select-holder #{"js-projects-dropdown-toggle" if current_user}" } do
P
Phil Hughes 已提交
57
      link_output = simple_sanitize(project.name)
P
Phil Hughes 已提交
58
      link_output += content_tag :span, nil, { class: "fa fa-chevron-down dropdown-toggle-caret" } if current_user
59

60 61 62 63
      if current_user
        link_output += project_select_tag :project_path, class: "project-item-select js-projects-dropdown",
          data: { include_groups: false, order_by: 'last_activity_at' }
      end
64 65

      link_output
66
    end
67 68 69 70

    full_title = namespace_link + ' / ' + project_link
    full_title += ' &middot; '.html_safe + link_to(simple_sanitize(name), url) if name

71
    full_title
72
  end
73 74 75 76

  def remove_project_message(project)
    "You are going to remove #{project.name_with_namespace}.\n Removed project CANNOT be restored!\n Are you ABSOLUTELY sure?"
  end
77

78 79 80 81
  def transfer_project_message(project)
    "You are going to transfer #{project.name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
  end

82
  def remove_fork_project_message(project)
D
Douwe Maan 已提交
83
    "You are going to remove the fork relationship to source project #{@project.forked_from_project.name_with_namespace}.  Are you ABSOLUTELY sure?"
84 85
  end

86 87 88 89 90 91 92 93
  def project_nav_tabs
    @nav_tabs ||= get_project_nav_tabs(@project, current_user)
  end

  def project_nav_tab?(name)
    project_nav_tabs.include? name
  end

94
  def project_active_milestones
95
    @project.milestones.active.order("due_date, title ASC")
96 97
  end

D
Douwe Maan 已提交
98 99 100 101 102 103 104 105
  def project_for_deploy_key(deploy_key)
    if deploy_key.projects.include?(@project)
      @project
    else
      deploy_key.projects.find { |project| can?(current_user, :read_project, project) }
    end
  end

V
Valery Sizov 已提交
106 107 108 109 110 111 112 113 114 115
  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

D
Drew Blessing 已提交
116 117 118 119 120 121 122 123
  def user_max_access_in_project(user_id, project)
    level = project.team.max_member_access(user_id)

    if level
      Gitlab::Access.options_with_owner.key(level)
    end
  end

124 125 126
  private

  def get_project_nav_tabs(project, current_user)
127
    nav_tabs = [:home, :forks]
128

129
    if !project.empty_repo? && can?(current_user, :download_code, project)
130 131 132
      nav_tabs << [:files, :commits, :network, :graphs]
    end

133
    if project.repo_exists? && can?(current_user, :read_merge_request, project)
134 135 136
      nav_tabs << :merge_requests
    end

137
    if project.builds_enabled? && can?(current_user, :read_build, project)
K
Kamil Trzcinski 已提交
138 139 140
      nav_tabs << :builds
    end

141 142 143 144
    if can?(current_user, :admin_project, project)
      nav_tabs << :settings
    end

145 146
    if can?(current_user, :read_issue, project)
      nav_tabs << :issues
147 148
    end

149 150 151 152 153 154 155 156
    if can?(current_user, :read_wiki, project)
      nav_tabs << :wiki
    end

    if can?(current_user, :read_project_snippet, project)
      nav_tabs << :snippets
    end

157 158 159 160
    if can?(current_user, :read_label, project)
      nav_tabs << :labels
    end

161
    if can?(current_user, :read_milestone, project)
162
      nav_tabs << :milestones
163 164
    end

165 166
    nav_tabs.flatten
  end
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182

  def git_user_name
    if current_user
      current_user.name
    else
      "Your name"
    end
  end

  def git_user_email
    if current_user
      current_user.email
    else
      "your@email.com"
    end
  end
183

D
Douwe Maan 已提交
184 185
  def repository_size(project = @project)
    "#{project.repository_size} MB"
186 187 188 189 190 191
  rescue
    # In order to prevent 500 error
    # when application cannot allocate memory
    # to calculate repo size - just show 'Unknown'
    'unknown'
  end
192

193
  def default_url_to_repo(project = @project)
194 195 196 197 198
    if default_clone_protocol == "ssh"
      project.ssh_url_to_repo
    else
      project.http_url_to_repo
    end
199
  end
200

201
  def default_clone_protocol
202
    if !current_user || current_user.require_ssh_key?
203 204 205 206
      "http"
    else
      "ssh"
    end
207
  end
208 209 210

  def project_last_activity(project)
    if project.last_activity_at
211
      time_ago_with_tooltip(project.last_activity_at, placement: 'bottom', html_class: 'last_activity_time_ago')
212 213 214 215
    else
      "Never"
    end
  end
D
Dmitriy Zaporozhets 已提交
216

217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
  def add_contribution_guide_path(project)
    if project && !project.repository.contribution_guide
      namespace_project_new_blob_path(
        project.namespace,
        project,
        project.default_branch,
        file_name:      "CONTRIBUTING.md",
        commit_message: "Add contribution guide"
      )
    end
  end

  def add_changelog_path(project)
    if project && !project.repository.changelog
      namespace_project_new_blob_path(
        project.namespace,
        project,
        project.default_branch,
        file_name:      "CHANGELOG",
        commit_message: "Add changelog"
      )
    end
  end

  def add_license_path(project)
    if project && !project.repository.license
      namespace_project_new_blob_path(
        project.namespace,
        project,
        project.default_branch,
        file_name:      "LICENSE",
        commit_message: "Add license"
      )
    end
  end

  def contribution_guide_path(project)
254
    if project && contribution_guide = project.repository.contribution_guide
V
Vinnie Okada 已提交
255 256 257 258
      namespace_project_blob_path(
        project.namespace,
        project,
        tree_join(project.default_branch,
259 260 261 262 263
                  contribution_guide.name)
      )
    end
  end

264 265 266 267
  def readme_path(project)
    filename_path(project, :readme)
  end

268
  def changelog_path(project)
269
    filename_path(project, :changelog)
270 271
  end

272
  def license_path(project)
273
    filename_path(project, :license)
274 275
  end

276
  def version_path(project)
277
    filename_path(project, :version)
D
Dmitriy Zaporozhets 已提交
278
  end
279

280 281
  def project_wiki_path_with_version(proj, page, version, is_newest)
    url_params = is_newest ? {} : { version_id: version }
V
Vinnie Okada 已提交
282
    namespace_project_wiki_path(proj.namespace, proj, page, url_params)
283
  end
284

V
Valery Sizov 已提交
285 286 287 288 289 290 291 292 293 294
  def project_status_css_class(status)
    case status
    when "started"
      "active"
    when "failed"
      "danger"
    when "finished"
      "success"
    end
  end
295

296 297 298
  def leave_project_message(project)
    "Are you sure you want to leave \"#{project.name}\" project?"
  end
299 300 301 302 303 304 305

  def new_readme_path
    ref = @repository.root_ref if @repository
    ref ||= 'master'

    namespace_project_new_blob_path(@project.namespace, @project, tree_join(ref), file_name: 'README.md')
  end
306 307 308 309 310 311

  def last_push_event
    if current_user
      current_user.recent_push(@project.id)
    end
  end
312 313

  def readme_cache_key
314
    sha = @project.commit.try(:sha) || 'nil'
315
    [@project.path_with_namespace, sha, "readme"].join('-')
316
  end
317 318 319 320 321 322 323 324 325 326 327 328 329 330

  def round_commit_count(project)
    count = project.commit_count

    if count > 10000
      '10000+'
    elsif count > 5000
      '5000+'
    elsif count > 1000
      '1000+'
    else
      count
    end
  end
331

332 333 334
  def current_ref
    @ref || @repository.try(:root_ref)
  end
335

336 337 338 339 340
  private

  def filename_path(project, filename)
    if project && blob = project.repository.send(filename)
      namespace_project_blob_path(
G
Gabriel Mazetto 已提交
341 342 343
        project.namespace,
        project,
        tree_join(project.default_branch, blob.name)
344 345 346
      )
    end
  end
R
randx 已提交
347
end