Module: ProjectsHelper

Includes:
CompareHelper, Gitlab::Allowable, Gitlab::Utils::StrongMemoize
Included in:
GitlabRoutingHelper, MergeRequestWidgetEntity
Defined in:
app/helpers/projects_helper.rb

Instance Method Summary collapse

Methods included from Gitlab::Allowable

#can?

Methods included from CompareHelper

#create_mr_button?, #create_mr_path, #project_compare_selector_data, #target_projects

Instance Method Details

#able_to_see_forks_count?(project, user) ⇒ Boolean

Returns:

  • (Boolean)


455
456
457
# File 'app/helpers/projects_helper.rb', line 455

def able_to_see_forks_count?(project, user)
  project.forking_enabled? && can?(user, :read_code, project)
end

#able_to_see_issues?(project, user) ⇒ Boolean

Returns:

  • (Boolean)


447
448
449
# File 'app/helpers/projects_helper.rb', line 447

def able_to_see_issues?(project, user)
  project.issues_enabled? && can?(user, :read_issue, project)
end

#able_to_see_merge_requests?(project, user) ⇒ Boolean

Returns:

  • (Boolean)


451
452
453
# File 'app/helpers/projects_helper.rb', line 451

def able_to_see_merge_requests?(project, user)
  project.merge_requests_enabled? && can?(user, :read_merge_request, project)
end

#any_projects?(projects) ⇒ Boolean

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.

Returns:

  • (Boolean)


292
293
294
295
296
297
298
299
300
# File 'app/helpers/projects_helper.rb', line 292

def any_projects?(projects)
  return projects.any? if projects.is_a?(Array)

  if projects.limit_value
    projects.to_a.any?
  else
    projects.except(:offset).any?
  end
end

#author_content_tag(author, opts = {}) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'app/helpers/projects_helper.rb', line 38

def (author, opts = {})
  default_opts = { author_class: 'author', tooltip: false, by_username: false }
  opts = default_opts.merge(opts)

  has_tooltip = !opts[:by_username] && opts[:tooltip]

  username = opts[:by_username] ? author.to_reference : author.name
  name_tag_options = { class: [opts[:author_class]] }

  if has_tooltip
    name_tag_options[:title] = author.to_reference
    name_tag_options[:data] = { placement: 'top' }
    name_tag_options[:class] << 'has-tooltip'
  end

  # NOTE: ActionView::Helpers::TagHelper#content_tag HTML escapes username
  (:span, username, name_tag_options)
end

#autodeploy_flash_notice(branch_name) ⇒ Object



193
194
195
196
# File 'app/helpers/projects_helper.rb', line 193

def autodeploy_flash_notice(branch_name)
  html_escape(_("Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}")) %
    { branch_name: tag.strong(truncate(sanitize(branch_name))), link_to_autodeploy_doc: link_to_autodeploy_doc }
end

#badge_count(number) ⇒ Object



523
524
525
# File 'app/helpers/projects_helper.rb', line 523

def badge_count(number)
  format_cached_count(1000, number)
end

#branch_rules_pathObject



551
552
553
# File 'app/helpers/projects_helper.rb', line 551

def branch_rules_path
  project_settings_repository_path(@project, anchor: 'js-branch-rules')
end

#can_admin_associated_clusters?(project) ⇒ Boolean

Returns:

  • (Boolean)


547
548
549
# File 'app/helpers/projects_helper.rb', line 547

def can_admin_associated_clusters?(project)
  can_admin_project_clusters?(project) || can_admin_group_clusters?(project)
end

#can_admin_project_member?(project) ⇒ Boolean

Returns:

  • (Boolean)


364
365
366
# File 'app/helpers/projects_helper.rb', line 364

def can_admin_project_member?(project)
  Ability.allowed?(current_user, :admin_project_member, project) && !membership_locked?
end

#can_change_visibility_level?(project, current_user) ⇒ Boolean

Returns:

  • (Boolean)


175
176
177
# File 'app/helpers/projects_helper.rb', line 175

def can_change_visibility_level?(project, current_user)
  can?(current_user, :change_visibility_level, project)
end

#can_disable_emails?(project, current_user) ⇒ Boolean

Returns:

  • (Boolean)


