Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2020-10-01 12:10:14 +00:00
parent 635d82b15d
commit a27b8a5c10
265 changed files with 2756 additions and 2025 deletions

View file

@ -7,376 +7,374 @@
# versions of Haml-Lint, may require this file to be generated again.
linters:
# Offense count: 1552
NoPlainNodes:
enabled: true
exclude:
- "app/views/admin/abuse_reports/_abuse_report.html.haml"
- "app/views/admin/abuse_reports/index.html.haml"
- "app/views/admin/appearances/_form.html.haml"
- "app/views/admin/application_settings/_abuse.html.haml"
- "app/views/admin/application_settings/_diff_limits.html.haml"
- "app/views/admin/application_settings/_gitaly.html.haml"
- "app/views/admin/application_settings/_ip_limits.html.haml"
- "app/views/admin/application_settings/_performance.html.haml"
- "app/views/admin/application_settings/_plantuml.html.haml"
- "app/views/admin/application_settings/_prometheus.html.haml"
- "app/views/admin/application_settings/_realtime.html.haml"
- "app/views/admin/application_settings/_repository_check.html.haml"
- "app/views/admin/application_settings/_signin.html.haml"
- "app/views/admin/application_settings/_signup.html.haml"
- "app/views/admin/application_settings/_spam.html.haml"
- "app/views/admin/application_settings/_terminal.html.haml"
- "app/views/admin/application_settings/_usage.html.haml"
- "app/views/admin/application_settings/_visibility_and_access.html.haml"
- "app/views/admin/applications/_delete_form.html.haml"
- "app/views/admin/applications/_form.html.haml"
- "app/views/admin/applications/edit.html.haml"
- "app/views/admin/applications/index.html.haml"
- "app/views/admin/applications/new.html.haml"
- "app/views/admin/applications/show.html.haml"
- "app/views/admin/background_jobs/show.html.haml"
- "app/views/admin/broadcast_messages/index.html.haml"
- "app/views/admin/dashboard/index.html.haml"
- "app/views/admin/deploy_keys/new.html.haml"
- "app/views/admin/health_check/show.html.haml"
- "app/views/admin/hook_logs/_index.html.haml"
- "app/views/admin/hook_logs/show.html.haml"
- "app/views/admin/hooks/_form.html.haml"
- "app/views/admin/hooks/edit.html.haml"
- "app/views/admin/logs/show.html.haml"
- "app/views/admin/projects/_projects.html.haml"
- "app/views/admin/requests_profiles/index.html.haml"
- "app/views/admin/runners/_runner.html.haml"
- "app/views/admin/runners/index.html.haml"
- "app/views/admin/runners/show.html.haml"
- "app/views/admin/services/_form.html.haml"
- "app/views/admin/services/index.html.haml"
- "app/views/admin/spam_logs/_spam_log.html.haml"
- "app/views/admin/spam_logs/index.html.haml"
- "app/views/admin/system_info/show.html.haml"
- "app/views/admin/users/_form.html.haml"
- "app/views/admin/users/_head.html.haml"
- "app/views/admin/users/_profile.html.haml"
- "app/views/admin/users/_projects.html.haml"
- "app/views/admin/users/new.html.haml"
- "app/views/admin/users/projects.html.haml"
- "app/views/admin/users/show.html.haml"
- 'app/views/admin/abuse_reports/_abuse_report.html.haml'
- 'app/views/admin/abuse_reports/index.html.haml'
- 'app/views/admin/appearances/_form.html.haml'
- 'app/views/admin/application_settings/_abuse.html.haml'
- 'app/views/admin/application_settings/_diff_limits.html.haml'
- 'app/views/admin/application_settings/_gitaly.html.haml'
- 'app/views/admin/application_settings/_ip_limits.html.haml'
- 'app/views/admin/application_settings/_performance.html.haml'
- 'app/views/admin/application_settings/_plantuml.html.haml'
- 'app/views/admin/application_settings/_prometheus.html.haml'
- 'app/views/admin/application_settings/_realtime.html.haml'
- 'app/views/admin/application_settings/_repository_check.html.haml'
- 'app/views/admin/application_settings/_signin.html.haml'
- 'app/views/admin/application_settings/_signup.html.haml'
- 'app/views/admin/application_settings/_spam.html.haml'
- 'app/views/admin/application_settings/_terminal.html.haml'
- 'app/views/admin/application_settings/_usage.html.haml'
- 'app/views/admin/application_settings/_visibility_and_access.html.haml'
- 'app/views/admin/applications/_delete_form.html.haml'
- 'app/views/admin/applications/_form.html.haml'
- 'app/views/admin/applications/edit.html.haml'
- 'app/views/admin/applications/index.html.haml'
- 'app/views/admin/applications/new.html.haml'
- 'app/views/admin/applications/show.html.haml'
- 'app/views/admin/background_jobs/show.html.haml'
- 'app/views/admin/broadcast_messages/index.html.haml'
- 'app/views/admin/dashboard/index.html.haml'
- 'app/views/admin/deploy_keys/new.html.haml'
- 'app/views/admin/health_check/show.html.haml'
- 'app/views/admin/hook_logs/_index.html.haml'
- 'app/views/admin/hook_logs/show.html.haml'
- 'app/views/admin/hooks/_form.html.haml'
- 'app/views/admin/hooks/edit.html.haml'
- 'app/views/admin/logs/show.html.haml'
- 'app/views/admin/projects/_projects.html.haml'
- 'app/views/admin/requests_profiles/index.html.haml'
- 'app/views/admin/runners/_runner.html.haml'
- 'app/views/admin/runners/index.html.haml'
- 'app/views/admin/runners/show.html.haml'
- 'app/views/admin/services/_form.html.haml'
- 'app/views/admin/services/index.html.haml'
- 'app/views/admin/spam_logs/_spam_log.html.haml'
- 'app/views/admin/spam_logs/index.html.haml'
- 'app/views/admin/system_info/show.html.haml'
- 'app/views/admin/users/_form.html.haml'
- 'app/views/admin/users/_head.html.haml'
- 'app/views/admin/users/_profile.html.haml'
- 'app/views/admin/users/_projects.html.haml'
- 'app/views/admin/users/new.html.haml'
- 'app/views/admin/users/projects.html.haml'
- 'app/views/admin/users/show.html.haml'
- 'app/views/authentication/_authenticate.html.haml'
- 'app/views/authentication/_register.html.haml'
- "app/views/clusters/clusters/_cluster.html.haml"
- "app/views/clusters/clusters/new.html.haml"
- "app/views/dashboard/milestones/index.html.haml"
- "app/views/dashboard/projects/_blank_state_admin_welcome.html.haml"
- "app/views/dashboard/projects/_blank_state_welcome.html.haml"
- "app/views/dashboard/todos/_todo.html.haml"
- "app/views/dashboard/todos/index.html.haml"
- "app/views/devise/confirmations/almost_there.haml"
- "app/views/devise/mailer/_confirmation_instructions_account.html.haml"
- "app/views/devise/mailer/_confirmation_instructions_secondary.html.haml"
- "app/views/devise/mailer/email_changed.html.haml"
- "app/views/devise/mailer/password_change.html.haml"
- "app/views/devise/mailer/reset_password_instructions.html.haml"
- "app/views/devise/mailer/unlock_instructions.html.haml"
- "app/views/devise/passwords/edit.html.haml"
- "app/views/devise/sessions/_new_base.html.haml"
- "app/views/devise/sessions/_new_crowd.html.haml"
- "app/views/devise/sessions/_new_ldap.html.haml"
- "app/views/devise/sessions/new.html.haml"
- "app/views/devise/sessions/two_factor.html.haml"
- "app/views/devise/shared/_omniauth_box.html.haml"
- "app/views/devise/shared/_sign_in_link.html.haml"
- "app/views/devise/shared/_tabs_normal.html.haml"
- "app/views/discussions/_discussion.html.haml"
- "app/views/discussions/_headline.html.haml"
- "app/views/discussions/_notes.html.haml"
- "app/views/doorkeeper/applications/_delete_form.html.haml"
- "app/views/doorkeeper/authorized_applications/_delete_form.html.haml"
- "app/views/errors/encoding.html.haml"
- "app/views/errors/git_not_found.html.haml"
- "app/views/errors/omniauth_error.html.haml"
- "app/views/errors/precondition_failed.html.haml"
- "app/views/events/_event_push.atom.haml"
- "app/views/events/event/_push.html.haml"
- "app/views/groups/_create_chat_team.html.haml"
- "app/views/groups/_group_admin_settings.html.haml"
- "app/views/groups/labels/edit.html.haml"
- "app/views/groups/labels/new.html.haml"
- "app/views/groups/milestones/edit.html.haml"
- "app/views/groups/milestones/index.html.haml"
- "app/views/groups/milestones/new.html.haml"
- "app/views/groups/projects.html.haml"
- "app/views/groups/runners/edit.html.haml"
- "app/views/groups/settings/_advanced.html.haml"
- "app/views/groups/settings/_lfs.html.haml"
- "app/views/help/_shortcuts.html.haml"
- "app/views/help/index.html.haml"
- "app/views/help/instance_configuration.html.haml"
- "app/views/help/instance_configuration/_gitlab_ci.html.haml"
- "app/views/help/instance_configuration/_gitlab_pages.html.haml"
- "app/views/import/bitbucket/status.html.haml"
- "app/views/import/bitbucket_server/status.html.haml"
- "app/views/invites/show.html.haml"
- "app/views/jira_connect/subscriptions/index.html.haml"
- "app/views/layouts/_mailer.html.haml"
- "app/views/layouts/experiment_mailer.html.haml"
- "app/views/layouts/header/_default.html.haml"
- "app/views/layouts/header/_new_dropdown.haml"
- "app/views/layouts/jira_connect.html.haml"
- "app/views/layouts/notify.html.haml"
- "app/views/notify/_failed_builds.html.haml"
- "app/views/notify/_reassigned_issuable_email.html.haml"
- "app/views/notify/_removal_notification.html.haml"
- "app/views/notify/_successful_pipeline.html.haml"
- "app/views/notify/autodevops_disabled_email.html.haml"
- "app/views/notify/changed_milestone_email.html.haml"
- "app/views/notify/import_issues_csv_email.html.haml"
- "app/views/notify/issue_moved_email.html.haml"
- "app/views/notify/member_access_denied_email.html.haml"
- "app/views/notify/member_invite_accepted_email.html.haml"
- "app/views/notify/member_invited_email.html.haml"
- "app/views/notify/new_gpg_key_email.html.haml"
- "app/views/notify/new_mention_in_issue_email.html.haml"
- "app/views/notify/new_ssh_key_email.html.haml"
- "app/views/notify/new_user_email.html.haml"
- "app/views/notify/pages_domain_disabled_email.html.haml"
- "app/views/notify/pages_domain_enabled_email.html.haml"
- "app/views/notify/pages_domain_verification_failed_email.html.haml"
- "app/views/notify/pages_domain_verification_succeeded_email.html.haml"
- "app/views/notify/pipeline_failed_email.html.haml"
- "app/views/notify/project_was_exported_email.html.haml"
- "app/views/notify/project_was_moved_email.html.haml"
- "app/views/notify/project_was_not_exported_email.html.haml"
- "app/views/notify/push_to_merge_request_email.html.haml"
- "app/views/notify/remote_mirror_update_failed_email.html.haml"
- "app/views/notify/removed_milestone_issue_email.html.haml"
- "app/views/notify/removed_milestone_merge_request_email.html.haml"
- "app/views/notify/repository_push_email.html.haml"
- "app/views/profiles/chat_names/_chat_name.html.haml"
- "app/views/profiles/chat_names/index.html.haml"
- "app/views/profiles/chat_names/new.html.haml"
- "app/views/projects/_bitbucket_import_modal.html.haml"
- "app/views/projects/_customize_workflow.html.haml"
- "app/views/projects/_deletion_failed.html.haml"
- "app/views/projects/_fork_suggestion.html.haml"
- "app/views/projects/_gitlab_import_modal.html.haml"
- "app/views/projects/_home_panel.html.haml"
- "app/views/projects/_import_project_pane.html.haml"
- "app/views/projects/_issuable_by_email.html.haml"
- "app/views/projects/_readme.html.haml"
- "app/views/projects/artifacts/_artifact.html.haml"
- "app/views/projects/artifacts/_tree_file.html.haml"
- "app/views/projects/artifacts/browse.html.haml"
- "app/views/projects/blame/_age_map_legend.html.haml"
- "app/views/projects/blame/show.html.haml"
- "app/views/projects/blob/_editor.html.haml"
- "app/views/projects/blob/_header_content.html.haml"
- "app/views/projects/blob/_remove.html.haml"
- "app/views/projects/blob/_render_error.html.haml"
- "app/views/projects/blob/edit.html.haml"
- "app/views/projects/blob/new.html.haml"
- "app/views/projects/blob/preview.html.haml"
- "app/views/projects/blob/viewers/_empty.html.haml"
- "app/views/projects/blob/viewers/_stl.html.haml"
- "app/views/projects/branches/_branch.html.haml"
- "app/views/projects/branches/_delete_protected_modal.html.haml"
- "app/views/projects/branches/new.html.haml"
- "app/views/projects/ci/builds/_build.html.haml"
- "app/views/projects/ci/lints/_create.html.haml"
- "app/views/projects/compare/_form.html.haml"
- "app/views/projects/compare/index.html.haml"
- "app/views/projects/cycle_analytics/_empty_stage.html.haml"
- "app/views/projects/cycle_analytics/_no_access.html.haml"
- "app/views/projects/cycle_analytics/_overview.html.haml"
- "app/views/projects/cycle_analytics/show.html.haml"
- "app/views/projects/deploy_keys/_form.html.haml"
- "app/views/projects/deploy_keys/_index.html.haml"
- "app/views/projects/deploy_keys/edit.html.haml"
- "app/views/projects/deployments/_deployment.html.haml"
- "app/views/projects/diffs/_file_header.html.haml"
- "app/views/projects/diffs/_replaced_image_diff.html.haml"
- "app/views/projects/diffs/_stats.html.haml"
- "app/views/projects/empty.html.haml"
- "app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml"
- "app/views/projects/hook_logs/_index.html.haml"
- "app/views/projects/hook_logs/show.html.haml"
- "app/views/projects/hooks/edit.html.haml"
- "app/views/projects/imports/new.html.haml"
- "app/views/projects/imports/show.html.haml"
- "app/views/projects/issues/_new_branch.html.haml"
- "app/views/projects/issues/import_csv/_modal.html.haml"
- "app/views/projects/issues/show.html.haml"
- "app/views/projects/jobs/_header.html.haml"
- "app/views/projects/jobs/_table.html.haml"
- "app/views/projects/jobs/index.html.haml"
- "app/views/projects/labels/edit.html.haml"
- "app/views/projects/labels/new.html.haml"
- "app/views/projects/mattermosts/_no_teams.html.haml"
- "app/views/projects/mattermosts/_team_selection.html.haml"
- "app/views/projects/mattermosts/new.html.haml"
- "app/views/projects/merge_requests/_commits.html.haml"
- "app/views/projects/merge_requests/_how_to_merge.html.haml"
- "app/views/projects/merge_requests/_mr_title.html.haml"
- "app/views/projects/merge_requests/conflicts/_commit_stats.html.haml"
- "app/views/projects/merge_requests/conflicts/_file_actions.html.haml"
- "app/views/projects/merge_requests/conflicts/_submit_form.html.haml"
- "app/views/projects/merge_requests/conflicts/components/_diff_file_editor.html.haml"
- "app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml"
- "app/views/projects/merge_requests/conflicts/show.html.haml"
- "app/views/projects/merge_requests/creations/_diffs.html.haml"
- "app/views/projects/merge_requests/creations/_new_compare.html.haml"
- "app/views/projects/merge_requests/creations/_new_submit.html.haml"
- "app/views/projects/merge_requests/diffs/_different_base.html.haml"
- "app/views/projects/merge_requests/diffs/_diffs.html.haml"
- "app/views/projects/merge_requests/diffs/_version_controls.html.haml"
- "app/views/projects/merge_requests/invalid.html.haml"
- "app/views/projects/merge_requests/widget/open/_error.html.haml"
- "app/views/projects/mirrors/_regenerate_public_ssh_key_confirm_modal.html.haml"
- "app/views/projects/mirrors/_ssh_host_keys.html.haml"
- "app/views/projects/no_repo.html.haml"
- "app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml"
- "app/views/projects/pipelines/_info.html.haml"
- "app/views/projects/protected_branches/shared/_dropdown.html.haml"
- "app/views/projects/protected_branches/shared/_index.html.haml"
- "app/views/projects/protected_branches/shared/_matching_branch.html.haml"
- "app/views/projects/protected_branches/shared/_protected_branch.html.haml"
- "app/views/projects/protected_branches/show.html.haml"
- "app/views/projects/protected_tags/shared/_create_protected_tag.html.haml"
- "app/views/projects/protected_tags/shared/_dropdown.html.haml"
- "app/views/projects/protected_tags/shared/_index.html.haml"
- "app/views/projects/protected_tags/shared/_matching_tag.html.haml"
- "app/views/projects/protected_tags/shared/_protected_tag.html.haml"
- "app/views/projects/protected_tags/shared/_tags_list.html.haml"
- "app/views/projects/protected_tags/show.html.haml"
- "app/views/projects/registry/repositories/_tag.html.haml"
- "app/views/projects/repositories/_feed.html.haml"
- "app/views/projects/runners/_shared_runners.html.haml"
- "app/views/projects/runners/edit.html.haml"
- "app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml"
- "app/views/projects/services/mattermost_slash_commands/_help.html.haml"
- "app/views/projects/services/prometheus/_metrics.html.haml"
- "app/views/projects/services/slack_slash_commands/_help.html.haml"
- "app/views/projects/settings/ci_cd/_badge.html.haml"
- "app/views/projects/settings/ci_cd/_form.html.haml"
- "app/views/projects/tags/index.html.haml"
- "app/views/projects/tags/releases/edit.html.haml"
- "app/views/projects/tree/_tree_row.html.haml"
- "app/views/projects/tree/_truncated_notice_tree_row.html.haml"
- "app/views/projects/triggers/_form.html.haml"
- "app/views/projects/triggers/_index.html.haml"
- "app/views/projects/triggers/_trigger.html.haml"
- "app/views/projects/triggers/edit.html.haml"
- "app/views/search/results/_issue.html.haml"
- "app/views/search/results/_note.html.haml"
- "app/views/search/results/_snippet_blob.html.haml"
- "app/views/search/results/_snippet_title.html.haml"
- "app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml"
- "app/views/shared/_commit_message_container.html.haml"
- "app/views/shared/_delete_label_modal.html.haml"
- "app/views/shared/_group_form.html.haml"
- "app/views/shared/_group_tips.html.haml"
- "app/views/shared/_md_preview.html.haml"
- "app/views/shared/_milestone_expired.html.haml"
- "app/views/shared/_no_password.html.haml"
- "app/views/shared/_ping_consent.html.haml"
- "app/views/shared/_project_limit.html.haml"
- "app/views/shared/boards/components/_sidebar.html.haml"
- "app/views/shared/boards/components/sidebar/_due_date.html.haml"
- "app/views/shared/boards/components/sidebar/_labels.html.haml"
- "app/views/shared/boards/components/sidebar/_milestone.html.haml"
- "app/views/shared/hook_logs/_content.html.haml"
- "app/views/shared/issuable/_assignees.html.haml"
- "app/views/shared/issuable/_board_create_list_dropdown.html.haml"
- "app/views/shared/issuable/_close_reopen_report_toggle.html.haml"
- "app/views/shared/issuable/_form.html.haml"
- "app/views/shared/issuable/_search_bar.html.haml"
- "app/views/shared/issuable/_sidebar.html.haml"
- "app/views/shared/issuable/form/_default_templates.html.haml"
- "app/views/shared/issuable/form/_template_selector.html.haml"
- "app/views/shared/issuable/form/_title.html.haml"
- "app/views/shared/labels/_form.html.haml"
- "app/views/shared/members/_member.html.haml"
- "app/views/shared/milestones/_form_dates.html.haml"
- "app/views/shared/milestones/_issuable.html.haml"
- "app/views/shared/milestones/_milestone.html.haml"
- "app/views/shared/milestones/_sidebar.html.haml"
- "app/views/shared/milestones/_top.html.haml"
- "app/views/shared/notes/_hints.html.haml"
- "app/views/shared/notifications/_button.html.haml"
- "app/views/shared/notifications/_new_button.html.haml"
- "app/views/shared/runners/_runner_description.html.haml"
- "app/views/shared/runners/show.html.haml"
- "app/views/shared/snippets/_header.html.haml"
- "app/views/shared/snippets/_snippet.html.haml"
- "app/views/shared/web_hooks/_form.html.haml"
- "app/views/shared/web_hooks/_hook.html.haml"
- "app/views/shared/wikis/_pages_wiki_page.html.haml"
- "app/views/users/_deletion_guidance.html.haml"
- "ee/app/views/admin/_namespace_plan_info.html.haml"
- "ee/app/views/admin/application_settings/_templates.html.haml"
- "ee/app/views/admin/audit_logs/index.html.haml"
- "ee/app/views/admin/emails/show.html.haml"
- "ee/app/views/admin/geo/projects/_registry_failed.html.haml"
- "ee/app/views/admin/geo/projects/_registry_never.html.haml"
- "ee/app/views/admin/licenses/_upload_trial_license.html.haml"
- "ee/app/views/admin/licenses/new.html.haml"
- "ee/app/views/admin/monitoring/ee/_nav.html.haml"
- "ee/app/views/admin/projects/_shared_runner_status.html.haml"
- "ee/app/views/admin/users/_auditor_access_level_radio.html.haml"
- "ee/app/views/admin/users/_auditor_user_badge.html.haml"
- "ee/app/views/admin/users/_limits.html.haml"
- "ee/app/views/admin/users/_user_detail_note.html.haml"
- "ee/app/views/dashboard/projects/_blank_state_ee_trial.html.haml"
- "ee/app/views/errors/kerberos_denied.html.haml"
- "ee/app/views/groups/ee/_settings_nav.html.haml"
- "ee/app/views/groups/group_members/_ldap_sync.html.haml"
- "ee/app/views/groups/group_members/_sync_button.html.haml"
- "ee/app/views/groups/hooks/edit.html.haml"
- "ee/app/views/groups/ldap_group_links/index.html.haml"
- "ee/app/views/layouts/nav/ee/admin/_new_monitoring_sidebar.html.haml"
- "ee/app/views/layouts/service_desk.html.haml"
- "ee/app/views/ldap_group_links/_form.html.haml"
- "ee/app/views/ldap_group_links/_ldap_group_link.html.haml"
- "ee/app/views/ldap_group_links/_ldap_group_links.html.haml"
- "ee/app/views/ldap_group_links/_ldap_group_links_show.html.haml"
- "ee/app/views/ldap_group_links/_ldap_group_links_synchronizations.html.haml"
- "ee/app/views/namespaces/_shared_runner_status.html.haml"
- "ee/app/views/namespaces/_shared_runners_minutes_setting.html.haml"
- "ee/app/views/namespaces/pipelines_quota/_extra_shared_runners_minutes_quota.html.haml"
- "ee/app/views/namespaces/pipelines_quota/_list.haml"
- "ee/app/views/notify/approved_merge_request_email.html.haml"
- "ee/app/views/notify/epic_status_changed_email.html.haml"
- "ee/app/views/notify/new_review_email.html.haml"
- "ee/app/views/notify/send_admin_notification.html.haml"
- "ee/app/views/notify/send_unsubscribed_notification.html.haml"
- "ee/app/views/notify/unapproved_merge_request_email.html.haml"
- "ee/app/views/oauth/geo_auth/error.html.haml"
- "ee/app/views/projects/commits/_mirror_status.html.haml"
- "ee/app/views/projects/merge_requests/_approvals_count.html.haml"
- "ee/app/views/projects/merge_requests/widget/open/_geo.html.haml"
- "ee/app/views/projects/mirrors/_mirrored_repositories_count.html.haml"
- "ee/app/views/projects/protected_branches/_update_protected_branch.html.haml"
- "ee/app/views/projects/protected_branches/ee/_create_protected_branch.html.haml"
- "ee/app/views/projects/protected_branches/ee/_dropdown.html.haml"
- "ee/app/views/projects/protected_tags/_protected_tag_extra_create_access_levels.haml"
- "ee/app/views/projects/protected_tags/ee/_create_protected_tag.html.haml"
- "ee/app/views/projects/push_rules/_index.html.haml"
- "ee/app/views/projects/services/gitlab_slack_application/_help.html.haml"
- "ee/app/views/projects/services/gitlab_slack_application/_slack_integration_form.html.haml"
- "ee/app/views/projects/settings/slacks/edit.html.haml"
- "ee/app/views/shared/_mirror_update_button.html.haml"
- "ee/app/views/shared/epic/_search_bar.html.haml"
- "ee/app/views/shared/issuable/_approvals.html.haml"
- "ee/app/views/shared/issuable/_board_create_list_dropdown.html.haml"
- "ee/app/views/shared/issuable/_filter_weight.html.haml"
- "ee/app/views/shared/members/ee/_ldap_tag.html.haml"
- "ee/app/views/shared/members/ee/_override_member_buttons.html.haml"
- "ee/app/views/shared/members/ee/_sso_badge.html.haml"
- "ee/app/views/shared/milestones/_burndown.html.haml"
- "ee/app/views/shared/milestones/_weight.html.haml"
- "ee/app/views/shared/promotions/_promote_issue_weights.html.haml"
- "ee/app/views/shared/promotions/_promote_repository_features.html.haml"
- "ee/app/views/shared/promotions/_promote_servicedesk.html.haml"
- "ee/app/views/shared/push_rules/_form.html.haml"
- "ee/app/views/unsubscribes/show.html.haml"
- 'app/views/clusters/clusters/_cluster.html.haml'
- 'app/views/clusters/clusters/new.html.haml'
- 'app/views/dashboard/milestones/index.html.haml'
- 'app/views/dashboard/projects/_blank_state_admin_welcome.html.haml'
- 'app/views/dashboard/projects/_blank_state_welcome.html.haml'
- 'app/views/dashboard/todos/_todo.html.haml'
- 'app/views/dashboard/todos/index.html.haml'
- 'app/views/devise/confirmations/almost_there.haml'
- 'app/views/devise/mailer/_confirmation_instructions_account.html.haml'
- 'app/views/devise/mailer/_confirmation_instructions_secondary.html.haml'
- 'app/views/devise/mailer/email_changed.html.haml'
- 'app/views/devise/mailer/password_change.html.haml'
- 'app/views/devise/mailer/reset_password_instructions.html.haml'
- 'app/views/devise/mailer/unlock_instructions.html.haml'
- 'app/views/devise/passwords/edit.html.haml'
- 'app/views/devise/sessions/_new_base.html.haml'
- 'app/views/devise/sessions/_new_crowd.html.haml'
- 'app/views/devise/sessions/_new_ldap.html.haml'
- 'app/views/devise/sessions/new.html.haml'
- 'app/views/devise/sessions/two_factor.html.haml'
- 'app/views/devise/shared/_omniauth_box.html.haml'
- 'app/views/devise/shared/_sign_in_link.html.haml'
- 'app/views/devise/shared/_tabs_normal.html.haml'
- 'app/views/discussions/_discussion.html.haml'
- 'app/views/discussions/_headline.html.haml'
- 'app/views/discussions/_notes.html.haml'
- 'app/views/doorkeeper/applications/_delete_form.html.haml'
- 'app/views/doorkeeper/authorized_applications/_delete_form.html.haml'
- 'app/views/errors/encoding.html.haml'
- 'app/views/errors/git_not_found.html.haml'
- 'app/views/errors/omniauth_error.html.haml'
- 'app/views/errors/precondition_failed.html.haml'
- 'app/views/events/_event_push.atom.haml'
- 'app/views/events/event/_push.html.haml'
- 'app/views/groups/_create_chat_team.html.haml'
- 'app/views/groups/_group_admin_settings.html.haml'
- 'app/views/groups/labels/edit.html.haml'
- 'app/views/groups/labels/new.html.haml'
- 'app/views/groups/milestones/edit.html.haml'
- 'app/views/groups/milestones/index.html.haml'
- 'app/views/groups/milestones/new.html.haml'
- 'app/views/groups/projects.html.haml'
- 'app/views/groups/runners/edit.html.haml'
- 'app/views/groups/settings/_advanced.html.haml'
- 'app/views/groups/settings/_lfs.html.haml'
- 'app/views/help/_shortcuts.html.haml'
- 'app/views/help/index.html.haml'
- 'app/views/help/instance_configuration.html.haml'
- 'app/views/help/instance_configuration/_gitlab_ci.html.haml'
- 'app/views/help/instance_configuration/_gitlab_pages.html.haml'
- 'app/views/import/bitbucket/status.html.haml'
- 'app/views/import/bitbucket_server/status.html.haml'
- 'app/views/invites/show.html.haml'
- 'app/views/jira_connect/subscriptions/index.html.haml'
- 'app/views/layouts/_mailer.html.haml'
- 'app/views/layouts/experiment_mailer.html.haml'
- 'app/views/layouts/header/_default.html.haml'
- 'app/views/layouts/header/_new_dropdown.haml'
- 'app/views/layouts/jira_connect.html.haml'
- 'app/views/layouts/notify.html.haml'
- 'app/views/notify/_failed_builds.html.haml'
- 'app/views/notify/_reassigned_issuable_email.html.haml'
- 'app/views/notify/_removal_notification.html.haml'
- 'app/views/notify/_successful_pipeline.html.haml'
- 'app/views/notify/autodevops_disabled_email.html.haml'
- 'app/views/notify/changed_milestone_email.html.haml'
- 'app/views/notify/import_issues_csv_email.html.haml'
- 'app/views/notify/issue_moved_email.html.haml'
- 'app/views/notify/member_access_denied_email.html.haml'
- 'app/views/notify/member_invite_accepted_email.html.haml'
- 'app/views/notify/member_invited_email.html.haml'
- 'app/views/notify/new_gpg_key_email.html.haml'
- 'app/views/notify/new_mention_in_issue_email.html.haml'
- 'app/views/notify/new_ssh_key_email.html.haml'
- 'app/views/notify/new_user_email.html.haml'
- 'app/views/notify/pages_domain_disabled_email.html.haml'
- 'app/views/notify/pages_domain_enabled_email.html.haml'
- 'app/views/notify/pages_domain_verification_failed_email.html.haml'
- 'app/views/notify/pages_domain_verification_succeeded_email.html.haml'
- 'app/views/notify/pipeline_failed_email.html.haml'
- 'app/views/notify/project_was_exported_email.html.haml'
- 'app/views/notify/project_was_moved_email.html.haml'
- 'app/views/notify/project_was_not_exported_email.html.haml'
- 'app/views/notify/push_to_merge_request_email.html.haml'
- 'app/views/notify/remote_mirror_update_failed_email.html.haml'
- 'app/views/notify/removed_milestone_issue_email.html.haml'
- 'app/views/notify/removed_milestone_merge_request_email.html.haml'
- 'app/views/notify/repository_push_email.html.haml'
- 'app/views/profiles/chat_names/_chat_name.html.haml'
- 'app/views/profiles/chat_names/index.html.haml'
- 'app/views/profiles/chat_names/new.html.haml'
- 'app/views/projects/_bitbucket_import_modal.html.haml'
- 'app/views/projects/_customize_workflow.html.haml'
- 'app/views/projects/_deletion_failed.html.haml'
- 'app/views/projects/_fork_suggestion.html.haml'
- 'app/views/projects/_gitlab_import_modal.html.haml'
- 'app/views/projects/_home_panel.html.haml'
- 'app/views/projects/_import_project_pane.html.haml'
- 'app/views/projects/_issuable_by_email.html.haml'
- 'app/views/projects/_readme.html.haml'
- 'app/views/projects/artifacts/_artifact.html.haml'
- 'app/views/projects/artifacts/_tree_file.html.haml'
- 'app/views/projects/artifacts/browse.html.haml'
- 'app/views/projects/blame/_age_map_legend.html.haml'
- 'app/views/projects/blame/show.html.haml'
- 'app/views/projects/blob/_editor.html.haml'
- 'app/views/projects/blob/_header_content.html.haml'
- 'app/views/projects/blob/_remove.html.haml'
- 'app/views/projects/blob/_render_error.html.haml'
- 'app/views/projects/blob/edit.html.haml'
- 'app/views/projects/blob/new.html.haml'
- 'app/views/projects/blob/preview.html.haml'
- 'app/views/projects/blob/viewers/_empty.html.haml'
- 'app/views/projects/blob/viewers/_stl.html.haml'
- 'app/views/projects/branches/_branch.html.haml'
- 'app/views/projects/branches/_delete_protected_modal.html.haml'
- 'app/views/projects/branches/new.html.haml'
- 'app/views/projects/ci/builds/_build.html.haml'
- 'app/views/projects/ci/lints/_create.html.haml'
- 'app/views/projects/compare/_form.html.haml'
- 'app/views/projects/compare/index.html.haml'
- 'app/views/projects/cycle_analytics/_empty_stage.html.haml'
- 'app/views/projects/cycle_analytics/_no_access.html.haml'
- 'app/views/projects/cycle_analytics/_overview.html.haml'
- 'app/views/projects/cycle_analytics/show.html.haml'
- 'app/views/projects/deploy_keys/_form.html.haml'
- 'app/views/projects/deploy_keys/_index.html.haml'
- 'app/views/projects/deploy_keys/edit.html.haml'
- 'app/views/projects/deployments/_deployment.html.haml'
- 'app/views/projects/diffs/_file_header.html.haml'
- 'app/views/projects/diffs/_replaced_image_diff.html.haml'
- 'app/views/projects/diffs/_stats.html.haml'
- 'app/views/projects/empty.html.haml'
- 'app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml'
- 'app/views/projects/hook_logs/_index.html.haml'
- 'app/views/projects/hook_logs/show.html.haml'
- 'app/views/projects/hooks/edit.html.haml'
- 'app/views/projects/imports/new.html.haml'
- 'app/views/projects/imports/show.html.haml'
- 'app/views/projects/issues/_new_branch.html.haml'
- 'app/views/projects/issues/import_csv/_modal.html.haml'
- 'app/views/projects/issues/show.html.haml'
- 'app/views/projects/jobs/_header.html.haml'
- 'app/views/projects/jobs/_table.html.haml'
- 'app/views/projects/jobs/index.html.haml'
- 'app/views/projects/labels/edit.html.haml'
- 'app/views/projects/labels/new.html.haml'
- 'app/views/projects/mattermosts/_no_teams.html.haml'
- 'app/views/projects/mattermosts/_team_selection.html.haml'
- 'app/views/projects/mattermosts/new.html.haml'
- 'app/views/projects/merge_requests/_commits.html.haml'
- 'app/views/projects/merge_requests/_how_to_merge.html.haml'
- 'app/views/projects/merge_requests/_mr_title.html.haml'
- 'app/views/projects/merge_requests/conflicts/_commit_stats.html.haml'
- 'app/views/projects/merge_requests/conflicts/_file_actions.html.haml'
- 'app/views/projects/merge_requests/conflicts/_submit_form.html.haml'
- 'app/views/projects/merge_requests/conflicts/components/_diff_file_editor.html.haml'
- 'app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml'
- 'app/views/projects/merge_requests/conflicts/show.html.haml'
- 'app/views/projects/merge_requests/creations/_diffs.html.haml'
- 'app/views/projects/merge_requests/creations/_new_compare.html.haml'
- 'app/views/projects/merge_requests/creations/_new_submit.html.haml'
- 'app/views/projects/merge_requests/diffs/_different_base.html.haml'
- 'app/views/projects/merge_requests/diffs/_diffs.html.haml'
- 'app/views/projects/merge_requests/diffs/_version_controls.html.haml'
- 'app/views/projects/merge_requests/invalid.html.haml'
- 'app/views/projects/merge_requests/widget/open/_error.html.haml'
- 'app/views/projects/mirrors/_regenerate_public_ssh_key_confirm_modal.html.haml'
- 'app/views/projects/mirrors/_ssh_host_keys.html.haml'
- 'app/views/projects/no_repo.html.haml'
- 'app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml'
- 'app/views/projects/pipelines/_info.html.haml'
- 'app/views/projects/protected_branches/shared/_dropdown.html.haml'
- 'app/views/projects/protected_branches/shared/_index.html.haml'
- 'app/views/projects/protected_branches/shared/_matching_branch.html.haml'
- 'app/views/projects/protected_branches/shared/_protected_branch.html.haml'
- 'app/views/projects/protected_branches/show.html.haml'
- 'app/views/projects/protected_tags/shared/_create_protected_tag.html.haml'
- 'app/views/projects/protected_tags/shared/_dropdown.html.haml'
- 'app/views/projects/protected_tags/shared/_index.html.haml'
- 'app/views/projects/protected_tags/shared/_matching_tag.html.haml'
- 'app/views/projects/protected_tags/shared/_protected_tag.html.haml'
- 'app/views/projects/protected_tags/shared/_tags_list.html.haml'
- 'app/views/projects/protected_tags/show.html.haml'
- 'app/views/projects/registry/repositories/_tag.html.haml'
- 'app/views/projects/repositories/_feed.html.haml'
- 'app/views/projects/runners/_shared_runners.html.haml'
- 'app/views/projects/runners/edit.html.haml'
- 'app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml'
- 'app/views/projects/services/mattermost_slash_commands/_help.html.haml'
- 'app/views/projects/services/prometheus/_metrics.html.haml'
- 'app/views/projects/services/slack_slash_commands/_help.html.haml'
- 'app/views/projects/settings/ci_cd/_badge.html.haml'
- 'app/views/projects/settings/ci_cd/_form.html.haml'
- 'app/views/projects/tags/index.html.haml'
- 'app/views/projects/tags/releases/edit.html.haml'
- 'app/views/projects/tree/_tree_row.html.haml'
- 'app/views/projects/tree/_truncated_notice_tree_row.html.haml'
- 'app/views/projects/triggers/_form.html.haml'
- 'app/views/projects/triggers/_index.html.haml'
- 'app/views/projects/triggers/_trigger.html.haml'
- 'app/views/projects/triggers/edit.html.haml'
- 'app/views/search/results/_issue.html.haml'
- 'app/views/search/results/_note.html.haml'
- 'app/views/search/results/_snippet_blob.html.haml'
- 'app/views/search/results/_snippet_title.html.haml'
- 'app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml'
- 'app/views/shared/_commit_message_container.html.haml'
- 'app/views/shared/_delete_label_modal.html.haml'
- 'app/views/shared/_group_form.html.haml'
- 'app/views/shared/_group_tips.html.haml'
- 'app/views/shared/_md_preview.html.haml'
- 'app/views/shared/_milestone_expired.html.haml'
- 'app/views/shared/_no_password.html.haml'
- 'app/views/shared/_ping_consent.html.haml'
- 'app/views/shared/_project_limit.html.haml'
- 'app/views/shared/boards/components/_sidebar.html.haml'
- 'app/views/shared/boards/components/sidebar/_due_date.html.haml'
- 'app/views/shared/boards/components/sidebar/_labels.html.haml'
- 'app/views/shared/boards/components/sidebar/_milestone.html.haml'
- 'app/views/shared/hook_logs/_content.html.haml'
- 'app/views/shared/issuable/_assignees.html.haml'
- 'app/views/shared/issuable/_board_create_list_dropdown.html.haml'
- 'app/views/shared/issuable/_close_reopen_report_toggle.html.haml'
- 'app/views/shared/issuable/_form.html.haml'
- 'app/views/shared/issuable/_search_bar.html.haml'
- 'app/views/shared/issuable/_sidebar.html.haml'
- 'app/views/shared/issuable/form/_default_templates.html.haml'
- 'app/views/shared/issuable/form/_template_selector.html.haml'
- 'app/views/shared/issuable/form/_title.html.haml'
- 'app/views/shared/labels/_form.html.haml'
- 'app/views/shared/members/_member.html.haml'
- 'app/views/shared/milestones/_form_dates.html.haml'
- 'app/views/shared/milestones/_issuable.html.haml'
- 'app/views/shared/milestones/_milestone.html.haml'
- 'app/views/shared/milestones/_sidebar.html.haml'
- 'app/views/shared/milestones/_top.html.haml'
- 'app/views/shared/notes/_hints.html.haml'
- 'app/views/shared/notifications/_button.html.haml'
- 'app/views/shared/notifications/_new_button.html.haml'
- 'app/views/shared/runners/_runner_description.html.haml'
- 'app/views/shared/runners/show.html.haml'
- 'app/views/shared/snippets/_header.html.haml'
- 'app/views/shared/snippets/_snippet.html.haml'
- 'app/views/shared/web_hooks/_form.html.haml'
- 'app/views/shared/web_hooks/_hook.html.haml'
- 'app/views/shared/wikis/_pages_wiki_page.html.haml'
- 'app/views/users/_deletion_guidance.html.haml'
- 'ee/app/views/admin/_namespace_plan_info.html.haml'
- 'ee/app/views/admin/application_settings/_templates.html.haml'
- 'ee/app/views/admin/audit_logs/index.html.haml'
- 'ee/app/views/admin/emails/show.html.haml'
- 'ee/app/views/admin/geo/projects/_registry_failed.html.haml'
- 'ee/app/views/admin/geo/projects/_registry_never.html.haml'
- 'ee/app/views/admin/licenses/_upload_trial_license.html.haml'
- 'ee/app/views/admin/licenses/new.html.haml'
- 'ee/app/views/admin/monitoring/ee/_nav.html.haml'
- 'ee/app/views/admin/projects/_shared_runner_status.html.haml'
- 'ee/app/views/admin/users/_auditor_access_level_radio.html.haml'
- 'ee/app/views/admin/users/_auditor_user_badge.html.haml'
- 'ee/app/views/admin/users/_limits.html.haml'
- 'ee/app/views/admin/users/_user_detail_note.html.haml'
- 'ee/app/views/dashboard/projects/_blank_state_ee_trial.html.haml'
- 'ee/app/views/errors/kerberos_denied.html.haml'
- 'ee/app/views/groups/ee/_settings_nav.html.haml'
- 'ee/app/views/groups/group_members/_ldap_sync.html.haml'
- 'ee/app/views/groups/group_members/_sync_button.html.haml'
- 'ee/app/views/groups/hooks/edit.html.haml'
- 'ee/app/views/groups/ldap_group_links/index.html.haml'
- 'ee/app/views/layouts/nav/ee/admin/_new_monitoring_sidebar.html.haml'
- 'ee/app/views/layouts/service_desk.html.haml'
- 'ee/app/views/ldap_group_links/_form.html.haml'
- 'ee/app/views/ldap_group_links/_ldap_group_link.html.haml'
- 'ee/app/views/ldap_group_links/_ldap_group_links.html.haml'
- 'ee/app/views/ldap_group_links/_ldap_group_links_show.html.haml'
- 'ee/app/views/namespaces/_shared_runner_status.html.haml'
- 'ee/app/views/namespaces/_shared_runners_minutes_setting.html.haml'
- 'ee/app/views/namespaces/pipelines_quota/_extra_shared_runners_minutes_quota.html.haml'
- 'ee/app/views/namespaces/pipelines_quota/_list.haml'
- 'ee/app/views/notify/approved_merge_request_email.html.haml'
- 'ee/app/views/notify/epic_status_changed_email.html.haml'
- 'ee/app/views/notify/new_review_email.html.haml'
- 'ee/app/views/notify/send_admin_notification.html.haml'
- 'ee/app/views/notify/send_unsubscribed_notification.html.haml'
- 'ee/app/views/notify/unapproved_merge_request_email.html.haml'
- 'ee/app/views/oauth/geo_auth/error.html.haml'
- 'ee/app/views/projects/commits/_mirror_status.html.haml'
- 'ee/app/views/projects/merge_requests/_approvals_count.html.haml'
- 'ee/app/views/projects/merge_requests/widget/open/_geo.html.haml'
- 'ee/app/views/projects/mirrors/_mirrored_repositories_count.html.haml'
- 'ee/app/views/projects/protected_branches/_update_protected_branch.html.haml'
- 'ee/app/views/projects/protected_branches/ee/_create_protected_branch.html.haml'
- 'ee/app/views/projects/protected_branches/ee/_dropdown.html.haml'
- 'ee/app/views/projects/protected_tags/_protected_tag_extra_create_access_levels.haml'
- 'ee/app/views/projects/protected_tags/ee/_create_protected_tag.html.haml'
- 'ee/app/views/projects/push_rules/_index.html.haml'
- 'ee/app/views/projects/services/gitlab_slack_application/_help.html.haml'
- 'ee/app/views/projects/services/gitlab_slack_application/_slack_integration_form.html.haml'
- 'ee/app/views/projects/settings/slacks/edit.html.haml'
- 'ee/app/views/shared/_mirror_update_button.html.haml'
- 'ee/app/views/shared/epic/_search_bar.html.haml'
- 'ee/app/views/shared/issuable/_approvals.html.haml'
- 'ee/app/views/shared/issuable/_board_create_list_dropdown.html.haml'
- 'ee/app/views/shared/issuable/_filter_weight.html.haml'
- 'ee/app/views/shared/members/ee/_ldap_tag.html.haml'
- 'ee/app/views/shared/members/ee/_override_member_buttons.html.haml'
- 'ee/app/views/shared/members/ee/_sso_badge.html.haml'
- 'ee/app/views/shared/milestones/_burndown.html.haml'
- 'ee/app/views/shared/milestones/_weight.html.haml'
- 'ee/app/views/shared/promotions/_promote_issue_weights.html.haml'
- 'ee/app/views/shared/promotions/_promote_repository_features.html.haml'
- 'ee/app/views/shared/promotions/_promote_servicedesk.html.haml'
- 'ee/app/views/shared/push_rules/_form.html.haml'
- 'ee/app/views/unsubscribes/show.html.haml'

