Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
635d82b15d
commit
a27b8a5c10
265 changed files with 2756 additions and 2025 deletions
|
@ -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'
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
},
|
||||
|
|
|
@ -417,12 +417,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
@include media-breakpoint-down(xs) {
|
||||
.btn-wide-on-xs {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-blank {
|
||||
padding: 0;
|
||||
background: transparent;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -117,7 +117,8 @@
|
|||
}
|
||||
}
|
||||
|
||||
.assignee {
|
||||
.assignee,
|
||||
.reviewer {
|
||||
.merge-icon {
|
||||
color: $orange-400;
|
||||
position: absolute;
|
||||
|
|
|
@ -26,10 +26,6 @@
|
|||
}
|
||||
|
||||
.pipelines {
|
||||
.negative-margin-top {
|
||||
margin-top: -$pipelines-table-header-height;
|
||||
}
|
||||
|
||||
.stage {
|
||||
max-width: 90px;
|
||||
width: 90px;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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?
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.')
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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 }
|
|
@ -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]
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Remove coverage_report_view feature flag
|
||||
merge_request: 43711
|
||||
author: David Barr @davebarr
|
||||
type: removed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add fuzzy search support to labels dropdown
|
||||
merge_request: 43969
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Fix verifying LFS uploads with GitHub
|
||||
merge_request: 43852
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: "Add Gitpod Spring Petclinic to Project Templates"
|
||||
merge_request: 43319
|
||||
author:
|
||||
type: added
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Fix Delete User dialog formatted strings
|
||||
merge_request: 43871
|
||||
author:
|
||||
type: fixed
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Update node-sass from 4.12.0 to 4.14.1
|
||||
merge_request: 43808
|
||||
author: Takuya Noguchi
|
||||
type: other
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add index for project_id and sha to deployments table
|
||||
merge_request: 43836
|
||||
author:
|
||||
type: performance
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Adds button to update merge request draft status on merge request show page
|
||||
merge_request: 43098
|
||||
author:
|
||||
type: added
|
5
changelogs/unreleased/sh-lfs-smudge-api.yml
Normal file
5
changelogs/unreleased/sh-lfs-smudge-api.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add internal API to download LFS objects
|
||||
merge_request: 42161
|
||||
author:
|
||||
type: added
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
1
db/schema_migrations/20200930131343
Normal file
1
db/schema_migrations/20200930131343
Normal file
|
@ -0,0 +1 @@
|
|||
45530bb3090d9e8df3a79f42a06b042e0c40f6e185078c6d79d7ec334175c7d5
|
|
@ -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);
|
||||
|
|
|
@ -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) |
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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`.
|
||||
|
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
redirect_to: upgrading_from_source.md
|
||||
---
|
||||
|
||||
This document was moved to [another location](upgrading_from_source.md).
|
|
@ -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
Loading…
Reference in a new issue