179
180
181
182
183
# File 'app/helpers/projects_helper.rb', line 179

def can_disable_emails?(project, current_user)
  return false if project.group&.emails_disabled?

  can?(current_user, :set_emails_disabled, project)
end

#can_push_code?Boolean

Returns:

  • (Boolean)


543
544
545
# File 'app/helpers/projects_helper.rb', line 543

def can_push_code?
  current_user&.can?(:push_code, @project)
end

#can_view_branch_rules?Boolean

Returns:

  • (Boolean)


539
540
541
# File 'app/helpers/projects_helper.rb', line 539

def can_view_branch_rules?
  can?(current_user, :maintainer_access, @project)
end

#clusters_deprecation_alert_messageObject



501
502
503
504
505
506
507
# File 'app/helpers/projects_helper.rb', line 501

def clusters_deprecation_alert_message
  if has_active_license?
    s_('ClusterIntegration|The certificate-based Kubernetes integration is deprecated and will be removed in the future. You should %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}. For more information, see the %{deprecationLinkStart}deprecation epic%{deprecationLinkEnd}, or contact GitLab support.')
  else
    s_('ClusterIntegration|The certificate-based Kubernetes integration is deprecated and will be removed in the future. You should %{linkStart}migrate to the GitLab agent for Kubernetes%{linkEnd}. For more information, see the %{deprecationLinkStart}deprecation epic%{deprecationLinkEnd}.')
  end
end

#delete_confirm_phrase(project) ⇒ Object

Returns the confirm phrase the user needs to type in order to delete the project

Thus the phrase should include the namespace to make it very clear to the user which project is subject to deletion. Relevant issue: gitlab.com/gitlab-org/gitlab/-/issues/343591



443
444
445
# File 'app/helpers/projects_helper.rb', line 443

def delete_confirm_phrase(project)
  project.path_with_namespace
end

#directory?Boolean

Returns:

  • (Boolean)


350
351
352
# File 'app/helpers/projects_helper.rb', line 350

def directory?
  @path.present?
end

#error_tracking_setting_project_jsonObject



335
336
337
338
339
340
341
342
343
344
345
346
347
348
# File 'app/helpers/projects_helper.rb', line 335

def error_tracking_setting_project_json
  setting = @project.error_tracking_setting

  return if setting.blank? || setting.project_slug.blank? ||
      setting.organization_slug.blank?

  {
    sentry_project_id: setting.sentry_project_id,
    name: setting.project_name,
    organization_name: setting.organization_name,
    organization_slug: setting.organization_slug,
    slug: setting.project_slug
  }.to_json
end

#explore_projects_tab?Boolean

Returns:

  • (Boolean)


325
326
327
328
329
# File 'app/helpers/projects_helper.rb', line 325

def explore_projects_tab?
  current_page?(explore_projects_path) ||
    current_page?(trending_explore_projects_path) ||
    current_page?(starred_explore_projects_path)
end

#external_classification_label_help_messageObject



354
355
356
357
358
359
360
361
362
# File 'app/helpers/projects_helper.rb', line 354

def external_classification_label_help_message
  default_label = ::Gitlab::CurrentSettings.current_application_settings
                    .external_authorization_service_default_label

  s_(
    "ExternalAuthorizationService|When no classification label is set the "\
      "default label `%{default_label}` will be used."
  ) % { default_label: default_label }
end

#fork_button_data_attributes(project) ⇒ Object



459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
# File 'app/helpers/projects_helper.rb', line 459

def fork_button_data_attributes(project)
  return unless current_user

  if current_user.already_forked?(project) && current_user.forkable_namespaces.size < 2
    user_fork_url = namespace_project_path(current_user, current_user.fork_of(project))
  end

  {
    forks_count: project.forks_count,
    project_full_path: project.full_path,
    project_forks_url: project_forks_path(project),
    user_fork_url: user_fork_url,
    new_fork_url: new_project_fork_path(project),
    can_read_code: can?(current_user, :read_code, project).to_s,
    can_fork_project: can?(current_user, :fork_project, project).to_s,
    can_create_fork: can?(current_user, :create_fork).to_s
  }
end

#grafana_integration_enabled?Boolean

Returns:

  • (Boolean)