View file

@ -1,6 +1,5 @@
<script>
import { GlButton, GlLoadingIcon, GlModal, GlLink } from '@gitlab/ui';
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import PipelinesService from '~/pipelines/services/pipelines_service';
import PipelineStore from '~/pipelines/stores/pipelines_store';
import pipelinesMixin from '~/pipelines/mixins/pipelines';
@ -126,16 +125,6 @@ export default {
(latest.flags.detached_merge_request_pipeline || latest.flags.merge_request_pipeline)
);
},
/**
* When we are on Desktop and the button is visible
* we need to add a negative margin to the table
* to make it inline with the button
*
* @returns {Boolean}
*/
shouldAddNegativeMargin() {
return this.canRenderPipelineButton && bp.isDesktop();
},
},
created() {
this.service = new PipelinesService(this.endpoint);
@ -205,65 +194,76 @@ export default {
/>
<div v-else-if="shouldRenderTable" class="table-holder">
<div v-if="canRenderPipelineButton" class="nav justify-content-end">
<gl-button
variant="success"
class="js-run-mr-pipeline gl-mt-3 btn-wide-on-xs"
:disabled="state.isRunningMergeRequestPipeline"
@click="tryRunPipeline"
>
<gl-loading-icon v-if="state.isRunningMergeRequestPipeline" inline />
{{ s__('Pipelines|Run Pipeline') }}
</gl-button>
<gl-modal
:id="modalId"
ref="modal"
:modal-id="modalId"
:title="s__('Pipelines|Are you sure you want to run this pipeline?')"
:ok-title="s__('Pipelines|Run Pipeline')"
ok-variant="danger"
@ok="onClickRunPipeline"
>
<p>
{{
s__(
'Pipelines|This pipeline will run code originating from a forked project merge request. This means that the code can potentially have security considerations like exposing CI variables.',
)
}}
</p>
<p>
{{
s__(
"Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource.",
)
}}
</p>
<p>
{{
s__(
'Pipelines|If you are unsure, please ask a project maintainer to review it for you.',
)
}}
</p>
<gl-link
href="/help/ci/merge_request_pipelines/index.html#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project"
target="_blank"
>
{{ s__('Pipelines|More Information') }}
</gl-link>
</gl-modal>
</div>
<gl-button
v-if="canRenderPipelineButton"
block
class="gl-mt-3 gl-mb-0 gl-display-md-none"
variant="success"
data-testid="run_pipeline_button_mobile"
:loading="state.isRunningMergeRequestPipeline"
@click="tryRunPipeline"
>
{{ s__('Pipelines|Run Pipeline') }}
</gl-button>
<pipelines-table-component
:pipelines="state.pipelines"
:update-graph-dropdown="updateGraphDropdown"
:auto-devops-help-path="autoDevopsHelpPath"
:view-type="viewType"
:class="{ 'negative-margin-top': shouldAddNegativeMargin }"
/>
>
<template #table-header-actions>
<div v-if="canRenderPipelineButton" class="gl-text-right">
<gl-button
variant="success"
data-testid="run_pipeline_button"
:loading="state.isRunningMergeRequestPipeline"
@click="tryRunPipeline"
>
{{ s__('Pipelines|Run Pipeline') }}
</gl-button>
</div>
</template>
</pipelines-table-component>
</div>
<gl-modal
v-if="canRenderPipelineButton"
:id="modalId"
ref="modal"
:modal-id="modalId"
:title="s__('Pipelines|Are you sure you want to run this pipeline?')"
:ok-title="s__('Pipelines|Run Pipeline')"
ok-variant="danger"
@ok="onClickRunPipeline"
>
<p>
{{
s__(
'Pipelines|This pipeline will run code originating from a forked project merge request. This means that the code can potentially have security considerations like exposing CI variables.',
)
}}
</p>
<p>
{{
s__(
"Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource.",
)
}}
</p>
<p>
{{
s__('Pipelines|If you are unsure, please ask a project maintainer to review it for you.')
}}
</p>
<gl-link
href="/help/ci/merge_request_pipelines/index.html#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project"
target="_blank"
>
{{ s__('Pipelines|More Information') }}
</gl-link>
</gl-modal>
<table-pagination
v-if="shouldRenderPagination"
:change="onChangePage"

View file

@ -32,7 +32,7 @@ export default {
<gl-icon :size="12" name="angle-down" class="position-absolute" />
</a>
<div class="dropdown-menu dropdown-select dropdown-menu-selectable">
<div class="dropdown-content">
<div class="dropdown-content" data-qa-selector="dropdown_content">
<ul>
<li v-for="version in versions" :key="version.id">
<a :class="{ 'is-active': version.selected }" :href="version.href">

View file

@ -100,6 +100,7 @@ export default {
<compare-dropdown-layout
:versions="diffCompareDropdownTargetVersions"
class="mr-version-compare-dropdown"
data-qa-selector="target_version_dropdown"
/>
</template>
<template #source>

View file

@ -245,7 +245,14 @@ export default {
></strong>
</span>
<strong v-else v-gl-tooltip :title="filePath" class="file-title-name" data-container="body">
<strong
v-else
v-gl-tooltip
:title="filePath"
class="file-title-name"
data-container="body"
data-qa-selector="file_name_content"
>
{{ filePath }}
</strong>
</a>

View file

@ -39,6 +39,8 @@ import initPersistentUserCallouts from './persistent_user_callouts';
import { initUserTracking, initDefaultTrackers } from './tracking';
import { __ } from './locale';
import * as tooltips from '~/tooltips';
import 'ee_else_ce/main_ee';
applyGitLabUIConfig();
@ -77,7 +79,7 @@ document.addEventListener('beforeunload', () => {
// Unbind scroll events
$(document).off('scroll');
// Close any open tooltips
$('.has-tooltip, [data-toggle="tooltip"]').tooltip('dispose');
tooltips.dispose(document.querySelectorAll('.has-tooltip, [data-toggle="tooltip"]'));
// Close any open popover
$('[data-toggle="popover"]').popover('dispose');
});
@ -133,8 +135,10 @@ function deferredInitialisation() {
addSelectOnFocusBehaviour('.js-select-on-focus');
$('.remove-row').on('ajax:success', function removeRowAjaxSuccessCallback() {
tooltips.dispose(this);
// eslint-disable-next-line no-jquery/no-fade
$(this)
.tooltip('dispose')
.closest('li')
.fadeOut();
});
@ -154,7 +158,7 @@ function deferredInitialisation() {
const delay = glTooltipDelay ? JSON.parse(glTooltipDelay) : 0;
// Initialize tooltips
$body.tooltip({
tooltips.initTooltips({
selector: '.has-tooltip, [data-toggle="tooltip"]',
trigger: 'hover',
boundary: 'viewport',

View file

@ -3,11 +3,12 @@
import $ from 'jquery';
import axios from './lib/utils/axios_utils';
import { __ } from '~/locale';
import eventHub from '~/vue_merge_request_widget/event_hub';
import { deprecatedCreateFlash as createFlash } from '~/flash';
import TaskList from './task_list';
import MergeRequestTabs from './merge_request_tabs';
import IssuablesHelper from './helpers/issuables_helper';
import { addDelimiter } from './lib/utils/text_utility';
import { getParameterValues, setUrlParams } from './lib/utils/url_utility';
function MergeRequest(opts) {
// Initialize MergeRequest behavior
@ -23,7 +24,6 @@ function MergeRequest(opts) {
this.initTabs();
this.initMRBtnListeners();
this.initCommitMessageListeners();
this.closeReopenReportToggle = IssuablesHelper.initCloseReopenReport();
if ($('.description.js-task-list-container').length) {
this.taskList = new TaskList({
@ -66,13 +66,38 @@ MergeRequest.prototype.showAllCommits = function() {
MergeRequest.prototype.initMRBtnListeners = function() {
const _this = this;
const draftToggles = document.querySelectorAll('.js-draft-toggle-button');
$('.report-abuse-link').on('click', e => {
// this is needed because of the implementation of
// the dropdown toggle and Report Abuse needing to be
// linked to another page.
e.stopPropagation();
});
if (draftToggles.length) {
draftToggles.forEach(draftToggle => {
draftToggle.addEventListener('click', e => {
e.preventDefault();
e.stopImmediatePropagation();
const url = draftToggle.href;
const wipEvent = getParameterValues('merge_request[wip_event]', url)[0];
const mobileDropdown = draftToggle.closest('.dropdown.show');
if (mobileDropdown) {
$(mobileDropdown.firstElementChild).dropdown('toggle');
}
draftToggle.setAttribute('disabled', 'disabled');
axios
.put(draftToggle.href, null, { params: { format: 'json' } })
.then(({ data }) => {
draftToggle.removeAttribute('disabled');
eventHub.$emit('MRWidgetUpdateRequested');
MergeRequest.toggleDraftStatus(data.title, wipEvent === 'unwip');
})
.catch(() => {
draftToggle.removeAttribute('disabled');
createFlash(__('Something went wrong. Please try again.'));
});
});
});
}
return $('.btn-close, .btn-reopen').on('click', function(e) {
const $this = $(this);
@ -89,8 +114,6 @@ MergeRequest.prototype.initMRBtnListeners = function() {
return;
}
if (this.closeReopenReportToggle) this.closeReopenReportToggle.setDisable();
if (shouldSubmit) {
if ($this.hasClass('btn-comment-and-close') || $this.hasClass('btn-comment-and-reopen')) {
e.preventDefault();
@ -151,14 +174,35 @@ MergeRequest.hideCloseButton = function() {
const closeDropdownItem = el.querySelector('li.close-item');
if (closeDropdownItem) {
closeDropdownItem.classList.add('hidden');
// Selects the next dropdown item
el.querySelector('li.report-item').click();
} else {
// No dropdown just hide the Close button
el.querySelector('.btn-close').classList.add('hidden');
}
// Dropdown for mobile screen
el.querySelector('li.js-close-item').classList.add('hidden');
};
MergeRequest.toggleDraftStatus = function(title, isReady) {
if (isReady) {
createFlash(__('The merge request can now be merged.'), 'notice');
}
const titleEl = document.querySelector('.merge-request .detail-page-description .title');
if (titleEl) {
titleEl.textContent = title;
}
const draftToggles = document.querySelectorAll('.js-draft-toggle-button');
if (draftToggles.length) {
draftToggles.forEach(el => {
const draftToggle = el;
const url = setUrlParams(
{ 'merge_request[wip_event]': isReady ? 'wip' : 'unwip' },
draftToggle.href,
);
draftToggle.setAttribute('href', url);
draftToggle.textContent = isReady ? __('Mark as draft') : __('Mark as ready');
});
}
};
export default MergeRequest;

View file

@ -91,6 +91,10 @@ export default {
<div class="table-section section-15 js-pipeline-stages pipeline-stages" role="rowheader">
{{ s__('Pipeline|Stages') }}
</div>
<div class="table-section section-15" role="rowheader"></div>
<div class="table-section section-20" role="rowheader">
<slot name="table-header-actions"></slot>
</div>
</div>
<pipelines-table-row-component
v-for="model in pipelines"

View file

@ -57,6 +57,10 @@ export default {
text: s__('ProjectTemplates|Static Site Editor/Middleman'),
icon: '.template-option .icon-sse_middleman',
},
gitpod_spring_petclinic: {
text: s__('ProjectTemplates|Gitpod/Spring Petclinic'),
icon: '.template-option .icon-gitpod_spring_petclinic',
},
nfhugo: {
text: s__('ProjectTemplates|Netlify/Hugo'),
icon: '.template-option .icon-nfhugo',

View file

@ -0,0 +1,24 @@
<script>
// NOTE! For the first iteration, we are simply copying the implementation of Assignees
// It will soon be overhauled in Issue https://gitlab.com/gitlab-org/gitlab/-/issues/233736
import ReviewerAvatar from './reviewer_avatar.vue';
export default {
components: {
ReviewerAvatar,
},
props: {
user: {
type: Object,
required: true,
},
},
};
</script>
<template>
<button type="button" class="btn-link">
<reviewer-avatar :user="user" :img-size="24" />
<span class="author"> {{ user.name }} </span>
</button>
</template>

View file

@ -0,0 +1,107 @@
<script>
// NOTE! For the first iteration, we are simply copying the implementation of Assignees
// It will soon be overhauled in Issue https://gitlab.com/gitlab-org/gitlab/-/issues/233736
import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
import { __, sprintf } from '~/locale';
import CollapsedReviewer from './collapsed_reviewer.vue';
const DEFAULT_MAX_COUNTER = 99;
const DEFAULT_RENDER_COUNT = 5;
export default {
directives: {
GlTooltip: GlTooltipDirective,
},
components: {
CollapsedReviewer,
GlIcon,
},
props: {
users: {
type: Array,
required: true,
},
},
computed: {
hasNoUsers() {
return !this.users.length;
},
hasMoreThanOneReviewer() {
return this.users.length > 1;
},
hasMoreThanTwoReviewers() {
return this.users.length > 2;
},
allReviewersCanMerge() {
return this.users.every(user => user.can_merge);
},
sidebarAvatarCounter() {
if (this.users.length > DEFAULT_MAX_COUNTER) {
return `${DEFAULT_MAX_COUNTER}+`;
}
return `+${this.users.length - 1}`;
},
collapsedUsers() {
const collapsedLength = this.hasMoreThanTwoReviewers ? 1 : this.users.length;
return this.users.slice(0, collapsedLength);
},
tooltipTitleMergeStatus() {
const mergeLength = this.users.filter(u => u.can_merge).length;
if (mergeLength === this.users.length) {
return '';
} else if (mergeLength > 0) {
return sprintf(__('%{mergeLength}/%{usersLength} can merge'), {
mergeLength,
usersLength: this.users.length,
});
}
return this.users.length === 1 ? __('cannot merge') : __('no one can merge');
},
tooltipTitle() {
const maxRender = Math.min(DEFAULT_RENDER_COUNT, this.users.length);
const renderUsers = this.users.slice(0, maxRender);
const names = renderUsers.map(u => u.name);
if (!this.users.length) {
return __('Reviewer(s)');
}
if (this.users.length > names.length) {
names.push(sprintf(__('+ %{amount} more'), { amount: this.users.length - names.length }));
}
const text = names.join(', ');
return this.tooltipTitleMergeStatus ? `${text} (${this.tooltipTitleMergeStatus})` : text;
},
tooltipOptions() {
return { container: 'body', placement: 'left', boundary: 'viewport' };
},
},
};
</script>
<template>
<div
v-gl-tooltip="tooltipOptions"
:class="{ 'multiple-users': hasMoreThanOneReviewer }"
:title="tooltipTitle"
class="sidebar-collapsed-icon sidebar-collapsed-user"
>
<gl-icon v-if="hasNoUsers" name="user" :aria-label="__('None')" />
<collapsed-reviewer v-for="user in collapsedUsers" :key="user.id" :user="user" />
<button v-if="hasMoreThanTwoReviewers" class="btn-link" type="button">
<span class="avatar-counter sidebar-avatar-counter"> {{ sidebarAvatarCounter }} </span>
<i
v-if="!allReviewersCanMerge"
aria-hidden="true"
class="fa fa-exclamation-triangle merge-icon"
></i>
</button>
</div>
</template>

View file

@ -0,0 +1,43 @@
<script>
// NOTE! For the first iteration, we are simply copying the implementation of Assignees
// It will soon be overhauled in Issue https://gitlab.com/gitlab-org/gitlab/-/issues/233736
import { __, sprintf } from '~/locale';
export default {
props: {
user: {
type: Object,
required: true,
},
imgSize: {
type: Number,
required: true,
},
},
computed: {
reviewerAlt() {
return sprintf(__("%{userName}'s avatar"), { userName: this.user.name });
},
avatarUrl() {
return this.user.avatar || this.user.avatar_url || gon.default_avatar_url;
},
hasMergeIcon() {
return !this.user.can_merge;
},
},
};
</script>
<template>
<span class="position-relative">
<img
:alt="reviewerAlt"
:src="avatarUrl"
:width="imgSize"
:class="`s${imgSize}`"
class="avatar avatar-inline m-0"
data-qa-selector="avatar_image"
/>
<i v-if="hasMergeIcon" aria-hidden="true" class="fa fa-exclamation-triangle merge-icon"></i>
</span>
</template>

View file

@ -0,0 +1,84 @@
<script>
// NOTE! For the first iteration, we are simply copying the implementation of Assignees
// It will soon be overhauled in Issue https://gitlab.com/gitlab-org/gitlab/-/issues/233736
import { GlTooltipDirective, GlLink } from '@gitlab/ui';
import { __, sprintf } from '~/locale';
import ReviewerAvatar from './reviewer_avatar.vue';
export default {
components: {
ReviewerAvatar,
GlLink,
},
directives: {
GlTooltip: GlTooltipDirective,
},
props: {
user: {
type: Object,
required: true,
},
rootPath: {
type: String,
required: true,
},
tooltipPlacement: {
type: String,
default: 'bottom',
required: false,
},
tooltipHasName: {
type: Boolean,
default: true,
required: false,
},
issuableType: {
type: String,
default: 'issue',
required: false,
},
},
computed: {
cannotMerge() {
return this.issuableType === 'merge_request' && !this.user.can_merge;
},
tooltipTitle() {
if (this.cannotMerge && this.tooltipHasName) {
return sprintf(__('%{userName} (cannot merge)'), { userName: this.user.name });
} else if (this.cannotMerge) {
return __('Cannot merge');
} else if (this.tooltipHasName) {
return this.user.name;
}
return '';
},
tooltipOption() {
return {
container: 'body',
placement: this.tooltipPlacement,
boundary: 'viewport',
};
},
reviewerUrl() {
return this.user.web_url;
},
},
};
</script>
<template>
<!-- must be `d-inline-block` or parent flex-basis causes width issues -->
<gl-link
v-gl-tooltip="tooltipOption"
:href="reviewerUrl"
:title="tooltipTitle"
class="d-inline-block"
>
<!-- use d-flex so that slot can be appropriately styled -->
<span class="d-flex">
<reviewer-avatar :user="user" :img-size="32" :issuable-type="issuableType" />
<slot :user="user"></slot>
</span>
</gl-link>
</template>

View file

@ -0,0 +1,64 @@
<script>
// NOTE! For the first iteration, we are simply copying the implementation of Assignees
// It will soon be overhauled in Issue https://gitlab.com/gitlab-org/gitlab/-/issues/233736
import { GlLoadingIcon } from '@gitlab/ui';
import { n__ } from '~/locale';
export default {
name: 'ReviewerTitle',
components: {
GlLoadingIcon,
},
props: {
loading: {
type: Boolean,
required: false,
default: false,
},
numberOfReviewers: {
type: Number,
required: true,
},
editable: {
type: Boolean,
required: true,
},
showToggle: {
type: Boolean,
required: false,
default: false,
},
},
computed: {
reviewerTitle() {
const reviewers = this.numberOfReviewers;
return n__('Reviewer', `%d Reviewers`, reviewers);
},
},
};
</script>
<template>
<div class="title hide-collapsed">
{{ reviewerTitle }}
<gl-loading-icon v-if="loading" inline class="align-bottom" />
<a
v-if="editable"
class="js-sidebar-dropdown-toggle edit-link float-right"
href="#"
data-track-event="click_edit_button"
data-track-label="right_sidebar"
data-track-property="reviewer"
>
{{ __('Edit') }}
</a>
<a
v-if="showToggle"
:aria-label="__('Toggle sidebar')"
class="gutter-toggle float-right js-sidebar-toggle"
href="#"
role="button"
>
<i aria-hidden="true" data-hidden="true" class="fa fa-angle-double-right"></i>
</a>
</div>
</template>

View file

@ -0,0 +1,72 @@
<script>
// NOTE! For the first iteration, we are simply copying the implementation of Assignees
// It will soon be overhauled in Issue https://gitlab.com/gitlab-org/gitlab/-/issues/233736
import CollapsedReviewerList from './collapsed_reviewer_list.vue';
import UncollapsedReviewerList from './uncollapsed_reviewer_list.vue';
export default {
// name: 'Reviewers' is a false positive: https://gitlab.com/gitlab-org/frontend/eslint-plugin-i18n/issues/26#possible-false-positives
// eslint-disable-next-line @gitlab/require-i18n-strings
name: 'Reviewers',
components: {
CollapsedReviewerList,
UncollapsedReviewerList,
},
props: {
rootPath: {
type: String,
required: true,
},
users: {
type: Array,
required: true,
},
editable: {
type: Boolean,
required: true,
},
issuableType: {
type: String,
required: false,
default: 'issue',
},
},
computed: {
hasNoUsers() {
return !this.users.length;
},
sortedReviewers() {
const canMergeUsers = this.users.filter(user => user.can_merge);
const canNotMergeUsers = this.users.filter(user => !user.can_merge);
return [...canMergeUsers, ...canNotMergeUsers];
},
},
methods: {
assignSelf() {
this.$emit('assign-self');
},
},
};
</script>
<template>
<div>
<collapsed-reviewer-list :users="sortedReviewers" :issuable-type="issuableType" />
<div class="value hide-collapsed">
<template v-if="hasNoUsers">
<span class="assign-yourself no-value qa-assign-yourself">
{{ __('None') }}
</span>
</template>
<uncollapsed-reviewer-list
v-else
:users="sortedReviewers"
:root-path="rootPath"
:issuable-type="issuableType"
/>
</div>
</div>
</template>

View file

@ -0,0 +1,107 @@
<script>
// NOTE! For the first iteration, we are simply copying the implementation of Assignees
// It will soon be overhauled in Issue https://gitlab.com/gitlab-org/gitlab/-/issues/233736
import { deprecatedCreateFlash as Flash } from '~/flash';
import eventHub from '~/sidebar/event_hub';
import Store from '~/sidebar/stores/sidebar_store';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import ReviewerTitle from './reviewer_title.vue';
import Reviewers from './reviewers.vue';
import { __ } from '~/locale';
export default {
name: 'SidebarReviewers',
components: {
ReviewerTitle,
Reviewers,
},
mixins: [glFeatureFlagsMixin()],
props: {
mediator: {
type: Object,
required: true,
},
field: {
type: String,
required: true,
},
signedIn: {
type: Boolean,
required: false,
default: false,
},
issuableType: {
type: String,
required: false,
default: 'issue',
},
issuableIid: {
type: String,
required: true,
},
projectPath: {
type: String,
required: true,
},
},
data() {
return {
store: new Store(),
loading: false,
};
},
created() {
this.removeReviewer = this.store.removeReviewer.bind(this.store);
this.addReviewer = this.store.addReviewer.bind(this.store);
this.removeAllReviewers = this.store.removeAllReviewers.bind(this.store);
// Get events from deprecatedJQueryDropdown
eventHub.$on('sidebar.removeReviewer', this.removeReviewer);
eventHub.$on('sidebar.addReviewer', this.addReviewer);
eventHub.$on('sidebar.removeAllReviewers', this.removeAllReviewers);
eventHub.$on('sidebar.saveReviewers', this.saveReviewers);
},
beforeDestroy() {
eventHub.$off('sidebar.removeReviewer', this.removeReviewer);
eventHub.$off('sidebar.addReviewer', this.addReviewer);
eventHub.$off('sidebar.removeAllReviewers', this.removeAllReviewers);
eventHub.$off('sidebar.saveReviewers', this.saveReviewers);
},
methods: {
saveReviewers() {
this.loading = true;
this.mediator
.saveReviewers(this.field)
.then(() => {
this.loading = false;
// Uncomment once this issue has been addressed > https://gitlab.com/gitlab-org/gitlab/-/issues/237922
// refreshUserMergeRequestCounts();
})
.catch(() => {
this.loading = false;
return new Flash(__('Error occurred when saving reviewers'));
});
},
},
};
</script>
<template>
<div>
<reviewer-title
:number-of-reviewers="store.reviewers.length"
:loading="loading || store.isFetching.reviewers"
:editable="store.editable"
:show-toggle="!signedIn"
/>
<reviewers
v-if="!store.isFetching.reviewers"
:root-path="store.rootPath"
:users="store.reviewers"
:editable="store.editable"
:issuable-type="issuableType"
class="value"
/>
</div>
</template>

View file

@ -0,0 +1,103 @@
<script>
// NOTE! For the first iteration, we are simply copying the implementation of Assignees
// It will soon be overhauled in Issue https://gitlab.com/gitlab-org/gitlab/-/issues/233736
import { __, sprintf } from '~/locale';
import ReviewerAvatarLink from './reviewer_avatar_link.vue';
const DEFAULT_RENDER_COUNT = 5;
export default {
components: {
ReviewerAvatarLink,
},
props: {
users: {
type: Array,
required: true,
},
rootPath: {
type: String,
required: true,
},
issuableType: {
type: String,
required: false,
default: 'issue',
},
},
data() {
return {
showLess: true,
};
},
computed: {
firstUser() {
return this.users[0];
},
hasOneUser() {
return this.users.length === 1;
},
hiddenReviewersLabel() {
const { numberOfHiddenReviewers } = this;
return sprintf(__('+ %{numberOfHiddenReviewers} more'), { numberOfHiddenReviewers });
},
renderShowMoreSection() {
return this.users.length > DEFAULT_RENDER_COUNT;
},
numberOfHiddenReviewers() {
return this.users.length - DEFAULT_RENDER_COUNT;
},
uncollapsedUsers() {
const uncollapsedLength = this.showLess
? Math.min(this.users.length, DEFAULT_RENDER_COUNT)
: this.users.length;
return this.showLess ? this.users.slice(0, uncollapsedLength) : this.users;
},
username() {
return `@${this.firstUser.username}`;
},
},
methods: {
toggleShowLess() {
this.showLess = !this.showLess;
},
},
};
</script>
<template>
<reviewer-avatar-link
v-if="hasOneUser"
#default="{ user }"
tooltip-placement="left"
:tooltip-has-name="false"
:user="firstUser"
:root-path="rootPath"
:issuable-type="issuableType"
>
<div class="ml-2">
<span class="author"> {{ user.name }} </span>
<span class="username"> {{ username }} </span>
</div>
</reviewer-avatar-link>
<div v-else>
<div class="user-list">
<div v-for="user in uncollapsedUsers" :key="user.id" class="user-item">
<reviewer-avatar-link :user="user" :root-path="rootPath" :issuable-type="issuableType" />
</div>
</div>
<div v-if="renderShowMoreSection" class="user-list-more">
<button
type="button"
class="btn-link"
data-qa-selector="more_reviewers_link"
@click="toggleShowLess"
>
<template v-if="showLess">
{{ hiddenReviewersLabel }}
</template>
<template v-else>{{ __('- show less') }}</template>
</button>
</div>
</div>
</template>

View file

@ -5,6 +5,7 @@ import Vuex from 'vuex';
import SidebarTimeTracking from './components/time_tracking/sidebar_time_tracking.vue';
import SidebarAssignees from './components/assignees/sidebar_assignees.vue';
import SidebarLabels from './components/labels/sidebar_labels.vue';
import SidebarReviewers from './components/reviewers/sidebar_reviewers.vue';
import ConfidentialIssueSidebar from './components/confidential/confidential_issue_sidebar.vue';
import SidebarMoveIssue from './lib/sidebar_move_issue';
import IssuableLockForm from './components/lock/issuable_lock_form.vue';
@ -56,6 +57,36 @@ function mountAssigneesComponent(mediator) {
});
}
function mountReviewersComponent(mediator) {
const el = document.getElementById('js-vue-sidebar-reviewers');
const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(),
});
if (!el) return;
const { iid, fullPath } = getSidebarOptions();
// eslint-disable-next-line no-new
new Vue({
el,
apolloProvider,
components: {
SidebarReviewers,
},
render: createElement =>
createElement('sidebar-reviewers', {
props: {
mediator,
issuableIid: String(iid),
projectPath: fullPath,
field: el.dataset.field,
signedIn: el.hasAttribute('data-signed-in'),
issuableType: isInIssuePage() ? 'issue' : 'merge_request',
},
}),
});
}
export function mountSidebarLabels() {
const el = document.querySelector('.js-sidebar-labels');
@ -245,6 +276,7 @@ function mountSeverityComponent() {
export function mountSidebar(mediator) {
mountAssigneesComponent(mediator);
mountReviewersComponent(mediator);
mountConfidentialComponent(mediator);
mountLockComponent();
mountParticipantsComponent(mediator);

View file

@ -58,6 +58,8 @@ const applyToElements = (elements, handler) => toArray(elements).forEach(handler
const invokeBootstrapApi = (elements, method) => {
if (isFunction(elements.tooltip)) {
elements.tooltip(method);
} else {
jQuery(elements).tooltip(method);
}
};

View file

@ -3,6 +3,7 @@ import $ from 'jquery';
import { GlButton } from '@gitlab/ui';
import { __ } from '~/locale';
import { deprecatedCreateFlash as createFlash } from '~/flash';
import MergeRequest from '~/merge_request';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import mergeRequestQueryVariablesMixin from '../../mixins/merge_request_query_variables';
import getStateQuery from '../../queries/get_state.query.graphql';
@ -128,8 +129,7 @@ export default {
.then(res => res.data)
.then(data => {
eventHub.$emit('UpdateWidgetData', data);
createFlash(__('The merge request can now be merged.'), 'notice');
$('.merge-request .detail-page-description .title').text(this.mr.title);
MergeRequest.toggleDraftStatus(this.mr.title, true);
})
.catch(() => {
this.isMakingRequest = false;

View file

@ -1,6 +1,7 @@
<script>
import { mapState, mapGetters, mapActions } from 'vuex';
import { GlLoadingIcon, GlButton, GlSearchBoxByType, GlLink } from '@gitlab/ui';
import fuzzaldrinPlus from 'fuzzaldrin-plus';
import { UP_KEY_CODE, DOWN_KEY_CODE, ENTER_KEY_CODE, ESC_KEY_CODE } from '~/lib/utils/keycodes';
import SmartVirtualList from '~/vue_shared/components/smart_virtual_list.vue';
@ -39,9 +40,9 @@ export default {
...mapGetters(['selectedLabelsList', 'isDropdownVariantSidebar', 'isDropdownVariantEmbedded']),
visibleLabels() {
if (this.searchKey) {
return this.labels.filter(label =>
label.title.toLowerCase().includes(this.searchKey.toLowerCase()),
);
return fuzzaldrinPlus.filter(this.labels, this.searchKey, {
key: ['title'],
});
}
return this.labels;
},

View file

@ -417,12 +417,6 @@
}
}
@include media-breakpoint-down(xs) {
.btn-wide-on-xs {
width: 100%;
}
}
.btn-blank {
padding: 0;
background: transparent;

View file

@ -819,7 +819,6 @@ $pipeline-dropdown-line-height: 20px;
$pipeline-dropdown-status-icon-size: 18px;
$ci-action-dropdown-button-size: 24px;
$ci-action-dropdown-svg-size: 12px;
$pipelines-table-header-height: 40px;
/*
CI variable lists

View file

@ -117,7 +117,8 @@
}
}
.assignee {
.assignee,
.reviewer {
.merge-icon {
color: $orange-400;
position: absolute;

View file

@ -26,10 +26,6 @@
}
.pipelines {
.negative-margin-top {
margin-top: -$pipelines-table-header-height;
}
.stage {
max-width: 90px;
width: 90px;

View file

@ -21,11 +21,13 @@ module MultipleBoardsActions
end
def create
board = Boards::CreateService.new(parent, current_user, board_params).execute
response = Boards::CreateService.new(parent, current_user, board_params).execute
respond_to do |format|
format.json do
if board.persisted?
board = response.payload
if response.success?
extra_json = { board_path: board_path(board) }
render json: serialize_as_json(board).merge(extra_json)
else

View file

@ -35,6 +35,7 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont
:source_branch,
:source_project_id,
:state_event,
:wip_event,
:squash,
:target_branch,
:target_project_id,

View file

@ -342,6 +342,12 @@ module IssuablesHelper
issuable.closed? ^ should_inverse ? reopen_issuable_path(issuable) : close_issuable_path(issuable)
end
def toggle_draft_issuable_path(issuable)
wip_event = issuable.work_in_progress? ? 'unwip' : 'wip'
issuable_path(issuable, { merge_request: { wip_event: wip_event } })
end
def issuable_path(issuable, *options)
polymorphic_path(issuable, *options)
end

View file

@ -204,8 +204,13 @@ class CommitStatus < ApplicationRecord
# 'rspec:linux: 1/10' => 'rspec:linux'
common_name = name.to_s.gsub(%r{\d+[\s:\/\\]+\d+\s*}, '')
# 'rspec:linux: [aws, max memory]' => 'rspec:linux'
common_name.gsub!(%r{: \[.*, .*\]\s*\z}, '')
if ::Gitlab::Ci::Features.one_dimensional_matrix_enabled?
# 'rspec:linux: [aws, max memory]' => 'rspec:linux', 'rspec:linux: [aws]' => 'rspec:linux'
common_name.gsub!(%r{: \[.*\]\s*\z}, '')
else
# 'rspec:linux: [aws, max memory]' => 'rspec:linux', 'rspec:linux: [aws]' => 'rspec:linux: [aws]'
common_name.gsub!(%r{: \[.*, .*\]\s*\z}, '')
end
common_name.strip!
common_name

View file

@ -1384,8 +1384,6 @@ class MergeRequest < ApplicationRecord
end
def has_coverage_reports?
return false unless Feature.enabled?(:coverage_report_view, project, default_enabled: true)
actual_head_pipeline&.has_coverage_reports?
end

View file

@ -37,7 +37,7 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated
end
def remove_wip_path
if work_in_progress? && can?(current_user, :update_merge_request, merge_request.project)
if can?(current_user, :update_merge_request, merge_request.project)
remove_wip_project_merge_request_path(project, merge_request)
end
end

View file

@ -1,6 +1,7 @@
# frozen_string_literal: true
class MergeRequestBasicEntity < Grape::Entity
expose :title
expose :public_merge_status, as: :merge_status
expose :merge_error
expose :state

View file

@ -3,7 +3,11 @@
module Boards
class CreateService < Boards::BaseService
def execute
create_board! if can_create_board?
unless can_create_board?
return ServiceResponse.error(message: "You don't have the permission to create a board for this resource.")
end
create_board!
end
private
@ -15,12 +19,16 @@ module Boards
def create_board!
board = parent.boards.create(params)
if board.persisted?
board.lists.create(list_type: :backlog)
board.lists.create(list_type: :closed)
unless board.persisted?
return ServiceResponse.error(message: "There was an error when creating a board.", payload: board)
end
board
board.tap do |created_board|
created_board.lists.create(list_type: :backlog)
created_board.lists.create(list_type: :closed)
end
ServiceResponse.success(payload: board)
end
end
end

View file

@ -3,7 +3,6 @@ module Ci
module Pipelines
class CreateArtifactService
def execute(pipeline)
return unless ::Gitlab::Ci::Features.coverage_report_view?(pipeline.project)
return unless pipeline.can_generate_coverage_reports?
return if pipeline.has_coverage_reports?

View file

@ -36,5 +36,3 @@
.form-actions
= f.submit _('Save changes'), class: "btn btn-success", data: { qa_selector: 'save_changes_button' }
= link_to _('Cancel'), admin_group_path(@group), class: "btn btn-cancel"
= render_if_exists 'ldap_group_links/ldap_syncrhonizations', group: @group

View file

@ -25,6 +25,6 @@
'secondary-action': s_('AdminUsers|Block user') } }
= s_('AdminUsers|You are about to permanently delete the user %{username}. This will delete all of the issues,
merge requests, and groups linked to them. To avoid data loss,
consider using the %{strong_start}block user%{strong_end} feature instead. Once you %{strong_start}Delete user%{strong_end},
consider using the %{strongStart}block user%{strongEnd} feature instead. Once you %{strongStart}Delete user%{strongEnd},
it cannot be undone or recovered.')

View file

@ -75,12 +75,12 @@
= javascript_include_tag locale_path unless I18n.locale == :en
= webpack_bundle_tag "sentry" if Gitlab.config.sentry.enabled
= webpack_bundle_tag 'performance_bar' if performance_bar_enabled?
- if content_for?(:page_specific_javascripts)
= yield :page_specific_javascripts
= webpack_controller_bundle_tags
= webpack_bundle_tag 'performance_bar' if performance_bar_enabled?
= webpack_bundle_tag "chrome_84_icon_fix" if browser.chrome?([">=84", "<84.0.4147.125"]) || browser.edge?([">=84", "<84.0.522.59"])
= yield :project_javascripts

View file

@ -32,16 +32,19 @@
%ul
- if can_update_merge_request
%li= link_to 'Edit', edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)
- unless current_user == @merge_request.author
%li= link_to 'Report abuse', new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request))
- if can_update_merge_request
- unless @merge_request.closed?
%li
= link_to @merge_request.work_in_progress? ? _('Mark as ready') : _('Mark as draft'), toggle_draft_issuable_path(@merge_request), method: :put, class: "js-draft-toggle-button"
%li{ class: [merge_request_button_visibility(@merge_request, true), 'js-close-item'] }
= link_to 'Close', merge_request_path(@merge_request, merge_request: { state_event: :close }), method: :put, title: 'Close merge request'
- if can_reopen_merge_request
%li{ class: merge_request_button_visibility(@merge_request, false) }
= link_to 'Reopen', merge_request_path(@merge_request, merge_request: { state_event: :reopen }), method: :put, class: 'reopen-mr-link', title: 'Reopen merge request'
- unless current_user == @merge_request.author
%li= link_to 'Report abuse', new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request))
- if can_update_merge_request
= link_to 'Edit', edit_project_merge_request_path(@project, @merge_request), class: "d-none d-sm-none d-md-block btn btn-grouped js-issuable-edit qa-edit-button"
= link_to 'Edit', edit_project_merge_request_path(@project, @merge_request), class: "d-none d-sm-none d-md-block btn gl-button btn-grouped js-issuable-edit qa-edit-button"
= render 'shared/issuable/close_reopen_button', issuable: @merge_request, can_update: can_update_merge_request, can_reopen: can_reopen_merge_request

View file

@ -5,7 +5,7 @@
- if defined? warn_before_close
- add_blocked_class = warn_before_close
- if is_current_user
- if is_current_user && !issuable.is_a?(MergeRequest)
- if can_update
%button{ class: "d-none d-sm-none d-md-block btn btn-grouped btn-close js-btn-issue-action #{issuable_button_visibility(issuable, true)} #{(add_blocked_class ? 'btn-issue-blocked' : '')}",
data: { remote: 'true', endpoint: close_issuable_path(issuable), qa_selector: 'close_issue_button' } }
@ -16,7 +16,10 @@
= _("Reopen %{display_issuable_type}") % { display_issuable_type: display_issuable_type }
- else
- if can_update && !are_close_and_open_buttons_hidden
= render 'shared/issuable/close_reopen_report_toggle', issuable: issuable, warn_before_close: add_blocked_class
- if issuable.is_a?(MergeRequest)
= render 'shared/issuable/close_reopen_draft_report_toggle', issuable: issuable
- else
= render 'shared/issuable/close_reopen_report_toggle', issuable: issuable, warn_before_close: add_blocked_class
- else
= link_to _('Report abuse'), new_abuse_report_path(user_id: issuable.author.id, ref_url: issuable_url(issuable)),
class: 'd-none d-sm-none d-md-block btn btn-grouped btn-close-color', title: _('Report abuse')

View file

@ -0,0 +1,37 @@
- display_issuable_type = issuable_display_type(issuable)
- button_action_class = issuable.closed? ? 'btn-default' : 'btn-warning btn-warning-secondary'
- button_class = "btn gl-button #{!issuable.closed? && 'js-draft-toggle-button'}"
- toggle_class = "btn gl-button dropdown-toggle"
.float-left.btn-group.gl-ml-3.issuable-close-dropdown.d-none.d-md-inline-flex.js-issuable-close-dropdown
= link_to issuable.closed? ? reopen_issuable_path(issuable) : toggle_draft_issuable_path(issuable), method: :put, class: "#{button_class} #{button_action_class}" do
- if issuable.closed?
= _('Reopen')
= display_issuable_type
- else
= issuable.work_in_progress? ? _('Mark as ready') : _('Mark as draft')
- if !issuable.closed? || !issuable_author_is_current_user(issuable)
= button_tag type: 'button', class: "#{toggle_class} #{button_action_class}", data: { 'toggle' => 'dropdown' } do
%span.sr-only= _('Toggle dropdown')
= sprite_icon "angle-down", size: 12
%ul.js-issuable-close-menu.dropdown-menu.dropdown-menu-right
- if issuable.open?
%li
= link_to close_issuable_path(issuable), method: :put do
.description
%strong.title
= _('Close')
= display_issuable_type
- unless issuable_author_is_current_user(issuable)
- unless issuable.closed?
%li.divider.droplab-item-ignore
%li.report-item
%a.report-abuse-link{ href: new_abuse_report_path(user_id: issuable.author.id, ref_url: issuable_url(issuable)) }
.description
%strong.title= _('Report abuse')
%p.text
= _('Report %{display_issuable_type} that are abusive, inappropriate or spam.') % { display_issuable_type: display_issuable_type.pluralize }

View file

@ -5,6 +5,7 @@
- signed_in = !!issuable_sidebar.dig(:current_user, :id)
- can_edit_issuable = issuable_sidebar.dig(:current_user, :can_edit)
- add_page_startup_api_call "#{issuable_sidebar[:issuable_json_path]}?serializer=sidebar_extras"
- reviewers = local_assigns.fetch(:reviewers, nil)
- if Feature.enabled?(:vue_issuable_sidebar, @project.group)
%aside#js-vue-issuable-sidebar{ data: { signed_in: signed_in,
@ -28,6 +29,10 @@
.block.assignee.qa-assignee-block
= render "shared/issuable/sidebar_assignees", issuable_sidebar: issuable_sidebar, assignees: assignees
- if Feature.enabled?(:merge_request_reviewers, @project) && reviewers
.block.reviewer.qa-reviewer-block
= render "shared/issuable/sidebar_reviewers", issuable_sidebar: issuable_sidebar, reviewers: reviewers
= render_if_exists 'shared/issuable/sidebar_item_epic', issuable_sidebar: issuable_sidebar
- if issuable_sidebar[:supports_milestone]

View file

@ -0,0 +1,5 @@
---
title: Remove coverage_report_view feature flag
merge_request: 43711
author: David Barr @davebarr
type: removed

View file

@ -0,0 +1,5 @@
---
title: Add fuzzy search support to labels dropdown
merge_request: 43969
author:
type: fixed

View file

@ -0,0 +1,5 @@
---
title: Fix verifying LFS uploads with GitHub
merge_request: 43852
author:
type: fixed

View file

@ -0,0 +1,5 @@
---
title: "Add Gitpod Spring Petclinic to Project Templates"
merge_request: 43319
author:
type: added

View file

@ -0,0 +1,5 @@
---
title: Fix Delete User dialog formatted strings
merge_request: 43871
author:
type: fixed

View file

@ -0,0 +1,5 @@
---
title: Update node-sass from 4.12.0 to 4.14.1
merge_request: 43808
author: Takuya Noguchi
type: other

View file

@ -0,0 +1,5 @@
---
title: Add index for project_id and sha to deployments table
merge_request: 43836
author:
type: performance

View file

@ -0,0 +1,5 @@
---
title: Adds button to update merge request draft status on merge request show page
merge_request: 43098
author:
type: added

View file

@ -0,0 +1,5 @@
---
title: Add internal API to download LFS objects
merge_request: 42161
author:
type: added

View file

@ -19,6 +19,7 @@
- auto_devops
- backup_restore
- behavior_analytics
- boards
- chatops
- cloud_native_installation
- cluster_cost_optimization
@ -61,15 +62,15 @@
- importers
- incident_management
- infrastructure_as_code
- insights
- instance_statistics
- integrations
- interactive_application_security_testing
- internationalization
- instance_statistics
- issue_tracking
- jenkins_importer
- jira_importer
- jupyter_notebooks
- kanban_boards
- kubernetes_management
- license_compliance
- live_preview
@ -82,6 +83,7 @@
- omnibus_package
- package_registry
- pages
- pipeline_authoring
- pki_management
- planning_analytics
- product_analytics

View file

@ -1,7 +1,7 @@
---
name: coverage_report_view
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21791
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/211410
group: 'group::verify testing'
name: one_dimensional_matrix
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42170
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/256062
type: development
default_enabled: true
group: group::pipeline authoring
default_enabled: false

View file

@ -0,0 +1,20 @@
# frozen_string_literal: true
# See https://docs.gitlab.com/ee/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class AddIndexOnProjectIdAndShaToDeployments < ActiveRecord::Migration[6.0]
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
INDEX_NAME = 'index_deployments_on_project_id_sha'
disable_ddl_transaction!
def up
add_concurrent_index :deployments, [:project_id, :sha], name: INDEX_NAME
end
def down
remove_concurrent_index_by_name(:deployments, INDEX_NAME)
end
end

View file

@ -0,0 +1 @@
45530bb3090d9e8df3a79f42a06b042e0c40f6e185078c6d79d7ec334175c7d5

View file

@ -20007,6 +20007,8 @@ CREATE INDEX index_deployments_on_project_id_and_status_and_created_at ON deploy
CREATE INDEX index_deployments_on_project_id_and_updated_at_and_id ON deployments USING btree (project_id, updated_at DESC, id DESC);
CREATE INDEX index_deployments_on_project_id_sha ON deployments USING btree (project_id, sha);
CREATE INDEX index_deployments_on_user_id_and_status_and_created_at ON deployments USING btree (user_id, status, created_at);
CREATE INDEX index_description_versions_on_epic_id ON description_versions USING btree (epic_id) WHERE (epic_id IS NOT NULL);

View file

@ -267,6 +267,7 @@ POST /groups/:id/epics
| `labels` | string | no | The comma separated list of labels |
| `description` | string | no | The description of the epic. Limited to 1,048,576 characters. |
| `confidential` | boolean | no | Whether the epic should be confidential |
| `created_at` | string | no | When the epic was created. Date time string, ISO 8601 formatted, for example `2016-03-11T03:45:40Z` . Requires administrator or project/group owner privileges ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/255309) in GitLab 13.5) |
| `start_date_is_fixed` | boolean | no | Whether start date should be sourced from `start_date_fixed` or from milestones (since 11.3) |
| `start_date_fixed` | string | no | The fixed start date of an epic (since 11.3) |
| `due_date_is_fixed` | boolean | no | Whether due date should be sourced from `due_date_fixed` or from milestones (since 11.3) |
@ -349,6 +350,7 @@ PUT /groups/:id/epics/:epic_iid
| `description` | string | no | The description of an epic. Limited to 1,048,576 characters. |
| `confidential` | boolean | no | Whether the epic should be confidential |
| `labels` | string | no | The comma separated list of labels |
| `updated_at` | string | no | When the epic was updated. Date time string, ISO 8601 formatted, for example `2016-03-11T03:45:40Z` . Requires administrator or project/group owner privileges ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/255309) in GitLab 13.5) |
| `start_date_is_fixed` | boolean | no | Whether start date should be sourced from `start_date_fixed` or from milestones (since 11.3) |
| `start_date_fixed` | string | no | The fixed start date of an epic (since 11.3) |
| `due_date_is_fixed` | boolean | no | Whether due date should be sourced from `due_date_fixed` or from milestones (since 11.3) |

View file

@ -3572,6 +3572,11 @@ job split into three separate jobs.
Use `matrix:` to configure different variables for jobs that are running in parallel.
There can be from 2 to 50 jobs.
In GitLab 13.5 and later, you can have one-dimensional matrices with a single job.
The ability to have one-dimensional matrices is [deployed behind a feature flag](../../user/feature_flags.md),
disabled by default. It's disabled on GitLab.com. To use it in a GitLab self-managed
instance, ask a GitLab administrator to [enable the `one_dimensional_matrix:` feature flag](../../administration/feature_flags.md). **(CORE-ONLY)**
Every job gets the same `CI_NODE_TOTAL` [environment variable](../variables/README.md#predefined-environment-variables) value, and a unique `CI_NODE_INDEX` value.
```yaml

View file

@ -110,15 +110,15 @@ SSH -- TCP 22 --> GitLabShell[GitLab Shell]
SMTP[SMTP Gateway]
Geo[GitLab Geo Node] -- TCP 22, 80, 443 --> NGINX
GitLabShell --TCP 8080 -->Unicorn["Unicorn (GitLab Rails)"]
GitLabShell --TCP 8080 -->Puma["Puma (GitLab Rails)"]
GitLabShell --> Praefect
Unicorn --> PgBouncer[PgBouncer]
Unicorn --> Redis
Unicorn --> Praefect
Puma --> PgBouncer[PgBouncer]
Puma --> Redis
Puma --> Praefect
Sidekiq --> Redis
Sidekiq --> PgBouncer
Sidekiq --> Praefect
GitLabWorkhorse[GitLab Workhorse] --> Unicorn
GitLabWorkhorse[GitLab Workhorse] --> Puma
GitLabWorkhorse --> Redis
GitLabWorkhorse --> Praefect
Praefect --> Gitaly
@ -126,7 +126,7 @@ NGINX --> GitLabWorkhorse
NGINX -- TCP 8090 --> GitLabPages[GitLab Pages]
NGINX --> Grafana[Grafana]
Grafana -- TCP 9090 --> Prometheus[Prometheus]
Prometheus -- TCP 80, 443 --> Unicorn
Prometheus -- TCP 80, 443 --> Puma
RedisExporter[Redis Exporter] --> Redis
Prometheus -- TCP 9121 --> RedisExporter
PostgreSQLExporter[PostgreSQL Exporter] --> PostgreSQL
@ -142,27 +142,27 @@ PgBouncer --> Consul
PostgreSQL --> Consul
PgBouncer --> PostgreSQL
NGINX --> Registry
Unicorn --> Registry
Puma --> Registry
NGINX --> Mattermost
Mattermost --- Unicorn
Mattermost --- Puma
Prometheus --> Alertmanager
Migrations --> PostgreSQL
Runner -- TCP 443 --> NGINX
Unicorn -- TCP 9200 --> Elasticsearch
Puma -- TCP 9200 --> Elasticsearch
Sidekiq -- TCP 9200 --> Elasticsearch
Sidekiq -- TCP 80, 443 --> Sentry
Unicorn -- TCP 80, 443 --> Sentry
Puma -- TCP 80, 443 --> Sentry
Sidekiq -- UDP 6831 --> Jaeger
Unicorn -- UDP 6831 --> Jaeger
Puma -- UDP 6831 --> Jaeger
Gitaly -- UDP 6831 --> Jaeger
GitLabShell -- UDP 6831 --> Jaeger
GitLabWorkhorse -- UDP 6831 --> Jaeger
Alertmanager -- TCP 25 --> SMTP
Sidekiq -- TCP 25 --> SMTP
Unicorn -- TCP 25 --> SMTP
Unicorn -- TCP 369 --> LDAP
Puma -- TCP 25 --> SMTP
Puma -- TCP 369 --> LDAP
Sidekiq -- TCP 369 --> LDAP
Unicorn -- TCP 443 --> ObjectStorage["Object Storage"]
Puma -- TCP 443 --> ObjectStorage["Object Storage"]
Sidekiq -- TCP 443 --> ObjectStorage
GitLabWorkhorse -- TCP 443 --> ObjectStorage
Registry -- TCP 443 --> ObjectStorage
@ -180,7 +180,7 @@ click Gitaly "./architecture.html#gitaly"
click Jaeger "./architecture.html#jaeger"
click GitLabWorkhorse "./architecture.html#gitlab-workhorse"
click LDAP "./architecture.html#ldap-authentication"
click Unicorn "./architecture.html#unicorn"
click Puma "./architecture.html#puma"
click GitLabShell "./architecture.html#gitlab-shell"
click SSH "./architecture.html#ssh-request-22"
click Sidekiq "./architecture.html#sidekiq"
@ -260,7 +260,7 @@ Table description links:
| [Runner](#gitlab-runner) | Executes GitLab CI/CD jobs | ⤓ | ✅ | ⚙ | ✅ | ⚙ | ⚙ | CE & EE |
| [Sentry integration](#sentry) | Error tracking for deployed apps | ⤓ | ⤓ | ⤓ | ⤓ | ⤓ | ⤓ | CE & EE |
| [Sidekiq](#sidekiq) | Background jobs processor | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | CE & EE |
| [Unicorn (GitLab Rails)](#unicorn) | Handles requests for the web interface and API | ✅ | ✅ | ✅ | ✅ | ⚙ | ✅ | CE & EE |
| [Puma (GitLab Rails)](#puma) | Handles requests for the web interface and API | ✅ | ✅ | ✅ | ✅ | ⚙ | ✅ | CE & EE |
### Component details
@ -427,13 +427,13 @@ GitLab CI/CD is the open-source continuous integration service included with Git
- [Project page](https://gitlab.com/gitlab-org/gitlab-workhorse/blob/master/README.md)
- Configuration:
- [Omnibus](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-config-template/gitlab.rb.template)
- [Charts](https://docs.gitlab.com/charts/charts/gitlab/unicorn/)
- [Charts](https://docs.gitlab.com/charts/charts/gitlab/webservice/)
- [Source](../install/installation.md#install-gitlab-workhorse)
- Layer: Core Service (Processor)
- Process: `gitlab-workhorse`
- GitLab.com: [Service Architecture](https://about.gitlab.com/handbook/engineering/infrastructure/production/architecture/#service-architecture)
[GitLab Workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse) is a program designed at GitLab to help alleviate pressure from Unicorn. You can read more about the [historical reasons for developing](https://about.gitlab.com/blog/2016/04/12/a-brief-history-of-gitlab-workhorse/). It's designed to act as a smart reverse proxy to help speed up GitLab as a whole.
[GitLab Workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse) is a program designed at GitLab to help alleviate pressure from Puma. You can read more about the [historical reasons for developing](https://about.gitlab.com/blog/2016/04/12/a-brief-history-of-gitlab-workhorse/). It's designed to act as a smart reverse proxy to help speed up GitLab as a whole.
#### Grafana
@ -663,8 +663,30 @@ For monitoring deployed apps, see the [Sentry integration docs](../operations/er
Sidekiq is a Ruby background job processor that pulls jobs from the Redis queue and processes them. Background jobs allow GitLab to provide a faster request/response cycle by moving work into the background.
#### Puma
NOTE: **Note:**
Starting with GitLab 13.0, Puma is the default web server and Unicorn has been
disabled by default.
- [Project page](https://gitlab.com/gitlab-org/gitlab/blob/master/README.md)
- Configuration:
- [Omnibus](https://docs.gitlab.com/omnibus/settings/puma.html)
- [Charts](https://docs.gitlab.com/charts/charts/gitlab/webservice/)
- [Source](../install/installation.md#configure-it)
- [GDK](https://gitlab.com/gitlab-org/gitlab/blob/master/config/gitlab.yml.example)
- Layer: Core Service (Processor)
- Process: `puma`
- GitLab.com: [Puma](../user/gitlab_com/index.md#puma)
[Puma](https://puma.io/) is a Ruby application server that is used to run the core Rails Application that provides the user facing features in GitLab. Often process output you will see this as `bundle` or `config.ru` depending on the GitLab version.
#### Unicorn
NOTE: **Note:**
Starting with GitLab 13.0, Puma is the default web server and Unicorn has been
disabled by default.
- [Project page](https://gitlab.com/gitlab-org/gitlab/blob/master/README.md)
- Configuration:
- [Omnibus](https://docs.gitlab.com/omnibus/settings/unicorn.html)
@ -743,8 +765,8 @@ It's important to understand the distinction as some processes are used in both
When making a request to an HTTP Endpoint (think `/users/sign_in`) the request will take the following path through the GitLab Service:
- NGINX - Acts as our first line reverse proxy.
- GitLab Workhorse - This determines if it needs to go to the Rails application or somewhere else to reduce load on Unicorn.
- Unicorn - Since this is a web request, and it needs to access the application it will go to Unicorn.
- GitLab Workhorse - This determines if it needs to go to the Rails application or somewhere else to reduce load on Puma.
- Puma - Since this is a web request, and it needs to access the application it will go to Puma.
- PostgreSQL/Gitaly/Redis - Depending on the type of request, it may hit these services to store or retrieve data.
### GitLab Git request cycle
@ -883,12 +905,12 @@ ps aux | grep '^git'
GitLab has several components to operate. It requires a persistent database
(PostgreSQL) and Redis database, and uses Apache `httpd` or NGINX to proxypass
Unicorn. All these components should run as different system users to GitLab
Puma. All these components should run as different system users to GitLab
(for example, `postgres`, `redis`, and `www-data`, instead of `git`).
As the `git` user it starts Sidekiq and Unicorn (a simple Ruby HTTP server
As the `git` user it starts Sidekiq and Puma (a simple Ruby HTTP server
running on port `8080` by default). Under the GitLab user there are normally 4
processes: `unicorn_rails master` (1 process), `unicorn_rails worker`
processes: `puma master` (1 process), `puma cluster worker`
(2 processes), `sidekiq` (1 process).
### Repository access
@ -901,7 +923,7 @@ See the README for more information.
### Init scripts of the services
The GitLab init script starts and stops Unicorn and Sidekiq:
The GitLab init script starts and stops Puma and Sidekiq:
```plaintext
/etc/init.d/gitlab
@ -941,9 +963,9 @@ Usage: /etc/init.d/postgresql {start|stop|restart|reload|force-reload|status} [v
### Log locations of the services
GitLab (includes Unicorn and Sidekiq logs):
GitLab (includes Puma and Sidekiq logs):
- `/home/git/gitlab/log/` contains `application.log`, `production.log`, `sidekiq.log`, `unicorn.stdout.log`, `git_json.log` and `unicorn.stderr.log` normally.
- `/home/git/gitlab/log/` contains `application.log`, `production.log`, `sidekiq.log`, `puma.stdout.log`, `git_json.log` and `puma.stderr.log` normally.
GitLab Shell:
@ -978,7 +1000,7 @@ GitLab has configuration files located in `/home/git/gitlab/config/*`. Commonly
configuration files include:
- `gitlab.yml` - GitLab configuration
- `unicorn.rb` - Unicorn web server settings
- `puma.rb` - Puma web server settings
- `database.yml` - Database connection settings
GitLab Shell has a configuration file at `/home/git/gitlab-shell/config.yml`.

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_ce_to_ee.md
---
This document was moved to [another location](upgrading_from_ce_to_ee.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

View file

@ -1,5 +0,0 @@
---
redirect_to: upgrading_from_source.md
---
This document was moved to [another location](upgrading_from_source.md).

Some files were not shown because too many files have changed in this diff Show more