384
385
386
# File 'app/helpers/projects_helper.rb', line 384

def grafana_integration_enabled?
  @project.grafana_integration&.enabled?
end

#grafana_integration_masked_tokenObject



380
381
382
# File 'app/helpers/projects_helper.rb', line 380

def grafana_integration_masked_token
  @project.grafana_integration&.masked_token
end

#grafana_integration_urlObject



376
377
378
# File 'app/helpers/projects_helper.rb', line 376

def grafana_integration_url
  @project.grafana_integration&.grafana_url
end

#http_clone_url_to_repo(project) ⇒ Object



531
532
533
# File 'app/helpers/projects_helper.rb', line 531

def http_clone_url_to_repo(project)
  project.http_url_to_repo
end

#import_from_bitbucket_messageObject



478
479
480
# File 'app/helpers/projects_helper.rb', line 478

def import_from_bitbucket_message
  configure_oauth_import_message('Bitbucket', help_page_path("integration/bitbucket"))
end

#import_from_gitlab_messageObject



482
483
484
# File 'app/helpers/projects_helper.rb', line 482

def import_from_gitlab_message
  configure_oauth_import_message('GitLab.com', help_page_path("integration/gitlab"))
end

#inactive_project_deletion_date(project) ⇒ Object



493
494
495
# File 'app/helpers/projects_helper.rb', line 493

def inactive_project_deletion_date(project)
  Gitlab::InactiveProjectsDeletionWarningTracker.new(project.id).scheduled_deletion_date
end

#last_pipeline_from_status_cache(project) ⇒ Object



224
225
226
227
228
229
230
231
232
233
234
# File 'app/helpers/projects_helper.rb', line 224

def last_pipeline_from_status_cache(project)
  if Feature.enabled?(:last_pipeline_from_pipeline_status, project)
    pipeline_status = project.pipeline_status
    return unless pipeline_status.has_status?

    # commits have far more attributes than id, but last_pipeline only requires sha
    return Commit.from_hash({ id: pipeline_status.sha }, project).last_pipeline
  end

  project.last_pipeline
end

#last_push_eventObject



185
186
187
# File 'app/helpers/projects_helper.rb', line 185

def last_push_event
  current_user&.recent_push(@project)
end


189
190
191
# File 'app/helpers/projects_helper.rb', line 189

def link_to_autodeploy_doc
  link_to _('About auto deploy'), help_page_path('topics/autodevops/stages.md', anchor: 'auto-deploy'), target: '_blank', rel: 'noopener'
end


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
86
87
88
89
90
91
92
93
# File 'app/helpers/projects_helper.rb', line 57

def link_to_member(project, author, opts = {}, &block)
  default_opts = { avatar: true, name: true, title: ":name" }
  opts = default_opts.merge(opts)

  return "(deleted)" unless author

  data_attrs = {
    user_id: author.id,
    username: author.username,
    name: author.name
  }

  inject_classes = ["author-link", opts[:extra_class]]

  if opts[:name]
    inject_classes.concat(["js-user-link", opts[:mobile_classes]])
  else
    inject_classes.append("has-tooltip")
  end

  inject_classes = inject_classes.compact.join(" ")

  author_html = []
  # Build avatar image tag
  author_html << link_to_member_avatar(author, opts) if opts[:avatar]
  # Build name span tag
  author_html << (author, opts) if opts[:name]
  author_html << capture(&block) if block
  author_html = author_html.join.html_safe

  if opts[:name]
    link_to(author_html, user_path(author), class: inject_classes, data: data_attrs).html_safe
  else
    title = opts[:title].sub(":name", sanitize(author.name))
    link_to(author_html, user_path(author), class: inject_classes, title: title, data: { container: 'body', qa_selector: 'assignee_link' }).html_safe
  end
end


26
27
28
29
30
31
32
33
34
35
36
# File 'app/helpers/projects_helper.rb', line 26

def link_to_member_avatar(author, opts = {})
  default_opts = { size: 16 }
  opts = default_opts.merge(opts)

  classes = %W[avatar avatar-inline s#{opts[:size]}]
  classes << opts[:avatar_class] if opts[:avatar_class]

  avatar = avatar_icon_for_user(author, opts[:size])

  image_tag(avatar, width: opts[:size], class: classes, alt: '')
end


13
14
15
16
17
18
19
20
21
22
23
24
# File 'app/helpers/projects_helper.rb', line 13

def link_to_project(project)
  link_to namespace_project_path(namespace_id: project.namespace, id: project), title: h(project.name), class: 'gl-link' do
    title = (:span, project.name, class: 'project-name')

    if project.namespace
      namespace = (:span, "#{project.namespace.human_name} / ", class: 'namespace-name')
      title = namespace + title
    end

    title
  end
end

#load_pipeline_status(projects) ⇒ Object



219
220
221
222
# File 'app/helpers/projects_helper.rb', line 219

def load_pipeline_status(projects)
  Gitlab::Cache::Ci::ProjectPipelineStatus
    .load_in_batch_for_projects(projects)
end

#localized_project_human_access(access) ⇒ Object



519
520
521
# File 'app/helpers/projects_helper.rb', line 519

def localized_project_human_access(access)
  localized_access_names[access] || Gitlab::Access.human_access(access)
end

#membership_locked?Boolean

Returns:

  • (Boolean)


372
373
374
# File 'app/helpers/projects_helper.rb', line 372

def membership_locked?
  false
end

#no_password_messageObject



262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
# File 'app/helpers/projects_helper.rb', line 262

def no_password_message
  push_pull_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('topics/git/terminology', anchor: 'pull-and-push') }
  clone_with_https_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('gitlab-basics/start-using-git', anchor: 'clone-with-https') }
  set_password_link_start = '<a href="%{url}">'.html_safe % { url: edit_profile_password_path }
  set_up_pat_link_start = '<a href="%{url}">'.html_safe % { url: profile_personal_access_tokens_path }

  message = if current_user.require_password_creation_for_git?
              _('Your account is authenticated with SSO or SAML. To %{push_pull_link_start}push and pull%{link_end} over %{protocol} with Git using this account, you must %{set_password_link_start}set a password%{link_end} or %{set_up_pat_link_start}set up a Personal Access Token%{link_end} to use instead of a password. For more information, see %{clone_with_https_link_start}Clone with HTTPS%{link_end}.')
            else
              _('Your account is authenticated with SSO or SAML. To %{push_pull_link_start}push and pull%{link_end} over %{protocol} with Git using this account, you must %{set_up_pat_link_start}set up a Personal Access Token%{link_end} to use instead of a password. For more information, see %{clone_with_https_link_start}Clone with HTTPS%{link_end}.')
            end

  html_escape(message) % {
    push_pull_link_start: push_pull_link_start,
    protocol: gitlab_config.protocol.upcase,
    clone_with_https_link_start: clone_with_https_link_start,
    set_password_link_start: set_password_link_start,
    set_up_pat_link_start: set_up_pat_link_start,
    link_end: '</a>'.html_safe
  }
end

#project_can_be_shared?Boolean

Returns:

  • (Boolean)


368
369
370
# File 'app/helpers/projects_helper.rb', line 368

def project_can_be_shared?
  !membership_locked? || @project.allowed_to_share_with_group?
end

#project_classes(project) ⇒ Object



432
433
434
435
436
# File 'app/helpers/projects_helper.rb', line 432

def project_classes(project)
  return "project-highlight-puc" if project.warn_about_potentially_unwanted_characters?

  ""
end

#project_coverage_chart_data_attributes(daily_coverage_options, ref) ⇒ Object



509
510
511
512
513
514
515
516
517
# File 'app/helpers/projects_helper.rb', line 509

def project_coverage_chart_data_attributes(daily_coverage_options, ref)
  {
    graph_endpoint: "#{daily_coverage_options[:graph_api_path]}?#{daily_coverage_options[:base_params].to_query}",
    graph_start_date: daily_coverage_options[:base_params][:start_date].strftime('%b %d'),
    graph_end_date: daily_coverage_options[:base_params][:end_date].strftime('%b %d'),
    graph_ref: ref.to_s,
    graph_csv_path: "#{daily_coverage_options[:download_path]}?#{daily_coverage_options[:base_params].to_query}"
  }
end

#project_incident_management_settingObject



8
9
10
11
# File 'app/helpers/projects_helper.rb', line 8

def project_incident_management_setting
  @project_incident_management_setting ||= @project.incident_management_setting ||
    @project.build_incident_management_setting
end

#project_license_name(project) ⇒ Object



388
389
390
391
392
393
394
395
396
397
# File 'app/helpers/projects_helper.rb', line 388

def project_license_name(project)
  key = "project:#{project.id}:license_name"

  Gitlab::SafeRequestStore.fetch(key) { project.repository.license&.name }
rescue GRPC::Unavailable, GRPC::DeadlineExceeded, Gitlab::Git::CommandError => e
  Gitlab::ErrorTracking.track_exception(e)
  Gitlab::SafeRequestStore[key] = nil

  nil
end

#project_list_cache_key(project, pipeline_status: true) ⇒ Object



198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'app/helpers/projects_helper.rb', line 198

def project_list_cache_key(project, pipeline_status: true)
  key = [
    project.star_count,
    project.route.cache_key,
    project.cache_key,
    project.last_activity_date,
    controller.controller_name,
    controller.action_name,
    Gitlab::CurrentSettings.cache_key,
    "cross-project:#{can?(current_user, :read_cross_project)}",
    max_project_member_access_cache_key(project),
    pipeline_status,
    Gitlab::I18n.locale,
    'v2.6'
  ]

  key << pipeline_status_cache_key(project.pipeline_status) if pipeline_status && project.pipeline_status.has_status?

  key
end

#project_permissions_panel_data(project) ⇒ Object



403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
# File 'app/helpers/projects_helper.rb', line 403

def project_permissions_panel_data(project)
  {
    packagesAvailable: ::Gitlab.config.packages.enabled,
    packagesHelpPath: help_page_path('user/packages/index'),
    currentSettings: project_permissions_settings(project),
    canAddCatalogResource: can_add_catalog_resource?(project),
    canChangeVisibilityLevel: can_change_visibility_level?(project, current_user),
    canDisableEmails: can_disable_emails?(project, current_user),
    allowedVisibilityOptions: project_allowed_visibility_levels(project),
    visibilityHelpPath: help_page_path('user/public_access'),
    registryAvailable: Gitlab.config.registry.enabled,
    registryHelpPath: help_page_path('user/packages/container_registry/index'),
    lfsAvailable: Gitlab.config.lfs.enabled,
    lfsHelpPath: help_page_path('topics/git/lfs/index'),
    lfsObjectsExist: project.lfs_objects.exists?,
    lfsObjectsRemovalHelpPath: help_page_path('topics/git/lfs/index', anchor: 'removing-objects-from-lfs'),
    pagesAvailable: Gitlab.config.pages.enabled,
    pagesAccessControlEnabled: Gitlab.config.pages.access_control,
    pagesAccessControlForced: ::Gitlab::Pages.access_control_is_forced?,
    pagesHelpPath: help_page_path('user/project/pages/introduction', anchor: 'gitlab-pages-access-control'),
    issuesHelpPath: help_page_path('user/project/issues/index'),
    membersPagePath: project_project_members_path(project),
    environmentsHelpPath: help_page_path('ci/environments/index'),
    featureFlagsHelpPath: help_page_path('operations/feature_flags'),
    releasesHelpPath: help_page_path('user/project/releases/index'),
    infrastructureHelpPath: help_page_path('user/infrastructure/index')
  }
end

#project_title(project) ⇒ Object



95
96
97
98
99
100
101
102
103
# File 'app/helpers/projects_helper.rb', line 95

def project_title(project)
  namespace_link = build_namespace_breadcrumb_link(project)
  project_link = build_project_breadcrumb_link(project)

  namespace_link = breadcrumb_list_item(namespace_link) unless project.group
  project_link = breadcrumb_list_item project_link

  "#{namespace_link} #{project_link}".html_safe
end

#push_to_create_project_command(user = current_user) ⇒ Object



306
307
308
309
310
311
312
313
314
315
# File 'app/helpers/projects_helper.rb', line 306

def push_to_create_project_command(user = current_user)
  repository_url =
    if Gitlab::CurrentSettings.current_application_settings.enabled_git_access_protocol == 'http'
      user_url(user)
    else
      Gitlab.config.gitlab_shell.ssh_path_prefix + user.username
    end

  "git push --set-upstream #{repository_url}/$(git rev-parse --show-toplevel | xargs basename).git $(git rev-parse --abbrev-ref HEAD)"
end

#remote_mirror_setting_enabled?Boolean

Returns:

  • (Boolean)


527
528
529
# File 'app/helpers/projects_helper.rb', line 527

def remote_mirror_setting_enabled?
  false
end

#remove_fork_project_confirm_json(project, remove_form_id) ⇒ Object



162
163
164
165
166
167
168
169
# File 'app/helpers/projects_helper.rb', line 162

def remove_fork_project_confirm_json(project, remove_form_id)
  {
    remove_form_id: remove_form_id,
    button_text: _('Remove fork relationship'),
    confirm_danger_message: remove_fork_project_warning_message(project),
    phrase: @project.path
  }
end

#remove_fork_project_description_message(project) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
# File 'app/helpers/projects_helper.rb', line 115

def remove_fork_project_description_message(project)
  source = visible_fork_source(project)

  if source
    msg = _('This will remove the fork relationship between this project and %{fork_source}.') %
      { fork_source: link_to(source.full_name, project_path(source)) }

    msg.html_safe
  else
    _('This will remove the fork relationship between this project and other projects in the fork network.')
  end
end

#remove_fork_project_warning_message(project) ⇒ Object



157
158
159
160
# File 'app/helpers/projects_helper.rb', line 157

def remove_fork_project_warning_message(project)
  _("You are going to remove the fork relationship from %{project_full_name}. Are you ABSOLUTELY sure?") %
    { project_full_name: project.full_name }
end

#remove_project_message(project) ⇒ Object



105
106
107
108
# File 'app/helpers/projects_helper.rb', line 105

def remove_project_message(project)
  _("You are going to delete %{project_full_name}. Deleted projects CANNOT be restored! Are you ABSOLUTELY sure?") %
    { project_full_name: project.full_name }
end

#show_auto_devops_implicitly_enabled_banner?(project, user) ⇒ Boolean

Returns:

  • (Boolean)


248
249
250
251
252
# File 'app/helpers/projects_helper.rb', line 248

def show_auto_devops_implicitly_enabled_banner?(project, user)
  return false unless user_can_see_auto_devops_implicitly_enabled_banner?(project, user)

  cookies["hide_auto_devops_implicitly_enabled_banner_#{project.id}".to_sym].blank?
end

#show_clusters_alert?(project) ⇒ Boolean

Returns:

  • (Boolean)


497
498
499
# File 'app/helpers/projects_helper.rb', line 497

def show_clusters_alert?(project)
  Gitlab.com? && can_admin_associated_clusters?(project)
end

#show_count?(disabled: false, compact_mode: false) ⇒ Boolean

Returns:

  • (Boolean)


331
332
333
# File 'app/helpers/projects_helper.rb', line 331

def show_count?(disabled: false, compact_mode: false)
  !disabled && !compact_mode
end

#show_inactive_project_deletion_banner?(project) ⇒ Boolean

Returns:

  • (Boolean)


486
487
488
489
490
491
# File 'app/helpers/projects_helper.rb', line 486

def show_inactive_project_deletion_banner?(project)
  return false unless project.present? && project.saved?
  return false unless delete_inactive_projects?

  project.inactive?
end

#show_mobile_devops_project_promo?(project) ⇒ Boolean

Returns:

  • (Boolean)


254
255
256
257
258
259
260
# File 'app/helpers/projects_helper.rb', line 254

def show_mobile_devops_project_promo?(project)
  return false unless ::Feature.enabled?(:mobile_devops_projects_promo, project)

  return false unless (project.project_setting.target_platforms & ::ProjectSetting::ALLOWED_TARGET_PLATFORMS).any?

  cookies["hide_mobile_devops_promo_#{project.id}".to_sym].blank?
end

#show_no_password_message?Boolean

Returns:

  • (Boolean)


243
244
245
246
# File 'app/helpers/projects_helper.rb', line 243

def show_no_password_message?
  cookies[:hide_no_password_message].blank? && !current_user.hide_no_password &&
    current_user.require_extra_setup_for_git_auth?
end

#show_no_ssh_key_message?Boolean

Returns:

  • (Boolean)


236
237
238
239
240
241
# File 'app/helpers/projects_helper.rb', line 236

def show_no_ssh_key_message?
  Gitlab::CurrentSettings.user_show_add_ssh_key_message? &&
    cookies[:hide_no_ssh_message].blank? &&
    !current_user.hide_no_ssh_key &&
    current_user.require_ssh_key?
end

#show_projects?(projects, params) ⇒ Boolean

Returns:

  • (Boolean)


302
303
304
# File 'app/helpers/projects_helper.rb', line 302

def show_projects?(projects, params)
  !!(params[:personal] || params[:name] || params[:language] || any_projects?(projects))
end

#show_terraform_banner?(project) ⇒ Boolean

Returns:

  • (Boolean)


399
400
401
# File 'app/helpers/projects_helper.rb', line 399

def show_terraform_banner?(project)
  Feature.enabled?(:show_terraform_banner, type: :ops) && project.repository_languages.with_programming_language('HCL').exists? && project.terraform_states.empty?
end

#show_xcode_link?(project = @project) ⇒ Boolean

Returns:

  • (Boolean)


317
318
319
# File 'app/helpers/projects_helper.rb', line 317

def show_xcode_link?(project = @project)
  browser.platform.mac? && project.repository.xcode_project?
end

#ssh_clone_url_to_repo(project) ⇒ Object



535
536
537
# File 'app/helpers/projects_helper.rb', line 535

def ssh_clone_url_to_repo(project)
  project.ssh_url_to_repo
end

#transfer_project_message(project) ⇒ Object



110
111
112
113
# File 'app/helpers/projects_helper.rb', line 110

def transfer_project_message(project)
  _("You are going to transfer %{project_full_name} to another namespace. Are you ABSOLUTELY sure?") %
    { project_full_name: project.full_name }
end

#visibility_level_content(project, css_class: nil, icon_css_class: nil) ⇒ Object



555
556
557
558
559
560
561
562
563
564
565
566
567
# File 'app/helpers/projects_helper.rb', line 555

def visibility_level_content(project, css_class: nil, icon_css_class: nil)
  if project.created_and_owned_by_banned_user? && Feature.enabled?(:hide_projects_of_banned_users)
    return hidden_resource_icon(project, css_class: css_class)
  end

  title = visibility_icon_description(project)
  container_class = ['has-tooltip', css_class].compact.join(' ')
  data = { container: 'body', placement: 'top' }

  (:span, class: container_class, data: data, title: title) do
    visibility_level_icon(project.visibility_level, options: { class: icon_css_class })
  end
end

#visible_fork_source(project) ⇒ Object



171
172
173
# File 'app/helpers/projects_helper.rb', line 171

def visible_fork_source(project)
  project.fork_source if project.fork_source && can?(current_user, :read_project, project.fork_source)
end

#vue_fork_divergence_data(project, ref) ⇒ Object



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'app/helpers/projects_helper.rb', line 128

def vue_fork_divergence_data(project, ref)
  source_project = visible_fork_source(project)

  return {} unless source_project

  source_default_branch = source_project.default_branch

  merge_request =
    MergeRequest.opened
      .from_project(project).of_projects(source_project.id).from_source_branches(ref).first

  {
    project_path: project.full_path,
    selected_branch: ref,
    source_name: source_project.full_name,
    source_path: project_path(source_project),
    source_default_branch: source_default_branch,
    can_sync_branch: can_sync_branch?(project, ref).to_s,
    ahead_compare_path: project_compare_path(
      project, from: source_default_branch, to: ref, from_project_id: source_project.id
    ),
    create_mr_path: create_merge_request_path(project, source_project, ref, merge_request),
    view_mr_path: merge_request && project_merge_request_path(source_project, merge_request),
    behind_compare_path: project_compare_path(
      source_project, from: ref, to: source_default_branch, from_project_id: project.id
    )
  }
end

#xcode_uri_to_repo(project = @project) ⇒ Object



321
322
323
# File 'app/helpers/projects_helper.rb', line 321

def xcode_uri_to_repo(project = @project)
  "xcode://clone?repo=#{CGI.escape(default_url_to_repo(project))}"
end